diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 00030cde..74d23155 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -71,7 +71,7 @@ lint_staged_files() { local lint_failed=0 for file in "${files[@]}"; do - if ! run_swiftlint "$target_dir" lint --strict --quiet "${config_args[@]}" "${baseline_args[@]}" --path "$file"; then + if ! run_swiftlint "$target_dir" lint --strict --quiet "${config_args[@]}" "${baseline_args[@]}" "$file"; then echo " ↳ ❌ $file" lint_failed=1 fi @@ -92,7 +92,11 @@ if [ "$SWIFTLINT_MODE" != "none" ]; then STAGED_SWIFT_FILES=$(git diff --cached --name-only --diff-filter=ACM 2>/dev/null | grep '\.swift$' || true) if [ -n "$STAGED_SWIFT_FILES" ]; then - readarray -t STAGED_SWIFT_FILES_ARRAY <<< "$STAGED_SWIFT_FILES" + # Build array (bash 3.2 compatible) + STAGED_SWIFT_FILES_ARRAY=() + while IFS= read -r line; do + [ -n "$line" ] && STAGED_SWIFT_FILES_ARRAY+=("$line") + done <<< "$STAGED_SWIFT_FILES" MAIN_FILES=() FOUNDATIONUI_FILES=() diff --git a/.gitignore b/.gitignore index e1392d2f..60850b7e 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ htmlcov/ # Auto-generated PDD reports DOCS/TODO_REPORT.md +DOCS/.obsidian 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/DOCS/TASK_ARCHIVE/01_A2_Configure_CI_Pipeline/A2_Configure_CI_Pipeline_metrics.json b/DOCS/TASK_ARCHIVE/01_A2_Configure_CI_Pipeline/A2_Configure_CI_Pipeline_metrics.json new file mode 100644 index 00000000..d309a08a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/01_A2_Configure_CI_Pipeline/A2_Configure_CI_Pipeline_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/01_A2_Configure_CI_Pipeline/A2_Configure_CI_Pipeline.md", + "n_spec": 9, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish an automated GitHub Actions workflow that builds and tests the ISOInspector Swift package on every pull request so regressions are blocked before merge.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Workflow triggers on pull requests to the default branch.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Jobs execute swift test (and swift build if separated) against all targets without manual intervention.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Workflow fails the PR when tests fail.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Basic caching or toolchain version pinning prevents unnecessary redownloads (optional but recommended for stability).", + "source_line": null + }, + { + "type": "invariant", + "description": "CI must run on pull requests and gate merges on failures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use swift-actions/setup-swift for toolchain installation to match Linux container environment.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Start with Ubuntu runners; macOS jobs optional later.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Surface build logs via --enable-test-discovery default behavior; attach artifacts only if job logs become unwieldy.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "GitHub Actions CI Workflow", + "description": "Automated workflow that builds and tests the ISOInspector Swift package on every pull request to ensure regressions are blocked before merge.", + "source_line": null + }, + { + "name": "Swift Toolchain Setup Step", + "description": "Installs a specific Swift toolchain (5.9+) using swift-actions/setup-swift for consistent build environment.", + "source_line": null + }, + { + "name": "Source Code Checkout Step", + "description": "Checks out repository code into the workflow runner.", + "source_line": null + }, + { + "name": "Dependency Caching Step", + "description": "Caches the .build directory and other dependencies to speed up subsequent runs.", + "source_line": null + }, + { + "name": "Build Job/Step", + "description": "Executes swift build on all package targets, optionally separated from test execution.", + "source_line": null + }, + { + "name": "Test Job/Step", + "description": "Runs swift test against all package targets, capturing failures for PR status checks.", + "source_line": null + }, + { + "name": "Status Check Configuration", + "description": "Configures required status checks so that the pull request fails if CI jobs fail.", + "source_line": null + }, + { + "name": "Artifact Logging Step", + "description": "Captures and surfaces build/test logs as workflow artifacts or console output for debugging.", + "source_line": null + }, + { + "name": "Linting Stub Step", + "description": "Optional placeholder step with TODO comments for future linting/static analysis integration.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2948, + "line_count": 43 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_2025-10-04_Summary_metrics.json b/DOCS/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_2025-10-04_Summary_metrics.json new file mode 100644 index 00000000..e14b8de2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_2025-10-04_Summary_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_2025-10-04_Summary.md", + "n_spec": 6, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a file reader that can read large files in configurable chunks without loading the entire file into memory.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expose chunk-aligned caching to improve read performance for repeated accesses within the same chunk.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The reader must support a default chunk size of 1 MiB, but allow configuration of different chunk sizes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reads spanning multiple chunks must return correct data without errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The reader should read sequentially and cross\u2011chunk spans correctly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "In order to\u00a0the\u00a0\u2026?\u00a0..??", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomAccessReader protocol", + "description": "Defines an interface for random-access reading of data streams.", + "source_line": null + }, + { + "name": "ChunkedFileReader implementation", + "description": "Provides buffered file reading with configurable chunk sizes and chunk-aligned caching.", + "source_line": null + }, + { + "name": "Configurable chunk size feature", + "description": "Allows setting a custom chunk size, defaulting to 1 MiB.", + "source_line": null + }, + { + "name": "Chunk-aligned caching mechanism", + "description": "Caches data in chunks aligned to the configured chunk boundary for efficient access.", + "source_line": null + }, + { + "name": "IO error propagation with context", + "description": "Propagates underlying IO errors while adding contextual information.", + "source_line": null + }, + { + "name": "XCTest coverage suite", + "description": "Automated tests covering sequential reads, cross-chunk spans, arbitrary offset seeks, EOF partial reads, out-of-bounds validation, and injected IO failure scenarios.", + "source_line": null + }, + { + "name": "Error taxonomy (ChunkedFileReader.Error)", + "description": "Defines specific error types for IO edge cases to guide upstream pipeline handling.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 990, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_Chunked_File_Reader_metrics.json b/DOCS/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_Chunked_File_Reader_metrics.json new file mode 100644 index 00000000..7c60e01b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_Chunked_File_Reader_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/01_B1_Chunked_File_Reader/B1_Chunked_File_Reader.md", + "n_spec": 12, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build a streaming file reader that allows large ISO BMFF assets to be parsed without loading entire files into memory.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expose buffered sequential reads with configurable chunk size (default 1 MiB) while supporting seeking to arbitrary offsets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide safe handling for end-of-file, partial reads, and IO errors with explicit error types.", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate with Swift concurrency primitives when helpful but keep synchronous API available for parser pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reader streams 1 MiB chunks (configurable) without excessive memory allocations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests cover EOF, seek, and error paths per Execution Workplan.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "API aligns with PRD Section 2.1 (File IO) requiring random-access reads and accurate file length.", + "source_line": null + }, + { + "type": "invariant", + "description": "Buffered reads reuse storage and do not retain entire file contents.", + "source_line": null + }, + { + "type": "invariant", + "description": "Abstract file handles so platform differences are handled via conditional compilation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define RandomAccessReader protocol covering length and offset-based read semantics derived from PRD File IO requirements.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement concrete reader backed by FileHandle with chunked buffer reuse, caching, and bounds checking.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Write XCTest cases for sequential and spanning chunk reads, seeking, EOF partial chunk, and injected read errors.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomAccessReader Protocol", + "description": "Defines length and offset-based read semantics for random-access file reading.", + "source_line": null + }, + { + "name": "ChunkedFileReader Implementation", + "description": "Concrete reader backed by FileHandle that streams configurable chunk sizes (default 1\u202fMiB) with buffer reuse, caching, and bounds checking.", + "source_line": null + }, + { + "name": "Buffered Sequential Read API", + "description": "Exposes buffered sequential reads with configurable chunk size while supporting seeking to arbitrary offsets.", + "source_line": null + }, + { + "name": "AsyncSequence Wrapper", + "description": "Optional Swift concurrency wrapper providing async iteration over file chunks.", + "source_line": null + }, + { + "name": "Error Handling Types", + "description": "Explicit error types for EOF, partial reads, and IO failures.", + "source_line": null + }, + { + "name": "Unit Test Suite", + "description": "Tests covering sequential reads, multi\u2011chunk spans, seeks, EOF handling, out\u2011of\u2011bounds requests, and injected read errors.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2541, + "line_count": 34 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder_Summary_metrics.json b/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder_Summary_metrics.json new file mode 100644 index 00000000..7de645bf --- /dev/null +++ b/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder_Summary_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder_Summary.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide big-endian decoding helpers for RandomAccessReader to support 32-bit, 64-bit, and FourCC values with error reporting on short reads.", + "source_line": null + }, + { + "type": "user_story", + "description": "Introduce a FourCharCode value type and BoxHeader model representing header metadata including payload range and optional UUID.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement BoxHeaderDecoder.readHeader to handle standard, largesize, uuid, and zero-sized boxes while validating parent/file bounds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Decoding helpers must report an error when the read length is shorter than required for 32-bit, 64-bit, or FourCC values.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxHeaderDecoder.readHeader must correctly parse standard boxes with size and type fields.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxHeaderDecoder.readHeader must parse large-size boxes (i.e.,\u00a0large size field).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Box-uuid\u2011tapped?..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Big-endian decoding helpers", + "description": "Provides methods in RandomAccessReader to decode 32-bit, 64-bit, and FourCC values from big-endian byte streams with error handling for short reads.", + "source_line": null + }, + { + "name": "FourCharCode value type", + "description": "Defines a value type representing a FourCC (four-character code) used in box headers.", + "source_line": null + }, + { + "name": "BoxHeader model", + "description": "Represents metadata of a box header including size, type, optional UUID, and payload range within the file.", + "source_line": null + }, + { + "name": "BoxHeaderDecoder.readHeader method", + "description": "Decodes a box header from a RandomAccessReader, handling standard, largesize, uuid, and zero-sized boxes while validating bounds against parent or file limits.", + "source_line": null + }, + { + "name": "XCTest suite for Box Header Decoder", + "description": "Unit tests covering nominal and malformed headers, as well as helper behavior for decoding functions.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 746, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder_metrics.json b/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder_metrics.json new file mode 100644 index 00000000..6c9d66a3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/02_B2_Box_Header_Decoder/B2_Box_Header_Decoder.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Develop a reusable header decoding layer for ISO BMFF boxes that downstream parsers can rely on consistent metadata (size, type, offsets, uuid) derived from buffered IO provided by RandomAccessReader.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Decoding supports size32, largesize64, and optional uuid fields with accurate header size computation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Handles size == 0 semantics (extends to parent/end-of-file) without unsafe assumptions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Raises descriptive errors on truncated buffers, overflow, or invalid combinations while keeping parser state consistent.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "XCTest suite covers 32-bit, 64-bit, and uuid boxes plus malformed scenarios per Execution Workplan Task B2.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend RandomAccessReader with big-endian helpers for 32-bit/64-bit integers and FourCC decoding required by ISO BMFF headers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement a header decoding API that reads 32-bit, 64-bit (largesize), and uuid variants while validating forward progress and parent bounds.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Surface structured errors for malformed headers aligned with PRD validation requirements.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide unit tests covering standard, extended, and malformed headers using in-memory reader stubs or fixtures.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomAccessReader Big-Endian Helpers", + "description": "Provides methods to read big-endian u16, u32, u64 integers and FourCC strings from a buffered reader.", + "source_line": null + }, + { + "name": "BoxHeader Model", + "description": "Represents an ISO BMFF box header with fields for offset, payload range, header size, and optional UUID.", + "source_line": null + }, + { + "name": "Box Header Decoding API", + "description": "Reads and validates 32-bit, 64-bit (largesize), and uuid box headers from a RandomAccessReader, computing accurate header sizes and handling size==0 semantics.", + "source_line": null + }, + { + "name": "Structured Error Handling for Malformed Headers", + "description": "Raises descriptive errors for truncated reads, overflow, invalid combinations, and maintains parser state consistency.", + "source_line": null + }, + { + "name": "Unit Test Suite for Header Decoding", + "description": "Tests nominal 32-bit, large-size, uuid boxes and malformed scenarios using in-memory reader stubs or fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1872, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/next_tasks_metrics.json new file mode 100644 index 00000000..003ebcbd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/02_B2_Box_Header_Decoder/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/02_B2_Box_Header_Decoder/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 339, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B2_Plus_Streaming_Interface_Evaluation_metrics.json b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B2_Plus_Streaming_Interface_Evaluation_metrics.json new file mode 100644 index 00000000..5612e078 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B2_Plus_Streaming_Interface_Evaluation_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B2_Plus_Streaming_Interface_Evaluation.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expose an async streaming interface for ISOInspectorCore that allows higher parser layers to request progressive reads and react to parse events without blocking.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document a recommended async interface shape (e.g., AsyncSequence, AsyncThrowingStream, Combine publisher) with rationale covering concurrency guarantees, backpressure, and compatibility with SwiftUI/CLI consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provide a lightweight prototype or pseudocode demonstrating the interface integration with the existing ParsePipeline so it can emit ordered events that uphold PRD latency goals.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Capture consumer requirements (UI tree updates, CLI streaming) and note any additional dependencies or research items, ensuring no unresolved blockers remain before implementation proceeds.", + "source_line": null + }, + { + "type": "invariant", + "description": "The async stream must deliver events in order and propagate errors deterministically to consumers.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseEvent must be a Sendable value type to allow safe cross-actor transport.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Recommend exposing parser output as AsyncThrowingStream for natural Swift Concurrency integration, backpressure via demand-driven iteration, and deterministic failure propagation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "ParsePipeline acts as a factory for asynchronous event streams, keeping the reader abstraction injectable to allow future implementations with real RandomAccessReader instances or synthetic fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The async stream plugs into Task-driven ObservableObject reducers for SwiftUI tree updates and can be iterated over with for try await in CLI handlers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "AsyncThrowingStream interface", + "description": "Exposes parser output as an async throwing stream of ParseEvent objects for consumers such as SwiftUI and CLI.", + "source_line": null + }, + { + "name": "ParseEvent data type", + "description": "Sendable value type encapsulating box lifecycle data (offset, depth, entry/exit moments).", + "source_line": null + }, + { + "name": "ParsePipeline factory", + "description": "Creates asynchronous event streams from a reader abstraction, allowing injection of real or synthetic readers.", + "source_line": null + }, + { + "name": "ParsePipeline.live() method", + "description": "Drives the AsyncThrowingStream using BoxHeaderDecoder and context stack walker to emit entry/exit events per box boundary.", + "source_line": null + }, + { + "name": "Prototype stream builder", + "description": "Constructs deterministic test events in an AsyncThrowingStream for unit testing ordered delivery and error propagation.", + "source_line": null + }, + { + "name": "Unit tests for ParsePipelineInterface", + "description": "Exercise sequential consumption, error handling, and guarantee of ordered event delivery.", + "source_line": null + }, + { + "name": "SwiftUI tree update consumer pattern", + "description": "Uses Task-driven ObservableObject reducers that await events from the stream on the main actor.", + "source_line": null + }, + { + "name": "CLI streaming consumer pattern", + "description": "Iterates over the same stream with for try await to emit progress rows or structured JSON incrementally.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7100, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B3_Streaming_Parse_Pipeline_metrics.json b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B3_Streaming_Parse_Pipeline_metrics.json new file mode 100644 index 00000000..457bf3d5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B3_Streaming_Parse_Pipeline_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/B3_Streaming_Parse_Pipeline.md", + "n_spec": 10, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a streaming parse pipeline that reads MP4 boxes sequentially and emits typed parse events for downstream consumers such as UI, CLI, and validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing sample fixtures yields ordered parse events containing headers, offsets, and context metadata per specification.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Event stream maintains parent/child context via an explicit stack without recursion depth issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pipeline handles container traversal, size==0/1, and malformed structures by emitting validation hooks rather than crashing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "XCTest coverage proves deterministic event ordering and error handling across nominal and malformed inputs.", + "source_line": null + }, + { + "type": "invariant", + "description": "The context stack must always reflect the current hierarchy of parsed boxes, respecting declared payload boundaries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use RandomAccessReader and BoxHeaderDecoder from B1/B2 as foundation for reading headers and payload ranges.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define ParsePipeline that produces AsyncStream or Combine publisher for consumers; ensure thread safety with Swift concurrency primitives.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Maintain an explicit context stack/iterator to traverse container boxes without recursion, enforcing declared payload boundaries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate validation hooks for VR-001/VR-002, capturing issues in emitted events but allowing parsing to continue when possible.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomAccessReader", + "description": "Provides random access reading of MP4 file data for header and payload extraction.", + "source_line": null + }, + { + "name": "BoxHeaderDecoder", + "description": "Decodes MP4 box headers to determine type, size, and flags from the binary stream.", + "source_line": null + }, + { + "name": "ParsePipeline", + "description": "Orchestrates streaming parsing of MP4 boxes, emitting typed parse events as an AsyncStream or Combine publisher.", + "source_line": null + }, + { + "name": "AsyncParseEventStream", + "description": "Asynchronous stream of ParseEvent objects produced by ParsePipeline for downstream consumers.", + "source_line": null + }, + { + "name": "ContextStackManager", + "description": "Maintains an explicit stack of box contexts to enable parent/child traversal without recursion and enforce payload boundaries.", + "source_line": null + }, + { + "name": "ValidationHookHandler", + "description": "Captures validation errors (e.g., VR-001, VR-002) during parsing and emits them as part of the event stream while allowing continuation.", + "source_line": null + }, + { + "name": "ContainerTraversalEngine", + "description": "Iteratively traverses container boxes using the context stack to process nested structures.", + "source_line": null + }, + { + "name": "EventEmitter", + "description": "Emits parse events containing headers, offsets, and contextual metadata for each box.", + "source_line": null + }, + { + "name": "ErrorHandlingStrategy", + "description": "Defines how malformed structures are handled\u2014emit validation hooks instead of crashing.", + "source_line": null + }, + { + "name": "TestFixtureLoader", + "description": "Loads small MP4 samples and malformed header fixtures for testing the pipeline.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2034, + "line_count": 46 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/F1_Test_Fixtures_metrics.json b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/F1_Test_Fixtures_metrics.json new file mode 100644 index 00000000..2b04eeaf --- /dev/null +++ b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/F1_Test_Fixtures_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/F1_Test_Fixtures.md", + "n_spec": 7, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a curated collection of MP4/MOV sample files and supporting metadata for automated regression testing of parser, validators, and exporters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fixture corpus includes at least: standard MP4, fragmented MP4, MOV variant, DASH init/media segments, large mdat, and intentionally malformed headers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each fixture ships with machine-readable metadata (box inventory, expected warnings/errors, licensing notes) stored alongside the files for automated validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "swift test suites load fixtures without exceeding memory/time budgets and assert expected parse/validation outcomes for both success and failure cases.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation explains sourcing/licensing for every file and the process to refresh or regenerate fixtures.", + "source_line": null + }, + { + "type": "invariant", + "description": "Fixtures must be stored under Tests/ISOInspectorKitTests/Fixtures/ with checksum tracking so CI can verify integrity and detect drift.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define helper utilities (e.g., FixtureCatalog) that expose fixture metadata to tests and future benchmarks without hard-coding paths.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fixture Corpus Generation", + "description": "Create a curated set of MP4/MOV sample files covering nominal and malformed structures for regression testing.", + "source_line": null + }, + { + "name": "Metadata Packaging", + "description": "Generate machine-readable metadata (box inventory, expected warnings/errors, licensing notes) alongside each fixture file.", + "source_line": null + }, + { + "name": "Test Suite Integration", + "description": "Load fixtures into swift test suites, ensuring memory/time budgets are respected and validate parse/validation outcomes.", + "source_line": null + }, + { + "name": "Fixture Storage & Integrity", + "description": "Store fixtures under Tests/ISOInspectorKitTests/Fixtures/ with checksum tracking for CI integrity verification.", + "source_line": null + }, + { + "name": "Helper Utilities (FixtureCatalog)", + "description": "Provide programmatic access to fixture metadata and paths for tests and benchmarks without hard-coding.", + "source_line": null + }, + { + "name": "Synthetic Fixture Generation", + "description": "Generate synthetic MP4 structures using Bento4 or FFmpeg scripted in Python when real samples are unavailable.", + "source_line": null + }, + { + "name": "Documentation of Fixtures", + "description": "Document sourcing, licensing, and regeneration process for each fixture in DocC or Guides for cross-team visibility.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2487, + "line_count": 58 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..11158aee --- /dev/null +++ b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/Summary_of_Work.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "Async Streaming Interface for ParsePipeline", + "description": "Provides an asynchronous event stream of parsing events via AsyncThrowingStream, exposing structured box lifecycle metadata to consumers.", + "source_line": null + }, + { + "name": "ParseEvent Type", + "description": "Represents individual parsing events emitted by the ParsePipeline, encapsulating event data and metadata.", + "source_line": null + }, + { + "name": "Sendable Conformance for BoxHeader and FourCharCode", + "description": "Ensures that these primitive types can be safely used across actors in the async pipeline.", + "source_line": null + }, + { + "name": "Unit Tests for Ordered Event Delivery and Error Propagation", + "description": "Validates correct ordering of events and proper error handling in the ParsePipeline stream interface.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1589, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/next_tasks_metrics.json new file mode 100644 index 00000000..797bc6a9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/03_B2_Plus_Streaming_Interface_Evaluation/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 242, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/B3_ParsePipeline_Live_Streaming_metrics.json b/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/B3_ParsePipeline_Live_Streaming_metrics.json new file mode 100644 index 00000000..a0693ae0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/B3_ParsePipeline_Live_Streaming_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/B3_ParsePipeline_Live_Streaming.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement the real streaming pipeline so ParsePipeline.live() iterates through MP4 boxes using the async reader stack and emits ordered parse events for downstream consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline.live() produces an AsyncThrowingStream that walks the file via the configured RandomAccessReader, yielding willStartBox/didFinishBox events in document order with accurate offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Container traversal respects size boundaries and context stack semantics outlined in the technical spec to avoid infinite loops or mis-nested events.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming integration is validated with unit tests that feed synthetic readers and assert event ordering and error propagation, ensuring readiness for UI/CLI consumers.", + "source_line": null + }, + { + "type": "invariant", + "description": "RandomAccessReader implementations and BoxHeaderDecoder from B1/B2 must be reused to decode headers before emitting events; error handling forwards through the stream continuation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Model traversal with an explicit stack so containers emit paired start/finish events without recursion depth issues, matching the technical spec guidance.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use the existing ParsePipeline builder abstraction to keep the reader injectable for tests; replace the current placeholder continuation that immediately finishes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline.live()", + "description": "Produces an AsyncThrowingStream that iterates through MP4 boxes using the async reader stack and emits ordered parse events (willStartBox/didFinishBox) in document order with accurate offsets.", + "source_line": null + }, + { + "name": "AsyncThrowingStream event distribution", + "description": "Streams parsing events to downstream consumers such as UI or CLI integrations with low latency.", + "source_line": null + }, + { + "name": "RandomAccessReader integration", + "description": "Uses existing RandomAccessReader implementations to read file data during streaming traversal.", + "source_line": null + }, + { + "name": "BoxHeaderDecoder usage", + "description": "Decodes box headers before emitting start/finish events, forwarding any decoding errors through the stream continuation.", + "source_line": null + }, + { + "name": "Container traversal stack", + "description": "Manages container boxes with an explicit stack to emit paired start/finish events without recursion depth issues and respects size boundaries and context stack semantics.", + "source_line": null + }, + { + "name": "ParsePipeline builder abstraction", + "description": "Allows injection of different readers for testing and replaces placeholder continuations with real streaming logic.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3061, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/Summary_of_Work_metrics.json new file mode 100644 index 00000000..404e98e5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/Summary_of_Work_metrics.json @@ -0,0 +1,28 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/Summary_of_Work.md", + "n_spec": 2, + "n_func": 1, + "intent_atoms": [ + { + "type": "invariant", + "description": "The ParsePipeline.live() streaming parse pipeline must emit ordered willStartBox/didFinishBox events with accurate offsets for all MP4 boxes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover nested container traversal, large-size boxes, and error propagation to validate the live pipeline behavior.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline.live() streaming parse pipeline", + "description": "Provides a live streaming parse pipeline that traverses nested MP4 boxes using an explicit stack and emits ordered willStartBox/didFinishBox events with accurate offsets.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 548, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/next_tasks_metrics.json new file mode 100644 index 00000000..27c6c432 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/04_B3_ParsePipeline_Live_Streaming/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Complete Puzzle #1 by wiring ParsePipeline.live() to the real streaming walker so the async pipeline runs against concrete parsing logic.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 160, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/05_B3_Puzzle1_ParsePipeline_Live_Integration_metrics.json b/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/05_B3_Puzzle1_ParsePipeline_Live_Integration_metrics.json new file mode 100644 index 00000000..8b7a144d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/05_B3_Puzzle1_ParsePipeline_Live_Integration_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/05_B3_Puzzle1_ParsePipeline_Live_Integration.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement the production ParsePipeline.live() builder to drive the concrete streaming walker against a RandomAccessReader, emitting real ParseEvent values for downstream consumers instead of fixture stubs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline.live() returns an AsyncThrowingStream that iterates using the streaming walker, yielding willStartBox and didFinishBox events with accurate offsets for nested containers and mdat skips.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests cover at least one nested fixture and a large-size box to confirm ordering, depth accounting, and error propagation from the walker through the stream continuation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Cancellation and failure states from the walker terminate the stream cleanly, matching the concurrency guarantees promised in the technical spec and workplan acceptance criteria.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing automated tests (swift test) continue to pass after the integration, ensuring no regressions in prior B1/B2 functionality.", + "source_line": null + }, + { + "type": "invariant", + "description": "The pipeline must traverse MP4 boxes in document order, maintain a context stack, and surface validation hooks over an AsyncStream, respecting contracts from PRD and technical spec.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use RandomAccessReader protocol and helpers for header reads; walker logic uses bounded ranges when decoding sizes and UUID payloads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Maintain an explicit traversal stack mirroring the archived B3 solution so each container yields paired start/finish events without recursion depth issues.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Skip mdat payload bodies by advancing cursor to payload end while still emitting metadata events, satisfying streaming performance expectations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Surface walker errors (header decoding, boundary violations) by finishing the stream with a thrown error, and wire cancellation via Task.checkCancellation() to honor consumer backpressure.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline.live() builder", + "description": "Creates an AsyncThrowingStream that drives a streaming walker over a RandomAccessReader and emits ParseEvent values such as willStartBox and didFinishBox for each MP4 box in document order.", + "source_line": null + }, + { + "name": "AsyncThrowingStream of ParseEvent", + "description": "Provides a stream interface to downstream consumers, yielding events with accurate offsets for nested containers and mdat skips, while propagating errors and supporting cancellation.", + "source_line": null + }, + { + "name": "RandomAccessReader integration", + "description": "Uses the RandomAccessReader protocol to read box headers and payloads, ensuring bounded ranges when decoding sizes and UUID payloads during traversal.", + "source_line": null + }, + { + "name": "Traversal stack maintenance", + "description": "Maintains an explicit stack mirroring container hierarchy to emit paired start/finish events without recursion depth issues.", + "source_line": null + }, + { + "name": "mdat payload skipping", + "description": "Advances the cursor past mdat payload bodies while still emitting metadata events, enabling efficient streaming performance.", + "source_line": null + }, + { + "name": "Error handling and cancellation", + "description": "Surface walker errors by throwing through the stream continuation and wire Task.checkCancellation() to terminate cleanly on consumer backpressure or failure.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4172, + "line_count": 56 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..76bae5c9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/Summary_of_Work_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/Summary_of_Work.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement live streaming of parse events using a concrete StreamingBoxWalker", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refactor ParsePipeline.live() to drive the StreamingBoxWalker instead of previous implementation", + "source_line": null + } + ], + "functional_units": [ + { + "name": "StreamingBoxWalker", + "description": "Concrete implementation of a walker that traverses nested boxes in a streaming fashion", + "source_line": null + }, + { + "name": "ParsePipeline.live()", + "description": "Method that drives the StreamingBoxWalker to emit live streaming events from real walker logic", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 637, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/next_tasks_metrics.json new file mode 100644 index 00000000..d302f5eb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/05_B3_Puzzle1_ParsePipeline_Live_Integration/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Complete Puzzle #1 by wiring ParsePipeline.live() to the real streaming walker so the async pipeline runs against concrete parsing logic.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 160, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/B4_MP4RA_Metadata_Integration_metrics.json b/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/B4_MP4RA_Metadata_Integration_metrics.json new file mode 100644 index 00000000..b4607242 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/B4_MP4RA_Metadata_Integration_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/B4_MP4RA_Metadata_Integration.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Bundle and expose MP4RA box metadata so the streaming parse pipeline can label known boxes and flag unknown types for follow-up.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "MP4RA registry JSON (or generated data) is bundled or fetched and loaded by the core catalog during pipeline startup.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Known box events attach human-readable metadata (name, description, version flags) sourced from MP4RA.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unknown boxes trigger structured logging or research hooks without crashing parsing, satisfying VR-006 expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and integration tests cover catalog loading, lookup by FourCC/extended types, and fallback behavior.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create a BoxCatalog backed by MP4RA data; consider generating Swift structures from registry JSON for compile-time safety.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure catalog access is concurrency-safe since ParsePipeline operates asynchronously; use an actor or immutable structure.", + "source_line": null + }, + { + "type": "invariant", + "description": "The catalog must always be loaded before the pipeline emits events.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RA Catalog Loader", + "description": "Loads MP4RA registry JSON or generated data into the core catalog during pipeline startup", + "source_line": null + }, + { + "name": "Box Metadata Attacher", + "description": "Attaches human-readable metadata (name, description, version flags) to known box events emitted by the parse pipeline", + "source_line": null + }, + { + "name": "Unknown Box Logger", + "description": "Triggers structured logging or research hooks for unknown boxes without crashing parsing", + "source_line": null + }, + { + "name": "Catalog Lookup Service", + "description": "Provides lookup of box metadata by FourCC or extended type, concurrency-safe for async pipeline use", + "source_line": null + }, + { + "name": "Catalog Diagnostics Provider", + "description": "Offers diagnostics for missing or stale catalog entries and documentation for updating MP4RA data", + "source_line": null + }, + { + "name": "Unit and Integration Test Suite", + "description": "Tests covering catalog loading, lookup functionality, and fallback behavior for unknown boxes", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2507, + "line_count": 48 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..242033b5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/Summary_of_Work.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate MP4RA-backed BoxCatalog into ParsePipeline.live() so streaming events include metadata for known boxes and log unknown identifiers once per run.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "MP4RA Boxes are correctly decoded from bundled JSON fixture and cross-platform diagnostics support is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline live tests expanded to cover standard and UUID-based lookups of BoxCatalog.", + "source_line": null + }, + { + "type": "invariant", + "description": "Unknown identifiers are logged only once per run.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Bundled MP4RA JSON fixture and decoding infrastructure added with cross-platform diagnostics support.", + "source_line": null + }, + { + "type": "user_story", + "description": "Automate refreshing MP4RABoxes.json from upstream registry and document maintenance workflow via R1.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RA BoxCatalog Integration", + "description": "Integrates the MP4RA-backed BoxCatalog into ParsePipeline.live() to provide metadata for known boxes and logs unknown identifiers once per run.", + "source_line": null + }, + { + "name": "Bundled MP4RA JSON Fixture & Decoding Infrastructure", + "description": "Provides bundled MP4RA JSON fixture and decoding infrastructure with cross-platform diagnostics support.", + "source_line": null + }, + { + "name": "ParsePipeline Live Tests", + "description": "Expanded tests for ParsePipeline live functionality, including catalog lookups for standard and UUID-based boxes.", + "source_line": null + }, + { + "name": "Catalog Lookup Tests", + "description": "Dedicated tests covering standard and UUID-based lookups in the BoxCatalog.", + "source_line": null + }, + { + "name": "MP4RA Catalog Refresh Automation", + "description": "Automates refreshing MP4RABoxes.json from the upstream registry and documents maintenance workflow.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1055, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/next_tasks_metrics.json new file mode 100644 index 00000000..03b1ff1d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/06_B4_MP4RA_Metadata_Integration/next_tasks.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate the MP4RA metadata catalog into the streaming pipeline so that it can resolve box definitions during live parsing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The streaming pipeline must be able to resolve box definitions using the MP4RA metadata catalog during live parsing.", + "source_line": null + }, + { + "type": "invariant", + "description": "The integration of the MP4RA metadata catalog should not alter existing functionality of the streaming pipeline.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ParsePipeline.live() to emit real streaming events for downstream parser follow-ups, enabling catalog integration test coverage and fallback handling.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrate MP4RA metadata catalog into streaming pipeline", + "description": "Adds the MP4RA metadata catalog so that the streaming pipeline can resolve box definitions during live parsing.", + "source_line": null + }, + { + "name": "Emit real streaming events from ParsePipeline.live()", + "description": "The ParsePipeline.live() method emits real streaming events, enabling downstream parser follow-ups such as catalog integration testing and fallback handling.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 346, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/07_R1_MP4RA_Catalog_Refresh_metrics.json b/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/07_R1_MP4RA_Catalog_Refresh_metrics.json new file mode 100644 index 00000000..5dd9877c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/07_R1_MP4RA_Catalog_Refresh_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/07_R1_MP4RA_Catalog_Refresh.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement automation to refresh MP4RABoxes.json from the upstream MP4RA registry and publish a repeatable maintenance workflow for keeping the catalog current.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A scripted or documented automation path retrieves the latest MP4RA registry data (HTML, CSV, or JSON) and regenerates MP4RABoxes.json without manual editing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Running the automation updates metadata versioning markers (timestamp, source URL, or hash) and verifies schema compatibility with existing catalog consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A maintenance guide covers prerequisites, execution steps, validation checks, and contribution workflow updates so other contributors can refresh the catalog confidently.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Decide whether the automation lives as a Swift command, Python script, or documented manual recipe; align tooling with existing repository scripting conventions.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation hooks must surface warnings during tests or CI for stale or malformed catalog data to prevent regressions in downstream validation/reporting tasks.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RACatalogRefresher", + "description": "Reusable component in ISOInspectorKit that fetches MP4RA registry data and regenerates MP4RABoxes.json", + "source_line": null + }, + { + "name": "isoinspect mp4ra refresh CLI command", + "description": "Command-line interface to trigger the catalog refresh automation via https://mp4ra.org/api/boxes", + "source_line": null + }, + { + "name": "MP4RARefreshGuide", + "description": "Documentation guide detailing prerequisites, execution steps, validation checks, and contribution workflow for refreshing the catalog", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3490, + "line_count": 63 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/Summary_of_Work_metrics.json new file mode 100644 index 00000000..0edfa10e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/Summary_of_Work_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/Summary_of_Work.md", + "n_spec": 4, + "n_func": 10, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Added MP4RACatalogRefresher and supporting HTTP data provider to ISOInspectorKit, including metadata-aware JSON generation and FourCC normalization.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend the isoinspect CLI with a new mp4ra refresh command backed by dependency-injectable environment hooks for testing.", + "source_line": null + }, + { + "type": "invariant", + "description": "BoxCatalog must remove the fulfilled puzzle reference.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "swift test and swift run isoinspect mp4ra refresh must pass.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RA Catalog Refresh Automation", + "description": "Automates refreshing the MP4RA catalog by generating metadata-aware JSON and normalizing FourCC codes", + "source_line": null + }, + { + "name": "ISOInspectorKit MP4RACatalogRefresher component", + "description": "Provides functionality to refresh MP4RA catalogs within the ISOInspectorKit library", + "source_line": null + }, + { + "name": "HTTP data provider for ISOInspectorKit", + "description": "Supplies HTTP-based data needed for catalog refreshing operations", + "source_line": null + }, + { + "name": "isoinspect CLI mp4ra refresh command", + "description": "Command-line interface command that triggers a catalog refresh via isoinspect tool", + "source_line": null + }, + { + "name": "MP4RABoxes.json generation", + "description": "Creates a JSON file containing 1,167 MP4RA box entries with provenance metadata", + "source_line": null + }, + { + "name": "BoxCatalog update", + "description": "Updates the BoxCatalog to remove fulfilled puzzle references", + "source_line": null + }, + { + "name": "MP4RA Refresh Guide documentation", + "description": "Guide describing maintenance workflow for MP4RA catalog refresh", + "source_line": null + }, + { + "name": "Documentation updates (todo.md etc.)", + "description": "Tracks task completion and research gaps related to MP4RA", + "source_line": null + }, + { + "name": "Swift test execution", + "description": "Runs tests for the API and components", + "source_line": null + }, + { + "name": "Swift run isoinspect mp5?", + "description": "Weird\u00a0\u2026", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1180, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/next_tasks_metrics.json new file mode 100644 index 00000000..f39f226f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/07_R1_MP4RA_Catalog_Refresh/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement automation for refreshing MP4RABoxes.json from the upstream registry and document the maintenance workflow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The automation must successfully refresh MP4RABoxes.json from the upstream registry and produce a documented maintenance workflow.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend downstream validation and reporting to consume the enriched MP4RA metadata emitted by ParsePipeline.live()", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RABoxes.json Refresh Automation", + "description": "Automates the process of refreshing MP4RABoxes.json from the upstream registry and documents the maintenance workflow.", + "source_line": null + }, + { + "name": "Enriched MP4RA Metadata Consumption", + "description": "Extends downstream validation and reporting to consume enriched MP4RA metadata emitted by ParsePipeline.live().", + "source_line": null + }, + { + "name": "Real-time Streaming Event Parser Follow-ups", + "description": "Outlines additional downstream parser follow-ups enabled by real-time streaming events, such as catalog integration test coverage and fallback handling.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 445, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/08_Metadata_Driven_Validation_and_Reporting_metrics.json b/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/08_Metadata_Driven_Validation_and_Reporting_metrics.json new file mode 100644 index 00000000..5a16018b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/08_Metadata_Driven_Validation_and_Reporting_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/08_Metadata_Driven_Validation_and_Reporting.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide validation and reporting enhancements that use MP4RA metadata emitted by ParsePipeline.live() so downstream components can surface human-readable context and catch metadata mismatches early.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation layer inspects MP4RA metadata (e.g., expected version/flags) and raises rule VR-003 warnings when stream events diverge from catalog definitions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI and future UI reporters display box names, descriptions, and validation outcomes sourced from the catalog for each emitted event.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unknown or stale MP4RA entries are surfaced as research issues with enough context to update the catalog refresh workflow documented in task R1.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend validation pipeline to attach MP4RA-derived descriptors to ParseEvent results and implement rule handlers that compare event payloads against catalog expectations before raising issues.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update CLI reporting utilities to render descriptive names and validation summaries; capture follow-up requirements for SwiftUI consumers while maintaining streaming performance guarantees.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always attach MP4RA-derived descriptors to ParseEvent results before any rule handling occurs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RA Metadata Attachment to ParseEvent", + "description": "Enriches each parse event with MP4RA-derived descriptors such as box names and expected version/flag information", + "source_line": null + }, + { + "name": "VR-003 Validation Rule Engine", + "description": "Compares event payloads against catalog expectations and raises warnings when mismatches occur", + "source_line": null + }, + { + "name": "CLI Reporting Utility Enhancement", + "description": "Renders descriptive box names, descriptions, and validation summaries for each emitted event in the command-line interface", + "source_line": null + }, + { + "name": "UI Reporter Integration (SwiftUI)", + "description": "Provides future UI components with validated metadata and descriptive context for display", + "source_line": null + }, + { + "name": "Unknown/ Stale MP4RA Entry Detection", + "description": "Identifies unknown or outdated catalog entries during parsing and surfaces them as research issues", + "source_line": null + }, + { + "name": "Catalog Refresh Workflow Coordination", + "description": "Integrates fallback logging and stale entry detection logic based on archived B4 notes and R1 refresh guidance", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3280, + "line_count": 60 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/Summary_of_Work_metrics.json new file mode 100644 index 00000000..70883f31 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/Summary_of_Work.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "Stream events must surface MP4RA-driven warnings when version/flags diverge and unknown boxes appear.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide a reusable CLI EventConsoleFormatter that prints catalog names, summaries, and validation outcomes for each ParseEvent to prepare downstream inspect tooling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unknown box encounters must raise VR-006 research issues while continuing to log through DiagnosticsLogger for catalog refresh workflows.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxValidator Integration", + "description": "Validates MP4RA boxes during parsing and surfaces warnings for version/flags mismatches and unknown boxes", + "source_line": null + }, + { + "name": "EventConsoleFormatter CLI", + "description": "CLI tool that prints catalog names, summaries, and validation outcomes for each ParseEvent to aid downstream inspection tooling", + "source_line": null + }, + { + "name": "DiagnosticsLogger Reporting", + "description": "Logs unknown box encounters as VR-006 research issues while continuing to log through DiagnosticsLogger for catalog refresh workflows", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 905, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/next_tasks_metrics.json new file mode 100644 index 00000000..772d6926 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/08_Metadata_Driven_Validation_and_Reporting/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Outline the additional downstream parser follow-ups now unlocked by real-time streaming events (e.g., catalog integration test coverage and fallback handling).", + "source_line": null + }, + { + "type": "user_story", + "description": "Wire the console formatter into an inspect command so validation summaries appear in the CLI pipeline.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Downstream Parser Follow-Ups", + "description": "Provides real-time streaming event-driven parsing for downstream processes such as catalog integration test coverage and fallback handling.", + "source_line": null + }, + { + "name": "Console Formatter Integration", + "description": "Adds a console formatter to the inspect command, displaying validation summaries in the CLI pipeline.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 295, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/09_B4_Metadata_Follow_Up_Planning_metrics.json b/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/09_B4_Metadata_Follow_Up_Planning_metrics.json new file mode 100644 index 00000000..fae83be1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/09_B4_Metadata_Follow_Up_Planning_metrics.json @@ -0,0 +1,133 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/09_B4_Metadata_Follow_Up_Planning.md", + "n_spec": 14, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend StreamingBoxWalker integration tests to assert catalog lookups for standard and UUID boxes, including logging expectations for unknown identifiers.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement VR-003 metadata comparison rule to enforce MP4RA-defined version and flag constraints, emitting warnings when payload headers diverge.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture VR-006 research entries by persisting unknown box types with offsets into a research log, ensuring deduplication across runs.", + "source_line": null + }, + { + "type": "user_story", + "description": "Wire catalog metadata into CLI inspect streaming output with graceful fallback when descriptors are missing.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide metadata-aware adapters for future UI tree/detail panes, including placeholder descriptors when catalog entries are absent.", + "source_line": null + }, + { + "type": "user_story", + "description": "Introduce regression fixtures that mix known, UUID, and custom boxes to cover fallback behaviors and ensure catalog refresh automation stays effective.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Produce a prioritized checklist of downstream B4 follow-up tasks (tests, fallbacks, consumer updates) with dependencies and expected artifacts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Identify required fixtures and catalog scenarios (standard, UUID, unknown types) and document how they will be exercised in automation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Specify how validation and reporting layers (CLI/UI/export) should consume catalog metadata, including acceptance signals for graceful degradation when descriptors are missing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Capture any open risks or external research needed before implementation begins.", + "source_line": null + }, + { + "type": "invariant", + "description": "Catalog lookups must always return a descriptor if the box type is known; unknown types must be logged exactly once per occurrence.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation rules VR-003 and VR-006 must continue emitting warnings/info without halting parsing.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ParsePipeline.live() event coverage to define integration test hooks for metadata assertions and fallback logging.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate validation rule backlog (VR-003, VR-006) so that catalog mismatches and unknown box tracking align with success criteria.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline Metadata Enrichment", + "description": "Enriches streaming parse events by consulting the MP4RA BoxCatalog to attach descriptive metadata to each box event.", + "source_line": null + }, + { + "name": "StreamingBoxWalker Integration Tests", + "description": "Integration tests that assert catalog lookups for standard and UUID boxes, verify logging expectations for unknown identifiers during streaming parsing.", + "source_line": null + }, + { + "name": "VR-003 Metadata Comparison Rule", + "description": "Validation rule enforcing MP4RA-defined version and flag constraints, emitting warnings when payload headers diverge from catalog definitions.", + "source_line": null + }, + { + "name": "VR-006 Unknown Box Research Logging", + "description": "Captures unknown box types with offsets into a research log, ensuring deduplication across runs for future investigation.", + "source_line": null + }, + { + "name": "CLI Inspect Streaming Output Formatter", + "description": "Formats console output for the CLI inspect command, displaying catalog names/summaries when available and falling back to raw fourcc/UUID when descriptors are missing.", + "source_line": null + }, + { + "name": "UI Metadata Adapter", + "description": "Provides metadata-aware adapters for UI tree/detail panes, supplying placeholder descriptors when catalog entries are absent.", + "source_line": null + }, + { + "name": "Regression Fixture Generator", + "description": "Generates media samples mixing known, UUID, and custom boxes to cover fallback behaviors and ensure catalog refresh automation remains effective.", + "source_line": null + }, + { + "name": "BoxValidator Annotation Engine", + "description": "Annotates parse events with VR-003 warnings and VR-006 info-level issues, continuing emission of events while surfacing actionable validation messages.", + "source_line": null + }, + { + "name": "EventConsoleFormatter", + "description": "Formats parse events for console output, incorporating catalog metadata and graceful degradation for unknown descriptors.", + "source_line": null + }, + { + "name": "Export Metadata Mapper", + "description": "Maps box descriptors into JSON export metadata and UI view models, inserting placeholders for missing descriptors to prevent downstream crashes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8601, + "line_count": 84 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c8e3339e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a command-line interface that streams event data through an EventConsoleFormatter to display catalog summaries and validation issues while expanding CLI coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The isoinspect inspect command must parse events stream through EventConsoleFormatter, printing catalog summaries and validation issues as part of the CLI output.", + "source_line": null + }, + { + "type": "invariant", + "description": "Metadata follow-up planning tasks must be recorded in the in-progress checklist upon completion.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a catalog-driven parser and consumer follow-up plan to prioritize backlog items, fixture coverage, and risk management for metadata integration.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1532, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/next_tasks_metrics.json new file mode 100644 index 00000000..8e5fd786 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/next_tasks_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/09_B4_Metadata_Follow_Up_Planning/next_tasks.md", + "n_spec": 3, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Outline the additional downstream parser follow-ups now unlocked by real-time streaming events (e.g., catalog integration test coverage and fallback handling) in `09_B4_Metadata_Follow_Up_Planning.md`.", + "source_line": null + }, + { + "type": "user_story", + "description": "Wire the console formatter into an inspect command so validation summaries appear in the CLI pipeline.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement VR-003 metadata comparison rule so CLI and validation pipelines emit catalog-driven warnings.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 447, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/243_Reorganize_Navigation_SplitView_Inspector_Panel_metrics.json b/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/243_Reorganize_Navigation_SplitView_Inspector_Panel_metrics.json new file mode 100644 index 00000000..03ea43b9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/243_Reorganize_Navigation_SplitView_Inspector_Panel_metrics.json @@ -0,0 +1,138 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_Declined_Tasks_243_245/243_Reorganize_Navigation_SplitView_Inspector_Panel.md", + "n_spec": 17, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Move Selection Details content to the third column of NavigationSplitView and move Integrity Summary to the Inspector panel \u2013 display it when pressing a button at the top of the second panel of NavigationSplitView where Box Tree is displayed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selection Details fully accessible in third column when a box is selected", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity Summary toggleable via button on Box Tree panel header", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Both views adapt to available space in Inspector column (scrolling where needed)", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard shortcuts work: \u2318\u2303S for sidebar toggle, \u2318\u2325I for inspector toggle", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver labels correctly identify UI elements and state", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All existing functionality preserved (notes, field selection, hex navigation, etc.)", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Three-column layout stable across macOS, iPad portrait, iPad landscape, iPhone", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No regressions in existing tests (35+ from NavigationSplitScaffold, 15+ integration tests)", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always maintain a three\u2011column layout when the device supports it and hide or collapse columns appropriately on compact size classes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use NavigationSplitScaffold pattern with .balanced style and minimum column widths: sidebar 280pt, content 320pt, inspector 360pt.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Selection Details will be extracted into InspectorDetailView container composed of sub\u2011components (Metadata, Corruption, Encryption, Notes, Fields, Validation, Hex).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrity Summary will be moved to the Inspector column and controlled by a toggle button in the Box Tree panel header.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "InspectorDetailView will conditionally render SelectionDetailsView or SelectionIntegritySummaryView based on @State showIntegritySummary.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The toggle button will expose VoiceOver labels, keyboard shortcut \u2318\u2325I and update parent state to switch inspector content.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Responsive design: when inspector width >500pt show both views side\u2011by\u2011side; between 360-500pt use tabs or segmented picker; <360pt stack with scroll.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Accessibility audit will ensure VoiceOver, keyboard navigation, dynamic type and contrast meet WCAG AA.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NavigationSplitView Three-Column Layout", + "description": "Provides a three-column UI with Sidebar (primary), Content (secondary), and Inspector (detail) columns.", + "source_line": null + }, + { + "name": "InspectorDetailView Container", + "description": "Aggregates Selection Details and Integrity Summary views within the Inspector column, managing toggle state.", + "source_line": null + }, + { + "name": "SelectionDetailsView", + "description": "Displays metadata, corruption, encryption, notes, field annotations, validation, and hex sections for a selected box.", + "source_line": null + }, + { + "name": "SelectionIntegritySummaryView", + "description": "Shows integrity summary information, including sort controls, filter bar, issue list, and navigation to the tree.", + "source_line": null + }, + { + "name": "BoxTreePanelHeader with Toggle Button", + "description": "Adds a button in the Box Tree panel header that toggles between showing Selection Details or Integrity Summary in the Inspector column.", + "source_line": null + }, + { + "name": "Keyboard Shortcuts for Column Visibility", + "description": "Provides \u2318\u2303S to toggle sidebar visibility and \u2318\u2325I to toggle inspector visibility or content.", + "source_line": null + }, + { + "name": "Accessibility Layer for Inspector Components", + "description": "Implements VoiceOver labels, keyboard navigation, dynamic type support, and contrast compliance for all inspector UI elements.", + "source_line": null + }, + { + "name": "Responsive Layout Logic for Inspector Column", + "description": "Adjusts the display of Selection Details and Integrity Summary based on available width (tabs, split view, or stacked).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 17283, + "line_count": 355 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/244_NavigationSplitView_Parity_With_Demo_metrics.json b/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/244_NavigationSplitView_Parity_With_Demo_metrics.json new file mode 100644 index 00000000..af04731d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/244_NavigationSplitView_Parity_With_Demo_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_Declined_Tasks_243_245/244_NavigationSplitView_Parity_With_Demo.md", + "n_spec": 11, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Refactor the app shell and parse tree experience so that the three-column NavigationSplitView matches the clean NavigationSplitViewKit demo layout, removing overlaid frames under the toolbar and ensuring a single split view with stable column order.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Single top-level NavigationSplitView owns sidebar/content/inspector (no nested split views inside the content column).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Columns are flush beneath the toolbar with no extra framing or vertical inset; match NavigationSplitViewKit demo proportions. ", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Box Tree (content column) cannot be hidden by inspector toggles; inspector visibility only affects the inspector column.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting a box always switches inspector to Selection Details; integrity view does not stick after selection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Toggle controls swap inspector content (details vs integrity) without altering column visibility or pushing other columns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard shortcuts (\u2318\u2325I\u00a0and focus\u00a0shortcuts) still function with the flattened layout.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS/iPad/iPhone adaptive behaviors remain stable (balanced style).", + "source_line": null + }, + { + "type": "invariant", + "description": "The app must always use a single top-level NavigationSplitView; nested split views inside content column are prohibited.", + "source_line": null + }, + { + "type": "invariant", + "description": "Per-column padding that causes visual insets must be minimized or applied only within the view content.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Keep the single NavigationSplitView at the AppShell level and ensure content is plain\u00a0VStack\u00a0..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NavigationSplitView Layout Refactor", + "description": "Replaces nested split views with a single top-level NavigationSplitView that owns sidebar, content, and inspector columns.", + "source_line": null + }, + { + "name": "Sidebar Column", + "description": "Provides navigation or selection controls for the app shell.", + "source_line": null + }, + { + "name": "Content Column (Box Tree)", + "description": "Displays the box tree view; remains visible regardless of inspector toggles.", + "source_line": null + }, + { + "name": "Inspector Column", + "description": "Shows either Selection Details or Integrity Summary based on toggle state, without affecting column visibility.", + "source_line": null + }, + { + "name": "Inspector Detail View", + "description": "Container for the inspector content, exclusive to details/integrity views.", + "source_line": null + }, + { + "name": "Toggle Controls for Inspector Content", + "description": "Switches between Selection Details and Integrity view within the inspector column.", + "source_line": null + }, + { + "name": "Keyboard Shortcut Handling (\u2318\u2325I, focus shortcuts)", + "description": "Maintains shortcut functionality in the flattened layout.", + "source_line": null + }, + { + "name": "Adaptive Layout Behavior", + "description": "Ensures balanced style on macOS/iPad/iPhone with stable preview updates.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3219, + "line_count": 35 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/245_Adopt_SwiftUI_Inspector_API_for_ISOInspectorApp_metrics.json b/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/245_Adopt_SwiftUI_Inspector_API_for_ISOInspectorApp_metrics.json new file mode 100644 index 00000000..efd431c2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_Declined_Tasks_243_245/245_Adopt_SwiftUI_Inspector_API_for_ISOInspectorApp_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_Declined_Tasks_243_245/245_Adopt_SwiftUI_Inspector_API_for_ISOInspectorApp.md", + "n_spec": 13, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Replace the custom inspector column plumbing with the native SwiftUI .inspector API on macOS so that the inspector behaves like the platform demo: a system-managed pane that can be shown/hidden independently of the main NavigationSplitView (sidebar + content), eliminating nested split views and layout insets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "On macOS, NavigationSplitView contains only sidebar (recents) and content (box tree + filters); inspector is shown via .inspector(isPresented:).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Inspector content is always InspectorDetailView (Selection Details / Integrity), not embedded in the main split columns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Toggling inspector visibility uses a single @State showInspector bound to .inspector; \u2318\u2325I toggles it.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting a box sets displayMode = .selectionDetails and does not hide the inspector.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity/Details toggle switches content inside the inspector without affecting sidebar/content columns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Layout parity: no extra frame/inset under the toolbar; columns align like the SwiftUI demo.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "iPad/iPhone fallback to existing behavior (inspector hidden or alternate UI) without breaking builds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build and basic navigation remain green on macOS.", + "source_line": null + }, + { + "type": "invariant", + "description": "The inspector must be system-managed via .inspector(isPresented:) when active on macOS.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Apply .inspector(isPresented:) at the AppShell level (macOS only) and keep the main NavigationSplitView to two columns (sidebar/content).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a single @State private var showInspector = true on macOS; bind \u2318\u2325I to cross\u2011platform keyboard shortcut.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Remove legacy inspector column visibility state on macOS when .inspector is active, but retain it for platforms without .inspector.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NavigationSplitView two-column layout", + "description": "Main split view containing sidebar (recents) and content (box tree + filters) on macOS", + "source_line": null + }, + { + "name": "InspectorDetailView in .inspector pane", + "description": "System-managed inspector pane displaying selection details or integrity summary, controlled by .inspector(isPresented:)", + "source_line": null + }, + { + "name": "showInspector state binding", + "description": "@State variable toggled via \u2318\u2325I to show/hide the inspector pane on macOS", + "source_line": null + }, + { + "name": "displayMode state for inspector content", + "description": "Enum controlling whether InspectorDetailView shows selection details or integrity summary within the inspector", + "source_line": null + }, + { + "name": "Selection handling logic", + "description": "On node select, set displayMode to .selectionDetails and ensure inspector remains visible", + "source_line": null + }, + { + "name": "Keyboard shortcut \u2318\u2325I", + "description": "Toggles showInspector state to show/hide the inspector pane", + "source_line": null + }, + { + "name": "iOS/iPadOS fallback layout", + "description": "Maintains existing three-column arrangement or hidden inspector on non-macOS platforms without breaking builds", + "source_line": null + }, + { + "name": "Accessibility identifiers for inspector components", + "description": "Identifiers attached to inspector content, toggles, and keyboard shortcuts for testing and accessibility", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4318, + "line_count": 44 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/Summary_of_Work_metrics.json new file mode 100644 index 00000000..917d3ede --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/Summary_of_Work_metrics.json @@ -0,0 +1,138 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/Summary_of_Work.md", + "n_spec": 15, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Future developers can understand and apply FoundationUI integration patterns without reverse-engineering code.", + "source_line": null + }, + { + "type": "user_story", + "description": "Phase 1 implementation of Foundation components (Badges, Cards, Key-Value Rows) proceeds with clear examples and guidelines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation includes a \"FoundationUI Integration\" section in Technical Spec and README.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Technical Spec contains 4 detailed code examples for Badge, Card, KeyValueRow, and complex composition.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Design token usage guidelines cover spacing, color, typography, animation tokens with correct/incorrect examples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Do's and Don'ts list includes 13 guidelines with code examples and rationale.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration checklist has 19 verification points covering design tokens, component integration, testing, accessibility, platform compatibility, documentation, build quality gates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "README feature matrix updated to highlight FoundationUI usage and cross-references to Technical Spec.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Package layout includes Examples/ComponentTestApp and Tests/ISOInspectorAppTests/FoundationUI directories.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ComponentTestApp running instructions added with Tuist workflow guidance.", + "source_line": null + }, + { + "type": "invariant", + "description": "All design tokens must be used exclusively; no magic numbers or hardcoded values in business logic.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI types cannot be exposed in business logic layers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wrapper components (e.g., BoxStatusBadgeView, BoxMetadataCard) will represent domain semantics and compose with FoundationUI components.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Component composition patterns will follow multi\u2011component composition for complex UIs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Accessibility compliance must be WCAG 2.1 AA compliant across all UI components.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Badge Integration Wrapper", + "description": "Component that maps domain ParseStatus to UI BadgeLevel and displays in tree view with accessibility labels", + "source_line": null + }, + { + "name": "Card Integration Wrapper", + "description": "Wrapper for BoxMetadataCard providing elevation control, design token styling, and nested composition for detail panels", + "source_line": null + }, + { + "name": "KeyValueRow Integration Wrapper", + "description": "BoxMetadataRow component with copyable text, HexOffsetRow specialization, supporting horizontal/vertical layouts and monospaced fonts", + "source_line": null + }, + { + "name": "Complex Composition Example", + "description": "Multi-component panel combining Badge, Card, KeyValueRow, SectionHeader, semantic validation counters, and dark mode support", + "source_line": null + }, + { + "name": "Design Token Usage Guidelines", + "description": "Reference for spacing, color, typography, animation tokens with correct usage examples", + "source_line": null + }, + { + "name": "Do's and Don'ts Checklist", + "description": "13 guidelines for wrapping FoundationUI components, using design tokens, testing, accessibility, platform adaptation, documentation, etc.", + "source_line": null + }, + { + "name": "Integration Checklist", + "description": "19-point verification list covering token usage, component integration, testing, accessibility, platform compatibility, documentation, build quality gates", + "source_line": null + }, + { + "name": "ComponentTestApp Showcase", + "description": "Interactive app demonstrating FoundationUI components and integration patterns", + "source_line": null + }, + { + "name": "FoundationUI Integration Section in README", + "description": "Documentation section with quick links, key features, running instructions for ComponentTestApp", + "source_line": null + }, + { + "name": "Technical Spec Integration Documentation", + "description": "Detailed technical spec section covering architecture patterns, code examples, design token usage, guidelines, and checklist", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9073, + "line_count": 268 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/blocked_metrics.json b/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/blocked_metrics.json new file mode 100644 index 00000000..61276073 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/blocked_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/blocked.md", + "n_spec": 12, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures must be obtained before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1\u202fGiB lenient\u2011vs\u2011strict benchmark and archive runtime and RSS metrics under Documentation/Performance/.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS hardware with the 1\u202fGiB performance fixture must be available in the automation environment before running the benchmark.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines for FoundationUI Phase\u00a05.2 in PERFORMANCE.md after manual profiling with Xcode Instruments on macOS developer machine.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Render times measured by Time Profiler must be less than 100\u202fms, allocations must be under 5\u202fMB, and Core Animation must verify 60\u202fFPS on device for the manual performance profiling task.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines after completing manual performance benchmarks across iOS\u00a017, macOS\u00a014, and iPadOS\u00a017.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time must be under 10s for a clean build, binary size under 500\u202fKB, memory footprint under 5\u202fMB per screen, 60\u202fFPS during interactions, and BoxTreePattern with 1000+ nodes must perform within acceptable limits.", + "source_line": null + }, + { + "type": "user_story", + "description": "Compile cross\u2011platform test results and create a cross\u2011platform report after manual testing on iOS, macOS, and iPadOS devices and simulators.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests must cover specified device models, window sizes, orientations, dark mode, RTL languages, and multiple locales/regions before compiling the report.", + "source_line": null + }, + { + "type": "user_story", + "description": "Achieve final accessibility sign\u2011off after manual VoiceOver, keyboard navigation, dynamic type, reduce motion, contrast, and bold text testing on real devices.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Manual accessibility testing must confirm 98% score from automated tests and cover all listed edge cases before sign\u2011off.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Assets", + "description": "Import licensed media assets and refresh regression baselines for tolerant parsing and export validation", + "source_line": null + }, + { + "name": "Archive Benchmark Metrics", + "description": "Execute macOS benchmark, collect runtime and RSS metrics, and archive them in Documentation/Performance/", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish performance baseline data to PERFORMANCE.md after profiling with Xcode Instruments", + "source_line": null + }, + { + "name": "CI Integration with Performance Gates", + "description": "Integrate performance benchmarks into CI pipeline with gates for build time, binary size, memory footprint, FPS, and node count", + "source_line": null + }, + { + "name": "Compile Cross-Platform Test Report", + "description": "Compile results from cross-platform device and simulator testing into a comprehensive report", + "source_line": null + }, + { + "name": "Final Accessibility Sign-Off", + "description": "Complete manual accessibility testing and sign off on accessibility compliance", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4618, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/next_tasks_metrics.json new file mode 100644 index 00000000..57a08ec3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/next_tasks_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_I0_4_Document_Integration_Patterns/next_tasks.md", + "n_spec": 10, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI into ISOInspectorApp as a dependency and verify build compatibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create an integration test suite covering all core FoundationUI components (Badge, Card, KeyValueRow) with comprehensive coverage across iOS and macOS platforms.", + "source_line": null + }, + { + "type": "user_story", + "description": "Build a component showcase application demonstrating design tokens, view modifiers, component showcases, pattern showcases, and accessibility features for FoundationUI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document integration patterns for wrapping FoundationUI components, including code examples, design token usage, and do\u2019s/don\u2019ts guidelines.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update the Design System Guide with a FoundationUI integration checklist, migration path, quality gates per phase, and accessibility requirements (\u226598% WCAG 2.1 AA compliance).", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement a floating settings panel shell using FoundationUI cards for permanent vs. session settings, with macOS NSPanel and iPad/iOS sheet presentations.", + "source_line": null + }, + { + "type": "user_story", + "description": "Persist and reset user settings across sessions and permanent changes via UserPreferencesStore and CoreData JSON fallback.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI dependency added to Package.swift and builds succeed on all target platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration test suite contains at least 123 tests, covering Badge, Card, KeyValueRow components across iOS and macOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Component showcase app includes 14+ screens with design tokens, view modifiers..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Dependency Injection", + "description": "Adds FoundationUI as a dependency to the ISOInspectorApp package and verifies build compatibility.", + "source_line": null + }, + { + "name": "FoundationUI Integration Test Suite", + "description": "A comprehensive test suite covering Badge, Card, KeyValueRow components across iOS and macOS platforms.", + "source_line": null + }, + { + "name": "Component Showcase Application", + "description": "Demo app displaying design tokens, view modifiers, component patterns, and live preview features for FoundationUI components.", + "source_line": null + }, + { + "name": "Integration Patterns Documentation", + "description": "Technical documentation outlining architecture patterns, code examples, and guidelines for wrapping FoundationUI components.", + "source_line": null + }, + { + "name": "Design System Guide Update", + "description": "Updates the design system guide with integration checklist, migration path, quality gates, and accessibility requirements.", + "source_line": null + }, + { + "name": "Badge Component Implementation", + "description": "Provides Badge UI component with status indicators using FoundationUI.", + "source_line": null + }, + { + "name": "Card Component Implementation", + "description": "Provides Card UI component for containers and sections using FoundationUI.", + "source_line": null + }, + { + "name": "Key-Value Row Component Implementation", + "description": "Saves/..", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5441, + "line_count": 95 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/Summary_of_Work_metrics.json new file mode 100644 index 00000000..86a37771 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/Summary_of_Work_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/Summary_of_Work.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The parser registry and live pipeline must propagate structured fileType payload support so downstream consumers can access decoded brand metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and integration tests (BoxParserRegistryTests, ParsePipelineLiveTests, ParseExportTests, JSONExportSnapshotTests) must pass after adding ftyp box parser.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 817, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/next_tasks_metrics.json new file mode 100644 index 00000000..c0442541 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/next_tasks_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/100_Summary_of_Work_2025-10-19_ftyp_Follow_Up/next_tasks.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement ftyp box parser for major_brand, minor_version, compatible_brands", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ftyp box parser must correctly parse major_brand, minor_version, and compatible_brands fields", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 3228, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/101_Summary_of_Work_2025-10-19_SwiftLint_Cleanup_metrics.json b/DOCS/TASK_ARCHIVE/101_Summary_of_Work_2025-10-19_SwiftLint_Cleanup_metrics.json new file mode 100644 index 00000000..0eba19ba --- /dev/null +++ b/DOCS/TASK_ARCHIVE/101_Summary_of_Work_2025-10-19_SwiftLint_Cleanup_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/101_Summary_of_Work_2025-10-19_SwiftLint_Cleanup.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "The SwiftLint configuration must not contain the rule `function_parameter_count` to avoid repeated in-source suppressions.", + "source_line": null + }, + { + "type": "invariant", + "description": "The SwiftLint configuration must not contain the stale entry `optional_data_string_conversion` that triggers warnings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Replace Linux workflow SwiftLint steps with a UID/GID aware docker invocation that clears `.swiftlint.cache`, runs swiftlint with --fix, no-cache, and config, failing with concise file list when formatting is required.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add strict verification pass that reuses repository configuration without cache to ensure lint parity with local runs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update scripts/swiftlint-format.sh to mirror CI container command, purge cache, and run swiftlint --fix --no-cache --config .swiftlint.yml.", + "source_line": null + }, + { + "type": "user_story", + "description": "Developers should have consistent developer workflows for SwiftLint formatting.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The script `scripts/swiftlint-format.sh` runs with no errors and success status.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Docker run command executed in CI/CD pipeline must produce success status.", + "source_line": null + }, + { + "type": "user_story", + "description": "Weird\u00a0\u2026..?\u00a0...", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftLint Configuration Update", + "description": "Modifies .swiftlint.yml to disable function_parameter_count rule and remove optional_data_string_conversion entry", + "source_line": null + }, + { + "name": "Linux CI SwiftLint Workflow Replacement", + "description": "Replaces Linux workflow steps with UID/GID aware Docker invocation that clears cache, runs swiftlint --fix without cache, and fails with concise file list when formatting is required", + "source_line": null + }, + { + "name": "Strict Lint Verification Pass", + "description": "Adds a verification pass in CI that reuses repository configuration without cache to ensure lint parity with local runs", + "source_line": null + }, + { + "name": "Local SwiftLint Formatting Script Update", + "description": "Updates scripts/swiftlint-format.sh to mirror CI container command, purge cache, and run swiftlint --fix without cache for consistent developer workflows", + "source_line": null + }, + { + "name": "DescriptorHeader Helper Struct Introduction", + "description": "Adds DescriptorHeader struct in ISOInspectorKit to replace tuple return from readDescriptorHeader, satisfying large_tuple rule", + "source_line": null + }, + { + "name": "SwiftLint Verification Commands", + "description": "Provides commands to verify linting locally and via Docker, reporting success and matching prior behavior", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1534, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/C6_Extend_stsd_Codec_Metadata_metrics.json b/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/C6_Extend_stsd_Codec_Metadata_metrics.json new file mode 100644 index 00000000..6d61fa4f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/C6_Extend_stsd_Codec_Metadata_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/C6_Extend_stsd_Codec_Metadata.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement codec-specific payload parsing for stsd sample entries so ISOInspector surfaces rich metadata for H.264/AVC, H.265/HEVC, and MPEG-4 Audio tracks, including encrypted variants, across the CLI and SwiftUI front ends.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parse avcC boxes nested under avc1/avc2/avc3/avc4 sample entries, extracting profile, compatibility flags, level, and SPS/PPS descriptors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parse hvcC boxes under hvc1/hev1/dvh1/dvhe entries, capturing profile space, tier, level, constraint flags, and VPS/SPS/PPS lists.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parse esds descriptors for mp4a entries to expose AudioSpecificConfig (object type, sampling frequency, channel configuration) and any extension descriptors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Preserve encrypted sample entry metadata (encv/enca) by threading sinf/schi/tenc relationships without losing codec payload access.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extend JSON/export models and SwiftUI detail views so newly parsed codec fields appear in CLI exports and the detail pane with regression test coverage.", + "source_line": null + }, + { + "type": "invariant", + "description": "Unknown codecs should be handled resiliently, not causing parser failures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing FullBoxReader/BitReader utilities where possible; add targeted helpers if new bit-level parsing is required.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce strongly typed models for codec payloads with Codable conformance for JSON export.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update the parser registry to associate codec sample entries with the new payload decoders while keeping unknown codecs resilient.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "AVC Codec Metadata Parser", + "description": "Parses avcC boxes within AVC sample entries to extract profile, compatibility flags, level, and SPS/PPS descriptors.", + "source_line": null + }, + { + "name": "HEVC Codec Metadata Parser", + "description": "Parses hvcC boxes within HEVC sample entries to capture profile space, tier, level, constraint flags, and VPS/SPS/PPS lists.", + "source_line": null + }, + { + "name": "AAC Codec Metadata Parser", + "description": "Parses esds descriptors in mp4a entries to expose AudioSpecificConfig details such as object type, sampling frequency, channel configuration, and extensions.", + "source_line": null + }, + { + "name": "Encrypted Sample Entry Handler", + "description": "Preserves encrypted sample entry metadata (encv/enca) by threading sinf/schi/tenc relationships while maintaining access to codec payloads.", + "source_line": null + }, + { + "name": "JSON Export Model Extension", + "description": "Extends JSON export models to include newly parsed codec fields for CLI exports.", + "source_line": null + }, + { + "name": "SwiftUI Detail View Update", + "description": "Updates SwiftUI detail pane to display new codec metadata fields with regression test coverage.", + "source_line": null + }, + { + "name": "Box Parser Registry Integration", + "description": "Registers avcC, hvcC, and esds payload decoders in the BoxParserRegistry for automatic association with sample entries.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3283, + "line_count": 53 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/Summary_of_Work_metrics.json new file mode 100644 index 00000000..6e586237 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/Summary_of_Work.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend the stsd sample description parser to extract codec-specific metadata for avcC, hvcC, and esds payloads so that CLI exports and UI detail panes display codec profiles, NAL unit lists, AAC AudioSpecificConfig, and Common Encryption defaults.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser must correctly parse avcC, hvcC, and esds payloads and expose codec profiles, SPS/PPS/VPS lengths, HEVC constraint flags, AAC object type and sampling frequency, and tenc encryption defaults from sinf/schi boxes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests in StsdSampleDescriptionParserTests must cover AVC, HEVC, AAC, and encrypted sample entries and validate JSON export snapshots against baseline.", + "source_line": null + }, + { + "type": "invariant", + "description": "BoxParserRegistry must enumerate codec-specific metadata consistently across platforms (macOS and Linux).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add dedicated parsers for avcC, hvcC, and esds payloads and extend BoxParserRegistry to include new metadata fields.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stsd Sample Description Parser", + "description": "Parses stsd boxes and extracts codec-specific fields such as avcC, hvcC, esds payloads, and protection metadata for CLI exports and UI detail panes.", + "source_line": null + }, + { + "name": "BoxParserRegistry Extension", + "description": "Enumerates codec-specific metadata including SPS/PPS/VPS lengths, HEVC constraint flags, AAC object type and sampling frequency, and tenc encryption defaults from sinf/schi boxes.", + "source_line": null + }, + { + "name": "CLI Export Feature", + "description": "Exports enriched codec metadata to command-line interface output.", + "source_line": null + }, + { + "name": "UI Detail Pane Feature", + "description": "Displays extracted codec profiles, NAL unit lists, AAC AudioSpecificConfig, and Common Encryption defaults in the user interface.", + "source_line": null + }, + { + "name": "Unit Test Suite for Codec Parsing", + "description": "Provides targeted tests covering AVC, HEVC, AAC, and encrypted sample entries to validate parser output.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1429, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/next_tasks_metrics.json new file mode 100644 index 00000000..e64a6c69 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/next_tasks_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/102_C6_Extend_stsd_Codec_Metadata/next_tasks.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "All parser enhancements must be documented in DOCS/TASK_ARCHIVE and referenced from the main specification.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement a ftyp box parser that extracts major_brand, minor_version, and compatible_brands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ftyp box parser is completed and its summary of work is documented in DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/Summary_of_Work.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stsd sample description parser", + "description": "Parses stsd boxes and extracts codec-specific metadata such as avcC, hvcC, and encrypted variants", + "source_line": null + }, + { + "name": "ftyp box parser", + "description": "Parses ftyp boxes extracting major_brand, minor_version, and compatible_brands", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3295, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C2_mvhd_Movie_Header_Parser_metrics.json b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C2_mvhd_Movie_Header_Parser_metrics.json new file mode 100644 index 00000000..8a6c5591 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C2_mvhd_Movie_Header_Parser_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C2_mvhd_Movie_Header_Parser.md", + "n_spec": 7, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a dedicated parser for the mvhd movie header box so ISOInspector can surface its timeline metadata (timescale, duration, playback rate, volume, and transformation matrix) across streaming, UI, and export surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing supports both version 0 (32-bit) and version 1 (64-bit) mvhd duration layouts while always exposing the declared timescale.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The parser outputs normalized playback rate and volume values needed by clients that visualize movie timing characteristics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The transformation matrix entries are decoded and propagated so UI and export consumers can represent orientation metadata alongside other header fields.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Treat mvhd as a FullBox, reusing the shared version/flags reader so downstream code can gate duration width on the version bit.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire the parser into the core registry once the BoxParserRegistry scaffolding stabilizes so the broader movie tree gains mvhd coverage alongside existing mdhd/hdlr support.", + "source_line": null + }, + { + "type": "invariant", + "description": "The parser must always expose the declared timescale regardless of version.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "mvhd FullBox Parser", + "description": "Parses the mvhd movie header box as a FullBox, extracting version and flags.", + "source_line": null + }, + { + "name": "Timescale Extraction", + "description": "Decodes and exposes the declared timescale value from the mvhd header.", + "source_line": null + }, + { + "name": "Duration Decoding", + "description": "Handles both 32-bit (version 0) and 64-bit (version 1) duration fields in mvhd.", + "source_line": null + }, + { + "name": "Playback Rate Normalization", + "description": "Converts fixed-point playback rate to a normalized double for consumers.", + "source_line": null + }, + { + "name": "Volume Normalization", + "description": "Converts fixed-point volume to a normalized double for consumers.", + "source_line": null + }, + { + "name": "Transformation Matrix Parsing", + "description": "Decodes the nine matrix entries from mvhd and provides them via a TransformationMatrix helper.", + "source_line": null + }, + { + "name": "ParsedBoxPayload.MovieHeaderBox Model", + "description": "Structured data model representing parsed mvhd fields for downstream use.", + "source_line": null + }, + { + "name": "JSON Export Integration", + "description": "Extends JSON exporter to include mvhd details in snapshot baselines.", + "source_line": null + }, + { + "name": "Unit Tests for mvhd Parsing", + "description": "Tests covering version 0 and version 1 decoding, truncation guard, and fixture validation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2886, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C6_Codec_Payload_Additions_metrics.json b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C6_Codec_Payload_Additions_metrics.json new file mode 100644 index 00000000..7a5d2c0d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C6_Codec_Payload_Additions_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/C6_Codec_Payload_Additions.md", + "n_spec": 17, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend BoxParserRegistry to support new codec-specific payload parsers for future codecs such as Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG-H 3D Audio so that rich metadata surfaces without regressions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Inventory target codec payloads with fixture sources and decoding references.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Define parser requirements, emitted fields, and validation hooks per payload while preserving existing snapshot/export regressions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline test coverage updates (unit + JSON snapshot) required for each new payload and identify fixture gaps.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Enumerate documentation updates needed across PRD, user guides, and archived follow-up notes once implementations land.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parser registry must preserve existing encrypted sample entry handling so sinf/schi/tenc metadata is preserved.", + "source_line": null + }, + { + "type": "invariant", + "description": "Feature flags gate release of new codec-specific parsers until fixtures are available.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce CodecPayload structs for DolbyVisionConfiguration, AV1Configuration, VP9Configuration, DolbyAC4, and MPEGHConfiguration exposing relevant fields.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Register each codec-specific parser behind feature flags in BoxParserRegistry.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing bit reader utilities to parse packed fields for AV1Configuration.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Fallback to opaque payloads when unrecognized profile combinations appear while logging VR-006 research entries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire new payload models into validation rule VR-006 logging paths to capture unsupported configurations for telemetry review.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide unit tests with one case per payload using fixture-backed data and negative tests for truncated payloads.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update JSON export baseline CodecMetadataBaseline.json with new codec-specific fields, gated behind fixture availability.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add manifest entries in scripts/generate_fixtures.py for each new sample including checksum, license text, and encryption metadata.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document CLI export examples showcasing the new metadata fields in Documentation/Guides/CodecMetadata.md and SwiftUI detail pane guide.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture release notes for each codec payload in Documentation/ReleaseNotes/ so downstream consumers can track metadata expansion per release.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxParserRegistry Extension for Dolby Vision Payload", + "description": "Registers a parser that extracts Dolby Vision configuration fields (dv_version_major/minor, profile, level, flags, compatibility identifiers) from dvvC boxes and falls back to opaque payloads when unrecognized profiles are encountered.", + "source_line": null + }, + { + "name": "BoxParserRegistry Extension for AV1 Payload", + "description": "Adds a parser that reads AV1 Codec Configuration Box (av1C) fields such as sequence profile, level, tier, bit depth, chroma subsampling, monochrome flag, operating point flags and records configOBUs lengths.", + "source_line": null + }, + { + "name": "BoxParserRegistry Extension for VP9 Payload", + "description": "Introduces a parser for VP Codec Configuration box (vpcC) extracting profile, level, bit depth, chroma subsampling, colour primaries, transfer characteristics, matrix coefficients.", + "source_line": null + }, + { + "name": "BoxParserRegistry Extension for Dolby AC-4 Payload", + "description": "Adds a parser that captures Dolby AC\u20114 descriptor fields (bitstream version, presentation version, mdcompat, frame rate code, program identifier lists) from dac4 boxes.", + "source_line": null + }, + { + "name": "BoxParserRegistry Extension for MPEG-H 3D Audio Payload", + "description": "Registers a parser that extracts MPEG\u2011H configuration record fields (profile level indication, reference channel layout, compatibleSetIndication, generalProfileCompatibilitySet bits).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7538, + "line_count": 105 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1f973321 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/Summary_of_Work.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a dedicated mvhd parser that decodes versioned timeline fields and normalizes playback rate/volume and transformation matrix for downstream consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser correctly handles version 0 and 1 decoding, guards against truncated payloads, and outputs normalized doubles for timescale, duration, rate, volume, and orientation metadata.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expose parsed movie header data via ParsedBoxPayload.MovieHeaderBox with a TransformationMatrix helper for UI exporters and consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON exporter emits structured movie_header payloads matching the new schema and snapshots are regenerated to reflect changes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parser must always guard against truncated payloads and never produce invalid data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add mvhd parser to BoxParserRegistry.swift and extend JSONParseTreeExporter.swift for structured output.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document codec payload expansion roadmap for Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H in DOCS/INPROGRESS/C6_Codec_Payload_Additions.md.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Roadmap includes parser models, fixtures, and validation strategies for each codec.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update next_tasks.md to close monitoring follow-up and direct future implementation to dedicated puzzles.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "mvhd Parser", + "description": "Decodes the Movie Header Box (mvhd) from ISO Base Media File Format files, handling versioned timeline fields, playback rate/volume normalization, and a full 3\u00d73 transformation matrix while guarding against truncated payloads.", + "source_line": null + }, + { + "name": "ParsedBoxPayload.MovieHeaderBox Data Structure", + "description": "Provides structured access to normalized movie header metadata such as timescale, duration, rate, volume, and orientation for downstream exporters and UI consumers.", + "source_line": null + }, + { + "name": "TransformationMatrix Helper", + "description": "Encapsulates the 3\u00d73 transformation matrix from mvhd and exposes it as normalized double values for use by other components.", + "source_line": null + }, + { + "name": "JSON Exporter Extension", + "description": "Extends the JSON exporter to emit structured movie_header payloads, enabling snapshot testing of parsed data in JSON format.", + "source_line": null + }, + { + "name": "Unit Tests for mvhd Parser", + "description": "Tests covering version 0/1 decoding and truncation handling for the mvhd parser, ensuring correct behavior across edge cases.", + "source_line": null + }, + { + "name": "Snapshot Tests for JSON Exporter", + "description": "Regenerates exporter snapshots to validate that the JSON output matches expected structured data for movie_header payloads.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2125, + "line_count": 35 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..c94c9b01 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/next_tasks_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/103_C2_mvhd_Movie_Header_Parser/next_tasks.md", + "n_spec": 9, + "n_func": 10, + "intent_atoms": [ + { + "type": "invariant", + "description": "BoxParserRegistry must have dedicated entries for new codec payload boxes when fixtures arrive.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS CLI/UI large-file benchmark using R4 protocol once hardware runners are available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark execution must be scheduled and tracked in the specified documentation.", + "source_line": null + }, + { + "type": "invariant", + "description": "Release readiness steps (DocC generation, notarization, TestFlight export, QA) require macOS infrastructure before completion.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must be executed once Combine support is available and results documented.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI to validate SwiftUI automation flow.", + "source_line": null + }, + { + "type": "invariant", + "description": "Testing entitlements for macOS UI testing are unavailable in the container.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macmacOS to capture latency metrics.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "mvhd Movie Header Parser", + "description": "Parses the 'mvhd' movie header box into a detail struct and exposes its data via tests and documentation.", + "source_line": null + }, + { + "name": "BoxParserRegistry Codec Payload Monitoring", + "description": "Monitors incoming codec payloads (e.g., Dolby Vision boxes) and registers dedicated parser entries when new fixtures arrive.", + "source_line": null + }, + { + "name": "Handler Type Categorization Evaluation", + "description": "Evaluates additional handler type categorizations for future boxes beyond current mapping set.", + "source_line": null + }, + { + "name": "macOS CLI/UI Large-File Benchmark Execution", + "description": "Executes large-file performance benchmarks on macOS using the R4 protocol via CLI or UI.", + "source_line": null + }, + { + "name": "Release Readiness Validation Workflow", + "description": "Runs macOS DocC generation, notarization, TestFlight export and hardware QA to validate release readiness.", + "source_line": null + }, + { + "name": "Random Slice Benchmark Suite Execution", + "description": "Runs random slice benchmark suite on macOS to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "Automates end\u2011to\u2011end SwiftUI parsing tree streaming selection flow using XCTest UI on macOS.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark", + "description": "Captures latency metrics for Combine\u2011based UI benchmark on macOS, maintaining CLI throughput parity.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Tests", + "description": "Provides snapshot tests for JSON export functionality, ensuring consistent output across versions.", + "source_line": null + }, + { + "name": "Codec Metadata Extraction", + "description": "Extracts and verifies codec metadata from stsd boxes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3650, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/H4_Performance_Benchmark_Validation_metrics.json b/DOCS/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/H4_Performance_Benchmark_Validation_metrics.json new file mode 100644 index 00000000..ac21eac1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/H4_Performance_Benchmark_Validation_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/H4_Performance_Benchmark_Validation.md", + "n_spec": 4, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute automated large-file benchmarks to confirm CLI and reader implementations meet parse-time and memory budgets specified in the master PRD and publish resulting metrics for release readiness reviews.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark runs cover testCLIValidationCompletesWithinPerformanceBudget plus both random slice benchmarks, using payload sizes representative of large production files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Captured metrics (duration, CPU, memory) stay within the budgets calculated by PerformanceBenchmarkConfiguration or the configuration is adjusted with documented rationale if thresholds need refinement.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Results and any tuning instructions are documented alongside command invocations so release managers can reproduce them (e.g., via a short note appended to the Release Readiness runbook or archived under DOCS/TASK_ARCHIVE).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Large-File Benchmark Execution", + "description": "Automated execution of large-file performance benchmarks for CLI and reader implementations", + "source_line": null + }, + { + "name": "CLI Validation Benchmark", + "description": "Test that the command-line interface completes within specified parse-time and memory budgets", + "source_line": null + }, + { + "name": "Random Slice Benchmarks", + "description": "Performance tests covering random slice scenarios on large payloads", + "source_line": null + }, + { + "name": "Metric Capture and Reporting", + "description": "Collection of duration, CPU, and memory metrics and archiving them for release readiness reviews", + "source_line": null + }, + { + "name": "Benchmark Configuration Management", + "description": "Adjusting or documenting performance thresholds via PerformanceBenchmarkConfiguration", + "source_line": null + }, + { + "name": "Test Automation Integration", + "description": "Wiring benchmark tests into swift test to run automatically in CI without manual skips", + "source_line": null + }, + { + "name": "Environment Intensity Control", + "description": "Running benchmarks with ISOINSPECTOR_BENCHMARK_INTENSITY=local for developer hardware and falling back to CI defaults", + "source_line": null + }, + { + "name": "Synthetic Payload Generation", + "description": "Using LargeFileBenchmarkFixture utilities to generate or reuse synthetic large payloads instead of repo assets", + "source_line": null + }, + { + "name": "UI Latency Test Handling", + "description": "Capturing XCTSkip output when Combine is unavailable and noting macOS validation status", + "source_line": null + }, + { + "name": "Raw Log Storage", + "description": "Storing raw benchmark logs in a dedicated Documentation/Performance folder for regression analysis", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3078, + "line_count": 36 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..0ed2329f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/Summary_of_Work.md", + "n_spec": 7, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "CLI validation must stay within configured budgets: 0.067 s \u2264 0.527 s in CI and 0.083 s \u2264 0.844 s at local intensity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Both ChunkedFileReader and MappedReader must return the exact expected byte totals for every random slice scenario.", + "source_line": null + }, + { + "type": "user_story", + "description": "Archive raw XCTest logs for both intensities under Documentation/Performance/ and produce a Markdown summary so release reviewers can audit captured metrics alongside future runs.", + "source_line": null + }, + { + "type": "invariant", + "description": "Random slice scenarios transfer 67,046 bytes (small), 8,430,601 bytes (medium), and 36,284,892 bytes (large) per iteration; logs must confirm identical coverage for both readers at each intensity.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "UI latency benchmark is skipped on Linux due to Combine unavailability; macOS follow-up task tracks required hardware run.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-driven UI latency benchmark on macOS hardware once runners are available, capturing matching metrics for archive.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule the macOS CLI/UI benchmark protocol (Task R4) so the release runbook includes cross-platform throughput comparisons.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "LargeFileBenchmarkTests", + "description": "CLI performance benchmark test suite validating throughput and random slice readers against configured budgets", + "source_line": null + }, + { + "name": "PerformanceBenchmarkConfiguration", + "description": "Configuration object defining budget thresholds for CLI validation", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1872, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/Summary_of_Work_metrics.json new file mode 100644 index 00000000..56b53a46 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/Summary_of_Work.md", + "n_spec": 3, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "CLI throughput and random slice readers must stay within budget during LargeFileBenchmarkTests", + "source_line": null + }, + { + "type": "user_story", + "description": "Release managers should use the archived benchmark summary as baseline evidence packet for release readiness", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "LargeFileBenchmarkTests must pass when run under CI defaults and with ISOINSPECTOR_BENCHMENT_INTENSITY=local", + "source_line": null + } + ], + "functional_units": [ + { + "name": "LargeFileBenchmarkTests", + "description": "CLI throughput and random slice reader performance tests for large files", + "source_line": null + }, + { + "name": "ISOINSPECTOR_BENCHMARK_INTENSITY local benchmark run", + "description": "Local intensity benchmark execution of LargeFileBenchmarkTests with increased load", + "source_line": null + }, + { + "name": "Documentation/Performance/2025-10-19-benchmark-summary.md", + "description": "Human-readable summary of benchmark results and logs", + "source_line": null + }, + { + "name": "Documentation/ISOInspector.docc/Guides/ReleaseReadinessRunbook.md link to benchmark archive", + "description": "Reference for release managers to baseline evidence packet", + "source_line": null + }, + { + "name": "H4_Performance_Tests.md archival", + "description": "Archived test documentation in DOCS/TASK_ARCHIVE/107_H4_Performance_Benchmark_Validation/", + "source_line": null + }, + { + "name": "Summary_of_Work.md task-specific summary", + "description": "Task outcome captured in a summary file", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1297, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/next_tasks_metrics.json new file mode 100644 index 00000000..4970d902 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/108_Summary_of_Work_2025-10-19_Performance_Benchmark_Readout/next_tasks.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using the R4 protocol once dedicated hardware runners come online.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA following the release readiness runbook.", + "source_line": null + }, + { + "type": "invariant", + "description": "macOS automation with Instruments support is required for large-file benchmark execution.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Evaluate additional handler type categorizations if future boxes require specialized roles beyond the current mapping set.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2684, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/C8_stsc_Sample_To_Chunk_Parser_metrics.json b/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/C8_stsc_Sample_To_Chunk_Parser_metrics.json new file mode 100644 index 00000000..94f890af --- /dev/null +++ b/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/C8_stsc_Sample_To_Chunk_Parser_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/C8_stsc_Sample_To_Chunk_Parser.md", + "n_spec": 5, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a robust parser for the Sample-to-Chunk (stsc) box so that the pipeline can translate sample table metadata into UI and validation insights without relying on placeholder decoding.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Decode the stsc FullBox header (version, flags) using the shared FullBoxReader helper and surface creation of structured fields for UI/CLI consumption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parse entry_count followed by every SampleToChunk tuple (first_chunk, samples_per_chunk, sample_description_index), capturing byte ranges for hex highlighting.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Support version 0 semantics per ISO BMFF and gracefully bail when unknown flags appear.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Emit validation-friendly detail metadata that downstream rules can use to cross-check related boxes (stsz, stco).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FullBox Header Parsing", + "description": "Decode the stsc FullBox header (version and flags) using FullBoxReader.", + "source_line": null + }, + { + "name": "Entry Count Extraction", + "description": "Parse entry_count field from stsc box payload.", + "source_line": null + }, + { + "name": "SampleToChunk Tuple Parsing", + "description": "Iterate over each SampleToChunk tuple (first_chunk, samples_per_chunk, sample_description_index) and capture byte ranges for hex highlighting.", + "source_line": null + }, + { + "name": "Version 0 Semantics Support", + "description": "Handle version 0 semantics and validate unknown flags gracefully.", + "source_line": null + }, + { + "name": "Validation Metadata Emission", + "description": "Emit detail metadata usable by downstream validation rules to cross-check related boxes.", + "source_line": null + }, + { + "name": "Placeholder Messaging for Truncated Payloads", + "description": "Provide placeholder messages when payload is truncated or inconsistent.", + "source_line": null + }, + { + "name": "Typed Detail Payload Exposure", + "description": "Expose a typed detail payload (e.g., ParsedBoxPayload.Detail.sampleToChunk(entries:)) for UI table rendering and CLI export formatting.", + "source_line": null + }, + { + "name": "Integer Overflow Guarding", + "description": "Guard against integer overflow when parsing large entry_count values.", + "source_line": null + }, + { + "name": "Reusing Numeric Helpers", + "description": "Reuse FullBoxReader and numeric helpers from BoxParserRegistry to avoid duplicate bounds checks.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2930, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d2f0397a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/Summary_of_Work.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Register a dedicated stsc parser in BoxParserRegistry to decode full box headers, entry counts, and each sample-to-chunk tuple while capturing byte ranges for UI highlighting.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add the typed ParsedBoxPayload.SampleToChunkBox detail model so downstream surfaces (CLI export, UI) can consume structured stsc data and expose per-entry ranges.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser must handle truncated payloads by setting status fields instead of throwing errors, allowing validation to surface actionable errors.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParsedBoxPayload.SampleToChunkBox must contain accurate byte ranges for each entry for UI highlighting.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a dedicated stsc parser registered in BoxParserRegistry rather than generic parsing logic.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stsc Parser Registration", + "description": "Registers a dedicated stsc parser in BoxParserRegistry to decode full box headers and sample-to-chunk tuples.", + "source_line": null + }, + { + "name": "Sample-to-Chunk Tuple Decoding", + "description": "Decodes entry counts and each sample-to-chunk tuple while capturing byte ranges for UI highlighting.", + "source_line": null + }, + { + "name": "ParsedBoxPayload SampleToChunkBox Model", + "description": "Provides a typed model for downstream surfaces (CLI export, UI) to consume structured stsc data with per-entry ranges.", + "source_line": null + }, + { + "name": "Truncated Payload Handling", + "description": "Hardened parsing against truncated payloads using status fields instead of throwing errors.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Update", + "description": "Updates JSON export snapshots to include the newly structured stsc output and provides focused unit coverage.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1053, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..51a47658 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/109_C8_stsc_Sample_To_Chunk_Parser/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement stsz/stz2 sample size parsing so validation can compare declared samples-per-chunk counts against concrete sample sizes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Wire stco/co64 chunk offset parsing and validation to correlate stsc ranges with physical media offsets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Extend CLI and UI presentations to surface per-entry stsc details once the sample table view is designed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Size Parsing", + "description": "Parse stsz/stz2 sample size tables to enable validation of declared samples-per-chunk counts against actual sample sizes.", + "source_line": null + }, + { + "name": "Chunk Offset Parsing and Validation", + "description": "Parse stco/co64 chunk offset tables and validate them by correlating stsc ranges with physical media offsets.", + "source_line": null + }, + { + "name": "CLI and UI Presentation Extension", + "description": "Extend command-line interface and user interface to display per-entry stsc details once the sample table view is designed.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 627, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/10_B5_VR003_Metadata_Comparison_Rule_metrics.json b/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/10_B5_VR003_Metadata_Comparison_Rule_metrics.json new file mode 100644 index 00000000..a5f19ee1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/10_B5_VR003_Metadata_Comparison_Rule_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/10_B5_VR003_Metadata_Comparison_Rule.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement validation rule VR-003 so the parser flags mismatches between parsed box version/flags and the MP4RA-driven catalog, emitting warnings that propagate through CLI and UI pipelines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing standard fixtures surfaces VR-003 warnings whenever the catalog provides version or flag expectations that differ from the file contents, and benign files remain warning-free.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation issues tagged with VR-003 appear in CLI output formatting and downstream consumers without regressions to existing VR-006 handling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New or updated unit tests cover both matching and mismatching metadata scenarios to guard the rule\u2019s behavior in future changes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend BoxValidator to derive expected values from the catalog descriptor attached to ParseEvent metadata and compare against bytes read from the payload header; ensure truncated payloads emit warnings rather than crashing.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Keep the rule opt-in for boxes lacking metadata to avoid unnecessary I/O and align with the catalog integration guarantees from Task B4.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VR-003 Validation Rule", + "description": "Validates that parsed box version and flags match expectations from MP4RA catalog and emits warnings if mismatched", + "source_line": null + }, + { + "name": "BoxValidator Extension", + "description": "Extends BoxValidator to derive expected values from ParseEvent metadata and compare against payload header bytes, handling truncated payloads gracefully", + "source_line": null + }, + { + "name": "CLI Warning Formatter", + "description": "Formats VR-003 validation issues in CLI output with rule ID and descriptive messages", + "source_line": null + }, + { + "name": "UI Pipeline Integration", + "description": "Propagates VR-003 warnings through UI pipelines for display to users", + "source_line": null + }, + { + "name": "Unit Test Suite for VR-003", + "description": "Tests covering matching and mismatching metadata scenarios, ensuring correct warning emission and no regressions", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2919, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e08c07a9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/Summary_of_Work.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "VR-003 validation path must correctly handle matching, mismatching, truncated, and undersized payload scenarios.", + "source_line": null + }, + { + "type": "user_story", + "description": "CLI formatting for VR-003 issues should preserve existing console formatter expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests using BoxValidator must cover matching, mismatching, truncated, and undersized payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Live parse integration tests must confirm catalog-aligned version/flag pairs remain warning-free while mismatches emit VR-003 warnings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxValidator is used directly for focused unit coverage of VR-003 validation path.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxValidator Validation Path", + "description": "Validates payloads against catalog metadata, checking for matching, mismatching, truncated, and undersized scenarios", + "source_line": null + }, + { + "name": "Live Parse Integration Tests", + "description": "Runs integration tests to ensure catalog-aligned version/flag pairs are warning-free while mismatches emit VR-003 warnings through the pipeline", + "source_line": null + }, + { + "name": "Console Formatter for VR-003 Issues", + "description": "Formats VR-003 validation issues in the CLI output according to existing formatting expectations", + "source_line": null + }, + { + "name": "Documentation Archiving", + "description": "Archives in-progress brief and updates summary files for task tracking", + "source_line": null + }, + { + "name": "CLI and UI Issue Logging for Unknown Catalog Entries", + "description": "Produces actionable info-level issues when unknown catalog entries are encountered across CLI and UI pipelines (planned for VR-006)", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1238, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/next_tasks_metrics.json new file mode 100644 index 00000000..96fdd3eb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/10_B5_VR003_Metadata_Comparison_Rule/next_tasks.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement VR-006 research logging so unknown boxes and catalog gaps are tracked alongside VR-003 warnings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VR-006 research logging must track unknown boxes and catalog gaps in addition to VR-003 warnings.", + "source_line": null + }, + { + "type": "user_story", + "description": "Continue implementing remaining validation rules (VR-001, VR-002, VR-004, VR-005) in alignment with @todo #3.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation rules VR-001, VR-002, VR-004, VR-5 must be implemented according to the specifications outlined in @todo #3.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 245, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/Summary_of_Work_metrics.json new file mode 100644 index 00000000..5e391f8a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 619, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/next_tasks_metrics.json new file mode 100644 index 00000000..80df5b07 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/next_tasks_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/110_Summary_of_Work_2025-10-19_C9_C10_Planning/next_tasks.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute macOS CLI/UI large-file benchmark using R4 protocol once dedicated hardware runners are available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA following the release readiness runbook when runners are available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute random slice benchmark suite on macOS to compare mapped vs. chunked readers under identical workloads once Combine support is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI support to validate SwiftUI automation flow.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining CLI throughput parity when a macOS runner with Xcode/Combine is available.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2660, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/C3_tkhd_Track_Header_Parser_metrics.json b/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/C3_tkhd_Track_Header_Parser_metrics.json new file mode 100644 index 00000000..439a68d2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/C3_tkhd_Track_Header_Parser_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/C3_tkhd_Track_Header_Parser.md", + "n_spec": 10, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a parser for the tkhd (track header) box that extracts flag-dependent fields, duration, transformation matrix, and presentation dimensions for display across ISOInspector surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Support both version 0 and 1 layouts, honoring flag-driven optional fields such as duration and alternate_group.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Decode track and movie times (creation_time, modification_time, track_id, duration) using the correct bit widths per version.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parse layer, alternate group, volume, and 3x3 transformation matrix values with fixed-point conversion consistent with PRD specifications.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Expose width and height fields as 16.16 fixed-point dimensions and flag zero-sized tracks for validation follow-up.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add unit tests covering standard video and audio fixtures, including disabled tracks and zero-duration edge cases.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse FullBoxReader to handle version/flags extraction before parsing payload fields.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reference the mvhd parser for fixed-point math helpers to maintain consistent scaling for rate, volume, matrix elements.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend BoxParserRegistry with a tkhd entry that wires parsed values into detail view models and JSON export structures.", + "source_line": null + }, + { + "type": "invariant", + "description": "Track header fields must be decoded according to the version specified in the box.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "tkhd Box Parser", + "description": "Parses the tkhd track header box extracting all fields based on version and flags", + "source_line": null + }, + { + "name": "FullBoxReader Integration", + "description": "Uses FullBoxReader to read version and flags before payload parsing", + "source_line": null + }, + { + "name": "Versioned Timeline Field Decoder", + "description": "Decodes creation_time, modification_time, track_id, duration with correct bit widths for v0 and v1", + "source_line": null + }, + { + "name": "Optional Field Handling", + "description": "Handles flag-driven optional fields such as duration and alternate_group", + "source_line": null + }, + { + "name": "Layer/Group Metadata Parser", + "description": "Parses layer, alternate group, volume and 3x3 transformation matrix values with fixed-point conversion", + "source_line": null + }, + { + "name": "Fixed-Point Dimension Extractor", + "description": "Extracts width and height as 16.16 fixed-point dimensions and validates zero-sized tracks", + "source_line": null + }, + { + "name": "BoxParserRegistry Extension", + "description": "Registers tkhd parser entry in BoxParserRegistry to wire parsed data into view models and JSON export", + "source_line": null + }, + { + "name": "Unit Test Suite for tkhd", + "description": "Provides tests covering standard video/audio fixtures, disabled tracks, zero-duration edge cases", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2582, + "line_count": 43 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bf9b5c6b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide full tkhd track header parsing capability in BoxParserRegistry.trackHeader to extract versioned timestamps, flag states, transformation matrices, and presentation dimensions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsedBoxPayload.TrackHeaderBox must include all parsed fields and be exportable as JSON for UI and export surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests cover synthetic version 0/1 cases, disabled-track handling, and baseline fixture assertions with regenerated JSON snapshots.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParsedBoxPayload.TrackHeaderBox must always contain valid timestamp, flag, matrix, and dimension data derived from the tkhd payload.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 768, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..e3ea366b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/next_tasks_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/next_tasks.md", + "n_spec": 9, + "n_func": 9, + "intent_atoms": [ + { + "type": "invariant", + "description": "Parser tasks must align validation rules with the new stsc detail model.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement C3 tkhd track header parser with flag-dependent field decoding, track duration calculations, and presentation dimensions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "C3 tkhd parser implementation summarized in DOCS/TASK_ARCHIVE/111_C3_tkhd_Track_Header_Parser/Summary_of_Work.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Coordinate upcoming C9 (stsz/stz2) and C10 (stco/co64) parser tasks.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation rules must be aligned with the new stsc detail model.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate additional handler type categorizations for future boxes beyond current mapping set.", + "source_line": null + }, + { + "type": "invariant", + "description": "Future handler types may require specialized roles.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using R4 protocol once dedicated hardware runners.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must be executed on macOS with Instruments support.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "tkhd track header parser", + "description": "Parses the tkhd box to decode flag-dependent fields, calculate track duration, and determine presentation dimensions", + "source_line": null + }, + { + "name": "stsz/stz2 parser coordination", + "description": "Aligns validation rules for stsz/stz2 parsing with the new stsc detail model", + "source_line": null + }, + { + "name": "stco/co64 parser coordination", + "description": "Aligns validation rules for stco/co64 parsing with the new stsc detail model", + "source_line": null + }, + { + "name": "hdlr handler type evaluation", + "description": "Evaluates additional handler type categorizations for future boxes beyond current mapping set", + "source_line": null + }, + { + "name": "macOS CLI/UI large-file benchmark execution", + "description": "Runs macOS command-line or UI benchmarks on large files using the R4 protocol", + "source_line": null + }, + { + "name": "macOS DocC generation and notarization", + "description": "Generates DocC documentation, notarizes it, exports to TestFlight, and performs hardware-dependent QA for release readiness", + "source_line": null + }, + { + "name": "random slice benchmark suite execution", + "description": "Executes random slice benchmark tests on macOS to compare mapped vs. chunked readers", + "source_line": null + }, + { + "name": "ParseTreeStreamingSelectionAutomationTests execution", + "description": "Runs SwiftUI automation tests for end\u2011to\u2011end streaming UI selection flow", + "source_line": null + }, + { + "name": "Combine-backed UI benchmark execution", + "description": "Captures latency metrics for Combine-based UI benchmarks on macOS", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2914, + "line_count": 33 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/C9_stsz_stz2_Sample_Size_Parser_metrics.json b/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/C9_stsz_stz2_Sample_Size_Parser_metrics.json new file mode 100644 index 00000000..033c1324 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/C9_stsz_stz2_Sample_Size_Parser_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/C9_stsz_stz2_Sample_Size_Parser.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement dedicated parsers for the stsz and stz2 sample size tables so ISOInspector surfaces per-sample byte lengths alongside summary statistics in both CLI and SwiftUI clients.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing handles both stsz (constant sample size plus per-sample overrides) and stz2 (field size encoded entries) according to ISO/IEC 14496-12, populating model structs consumed by CLI/UI layers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Sample counts emitted by stsz/stz2 align with stsc entries and drive validation that flags mismatches during export, CLI summaries, and UI detail panes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover large constant-size tables, variable-size overrides, and 4/8/16-bit packed stz2 entries, including malformed fixture cases that trigger validation warnings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot/JSON export baselines reflect decoded sample size arrays and continue to pass.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parsing must follow ISO/IEC 14496-12 specifications for stsz and stz2 tables.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the shared FullBoxReader and buffer abstractions established in prior parser work to read headers and iteratively decode entry payloads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the stsc-backed detail model so it can correlate sample size arrays with chunk maps; add guardrails that surface inconsistencies to validation routines.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure parsers register within BoxParserRegistry, wiring outputs to SwiftUI detail sections and CLI summaries that currently stub sample size data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with the forthcoming C10 (stco/co64) parser to guarantee combined validation over sample counts, sizes, and chunk offsets for each track.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stsz Parser", + "description": "Parses the stsz sample size table, handling constant sizes and per-sample overrides, producing an array of byte lengths for each sample.", + "source_line": null + }, + { + "name": "stz2 Parser", + "description": "Parses the stz2 sample size table with packed 4/8/16-bit entries, decoding variable-length field sizes into per-sample byte lengths.", + "source_line": null + }, + { + "name": "Sample Size Summary Generator", + "description": "Generates CLI and SwiftUI summaries of total sample count, average size, min/max sizes, and other statistics from parsed stsz/stz2 data.", + "source_line": null + }, + { + "name": "Cross-Table Validation Engine", + "description": "Validates that the number of samples reported by stsz/stz2 matches the counts in the stsc table and flags mismatches during export, CLI summaries, and UI detail panes.", + "source_line": null + }, + { + "name": "Box Parser Registry Integration", + "description": "Registers stsz and stz2 parsers within the BoxParserRegistry so they are invoked automatically when encountering these boxes.", + "source_line": null + }, + { + "name": "Model Correlation with stsc Detail Model", + "description": "Extends the stsc-backed detail model to correlate sample size arrays with chunk maps, enabling combined validation with future stco/co64 parsers.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2454, + "line_count": 35 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bd7175b5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 787, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..08a8b7ef --- /dev/null +++ b/DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/next_tasks_metrics.json @@ -0,0 +1,62 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/next_tasks.md", + "n_spec": 10, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Coordinate upcoming C10 (stco/co64) parser work with the new stsz/stz2 sample size tables so validation can reconcile counts across the stsc detail model.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation must reconcile counts across the stsc detail model using the new stsz/stz2 sample size tables.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate additional handler type categorizations if future boxes require specialized roles beyond the current mapping set.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using the R4 protocol once dedicated hardware runners come online.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmarks must be executed on macOS CLI/UI with the R4 protocol and dedicated hardware runners.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA once runners are available, following the release readiness runbook.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocC generation, notarization, TestFlight export, and hardware\u2011dependent QA must be completed according to the release readiness runbook.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the random slice benchmark suite on macOS hardware once Combine support is available so we can compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Random slice benchmark suite must be executed on macOS with Combine support and results compared between mapped and chunked readers.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end\u2011to\u2011e\u00ad...", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2776, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/C10_stco_co64_Chunk_Offset_Parser_metrics.json b/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/C10_stco_co64_Chunk_Offset_Parser_metrics.json new file mode 100644 index 00000000..e03b8d6e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/C10_stco_co64_Chunk_Offset_Parser_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/C10_stco_co64_Chunk_Offset_Parser.md", + "n_spec": 4, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement dedicated parsers for the 32-bit stco and 64-bit co64 chunk offset tables so ISOInspector exposes precise byte offsets for each media chunk and enables validation against the recently delivered stsc and stsz/stz2 sample table models.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsers decode entry_count and capture each chunk offset as either UInt32 (stco) or UInt64 (co64), normalizing to a shared model downstream.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers both boxes, and streaming parse events emit structured metadata consumed by the CLI and SwiftUI experiences without regression.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation pipeline gains access to chunk offsets, enabling cross-checks that correlate stsc chunk ranges and stsz/stz2 sample sizes (unblocking repo todo.md item #15).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stco Chunk Offset Parser", + "description": "Parses the 32\u2011bit stco box to extract entry_count and each chunk offset as UInt32, normalizing into a shared sample table model.", + "source_line": null + }, + { + "name": "co64 Chunk Offset Parser", + "description": "Parses the 64\u2011bit co64 box to extract entry_count and each chunk offset as UInt64, normalizing into a shared sample table model.", + "source_line": null + }, + { + "name": "BoxParserRegistry Registration for stco/co64", + "description": "Registers both stco and co64 parsers in the BoxParserRegistry so that streaming parse events emit structured metadata.", + "source_line": null + }, + { + "name": "Shared Sample Table Detail Model Extension", + "description": "Extends the existing sample table detail model to include chunk offsets, ensuring UI and JSON export formatting consistency.", + "source_line": null + }, + { + "name": "Validation Rule #15 Integration", + "description": "Reconciles stsc chunk runs, stsz/stz2 sample sizes, and captured chunk offsets to flag discrepancies during validation.", + "source_line": null + }, + { + "name": "Unit Test Suite for Chunk Offset Parsers", + "description": "Provides tests covering mixed stco/co64 fixtures, boundary cases, maximum counts, large offsets, and file range compliance.", + "source_line": null + }, + { + "name": "Snapshot & Fixture Coverage Update", + "description": "Updates regression test snapshots and fixtures to confirm correct parsing of offsets, counts, and 32/64\u2011bit handling across representative MP4 files.", + "source_line": null + }, + { + "name": "Documentation Updates for stco/co64 Support", + "description": "Adds entries in DocC, README matrices, and other docs to list stco/co64 as supported boxes once the parser ships.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3184, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..78bcea19 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/Summary_of_Work.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add dedicated registry entries and parsing logic for both 32-bit (stco) and 64-bit (co64) chunk offset boxes in the MP4 parser.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ParsedBoxPayload model must carry normalized offset arrays for stco and co64 chunks.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON export snapshots should capture the new structured payload for stco and co64.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a shared ParsedBoxPayload model to store normalized offsets for both stco and co64.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must maintain consistent registry entries for stco and co64 parsing logic.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stco/co64 Chunk Offset Parser", + "description": "Parses 32-bit stco and 64-bit co64 chunk offset boxes, normalizes offsets into a shared payload model", + "source_line": null + }, + { + "name": "ParsedBoxPayload Model", + "description": "Data structure that holds normalized chunk offset arrays for parsed boxes", + "source_line": null + }, + { + "name": "JSON Export Snapshots", + "description": "Exports parsed box payloads to JSON format for snapshot testing", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 648, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..95aef6fd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/next_tasks_metrics.json @@ -0,0 +1,82 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/113_C10_stco_co64_Chunk_Offset_Parser/next_tasks.md", + "n_spec": 14, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement validation rule #15 to correlate stsc chunk runs, stsz/stz2 sample sizes, and the new stco/co64 chunk offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Follow integration notes in DOCS/INPROGRESS/C10_stco_co64_Chunk_Offset_Parser.md and DOCS/TASK_ARCHIVE/112_C9_stsz_stz2_Sample_Size_Parser/C9_stsz_stz2_Sample_Size_Parser.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate additional handler type categorizations if future boxes require specialized roles beyond the current mapping set.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track notes in DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/Summary_of_Work.md once refined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using the R4 protocol once dedicated hardware runners come online.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track fixtures and manifest revisions in DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/R4_Large_File_Performance_Benchmarks.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA once runners are available, following the release readiness runbook.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "See Documentation/ISOInspector.docc/Guides/ReleaseReadinessRunbook.md and archival notes in DOCS/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/Summary_of_Work.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "See DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/Summary_of_Work.md and DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/2025-10-15-random-slice-benchmark.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "See DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/51_ParseTreeStreamingSelectionAutomation_macOS_Run.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics on a platform that ships Combine, keeping throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "See DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/50_Combine_UI_Benchmark_macOS_Run.md and follow-up notes in DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/Summary_of_Work.md.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2828, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/C10_stco_co64_Chunk_Offset_Parser_metrics.json b/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/C10_stco_co64_Chunk_Offset_Parser_metrics.json new file mode 100644 index 00000000..665e9401 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/C10_stco_co64_Chunk_Offset_Parser_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/C10_stco_co64_Chunk_Offset_Parser.md", + "n_spec": 7, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement structured parsing for the stco (32-bit) and co64 (64-bit) chunk offset tables so the inspector exposes accurate byte offsets for each media chunk across legacy and large-file assets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ISOInspectorKit gains decoders that handle both stco and co64 payload layouts, respecting entry counts and integer width differences.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsed offsets populate the box detail view and JSON export with correctly typed numeric values (UInt32 vs UInt64) while presenting a normalized Swift model for consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fixtures covering small (<4 GiB) and large (\u22654 GiB) files parse without overflow, and malformed tables (e.g., counts exceeding payload length) raise validation warnings consistent with Phase B guardrails.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests assert the parser behavior for representative assets and snapshot exports update accordingly.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parser must respect entry counts and integer width differences for stco and co64.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parsed offsets must be correctly typed numeric values (UInt32 vs UInt64).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stco Chunk Offset Parser", + "description": "Parses the 32-bit stco box to extract chunk offsets and expose them in the inspector.", + "source_line": null + }, + { + "name": "co64 Chunk Offset Parser", + "description": "Parses the 64-bit co64 box to extract chunk offsets and expose them in the inspector.", + "source_line": null + }, + { + "name": "FullBox Header Reader", + "description": "Reuses shared FullBox utilities to read version/flags for stco/co64 boxes.", + "source_line": null + }, + { + "name": "Chunk Offset Detail View Renderer", + "description": "Displays parsed chunk offsets in the UI detail view with decimal and hexadecimal formatting.", + "source_line": null + }, + { + "name": "JSON Exporter for Chunk Offsets", + "description": "Exports parsed chunk offsets as typed numeric values (UInt32 or UInt64) in JSON.", + "source_line": null + }, + { + "name": "Validation Warning Generator", + "description": "Raises warnings when offset table counts exceed payload length, following Phase B guardrails.", + "source_line": null + }, + { + "name": "Sample Table Aggregation Layer Integration", + "description": "Provides a normalized Swift model for consumers to iterate offsets alongside chunk run definitions.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3117, + "line_count": 50 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e0aecad3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/Summary_of_Work.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Display each chunk offset as decimal plus hexadecimal in the stco/co64 Chunk Offset Parser.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The parser must preserve width for stco (32-bit) and co64 (64-bit) entries when showing dual-format values.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests (StcoChunkOffsetParserTests) must assert the new formatting for 32-bit, 64-bit, and truncated tables.", + "source_line": null + }, + { + "type": "invariant", + "description": "JSON snapshot fixtures must include the dual-format chunk offset values as baseline exports.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement validation rule #15 to correlate chunk offsets with stsc chunk runs and stsz/stz2 sample sizes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Chunk Offset Parser", + "description": "Parses stco and co64 chunks to display each offset in decimal and hexadecimal format while preserving field width", + "source_line": null + }, + { + "name": "Unit Tests for Chunk Offset Parser", + "description": "Provides comprehensive test coverage for 32-bit, 64-bit, and truncated tables of the parser", + "source_line": null + }, + { + "name": "JSON Snapshot Fixtures Refresh", + "description": "Updates JSON snapshots to include dual-format chunk offset values for baseline exports", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 670, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/next_tasks_metrics.json new file mode 100644 index 00000000..8ed75759 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/next_tasks_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/114_C10_stco_co64_Chunk_Offset_Parser_Update/next_tasks.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement validation rule #15 to correlate stsc chunk runs, stsz/stz2 sample sizes, and the new stco/co64 chunk offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation rule #15 must correctly correlate stsc chunk runs, stsz/stz2 sample sizes, and stco/co64 chunk offsets according to integration notes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate additional handler type categorizations if future boxes require specialized roles beyond the current mapping set.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Handler type categorizations must be evaluated and documented once refined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using the R4 protocol once dedicated hardware runners come online.", + "source_line": null + }, + { + "type": "invariant", + "description": "Benchmarks can only run when macOS automation with Instruments support is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS DocC generation, notarization, TestFlight export and hardware-dependent QA once runners are available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Release readiness tasks must be executed following the runbook.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute random slice benchmark suite on mac\u2011to\u2011s?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stco/co64 Chunk Offset Parser", + "description": "Parses stco and co64 chunks to emit normalized offsets for both 32\u2011bit and 64\u2011bit entries", + "source_line": null + }, + { + "name": "Validation Rule #15", + "description": "Correlates stsc chunk runs, stsz/stz2 sample sizes, and stco/co64 chunk offsets to ensure consistency", + "source_line": null + }, + { + "name": "hdlr Handler Type Categorization", + "description": "Parses hdlr boxes and maps handler types to specialized roles", + "source_line": null + }, + { + "name": "macOS CLI/UI Large\u2011File Benchmark Execution", + "description": "Runs large\u2011file performance benchmarks using the R4 protocol on macOS hardware", + "source_line": null + }, + { + "name": "Release Readiness Validation", + "description": "Generates DocC documentation, notarizes builds, exports TestFlight packages, and performs hardware\u2011dependent QA for release readiness", + "source_line": null + }, + { + "name": "Random Slice Benchmark Suite Execution", + "description": "Executes random slice benchmark tests on macOS to compare mapped vs. chunked readers", + "source_line": null + }, + { + "name": "ParseTree Streaming Selection Automation Tests", + "description": "Runs XCTest UI automation to validate SwiftUI streaming selection flow", + "source_line": null + }, + { + "name": "Combine\u2011backed UI Benchmark", + "description": "Captures latency metrics for Combine\u2011based UI benchmarks on macOS while maintaining CLI throughput parity", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3127, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/C11_stss_Sync_Sample_Table_metrics.json b/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/C11_stss_Sync_Sample_Table_metrics.json new file mode 100644 index 00000000..4f08dc2d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/C11_stss_Sync_Sample_Table_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/C11_stss_Sync_Sample_Table.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a parser that reads stss (Sync Sample Table) boxes so ISOInspector surfaces random-access sample numbers alongside existing sample table metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser reads the entry_count followed by each sync sample number using big-endian 32-bit integers and gracefully handles truncated payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers the parser so streaming pipelines, CLI output, and UI tree nodes expose sync sample metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot/fixture updates cover representative media (with and without stss boxes) and assert correct sample numbering and empty-table handling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation or code comments record how stss integrates with downstream validation (e.g., VR-015) and related sample table views.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parser depends on existing sample table data from C8 (stsc), C9 (stsz/stz2), and C10 (stco/co64); coordinate acceptance tests that combine these boxes to ensure coherent indices.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse FullBoxReader helpers introduced in Task B5 for consistent (version, flags) handling.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Parser emits structured sync sample arrays accessible to validation and UI components.", + "source_line": null + }, + { + "type": "invariant", + "description": "Confirm MP4RA catalog metadata for stss is surfaced (name, specification link) to keep tree labels consistent.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stss Box Parser", + "description": "Parses the Sync Sample Table box by reading entry_count and subsequent sync sample numbers as big-endian 32-bit integers, handling truncated payloads gracefully.", + "source_line": null + }, + { + "name": "FullBox Reader Integration", + "description": "Utilizes FullBoxReader helpers to process version and flags fields consistently across stss parsing.", + "source_line": null + }, + { + "name": "Parser Registration", + "description": "Registers the stss parser with BoxParserRegistry so that streaming pipelines, CLI output, and UI tree nodes can expose sync sample metadata.", + "source_line": null + }, + { + "name": "Sync Sample Metadata Exposure", + "description": "Makes parsed sync sample arrays available to downstream components such as validation rules (e.g., VR-015) and UI views for keyframe identification.", + "source_line": null + }, + { + "name": "Sample Table Coordination", + "description": "Coordinates with existing stsc, stsz/stz2, and stco/co64 parsers to ensure coherent indices when combining boxes in acceptance tests.", + "source_line": null + }, + { + "name": "UI Tree Labeling", + "description": "Surfaces MP4RA catalog metadata for stss (name, specification link) to maintain consistent tree labels in the UI.", + "source_line": null + }, + { + "name": "CLI Output Support", + "description": "Enables CLI output to display random-access sample numbers derived from stss data.", + "source_line": null + }, + { + "name": "Snapshot/Fixture Updates", + "description": "Updates snapshot and fixture tests to cover media with and without stss boxes, asserting correct sample numbering and empty-table handling.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2138, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ee91611a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/Summary_of_Work.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a parser for the 'stss' sync sample table box that decodes its contents and makes the data available to downstream consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The parser must correctly decode version/flags, entry counts, and sync sample numbers from the stss box.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When the stss box is empty, the parser should return an empty list of sync samples without error.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "If the stss box contains truncated entries (i.e., fewer bytes than required for a full entry), parsing should fail gracefully and be detected by tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "The SyncSampleTableBox model must always expose the parsed sync sample numbers as well\u2011to\u2011witness? (explanation missing).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SyncSampleTable Parser", + "description": "Parses 'stss' sync sample table boxes decoding version/flags, entry counts, and sync sample numbers into structured data", + "source_line": null + }, + { + "name": "ParsedBoxPayload SyncSampleTableBox Model", + "description": "Extends ParsedBoxPayload to include a SyncSampleTableBox model representing sync sample metadata", + "source_line": null + }, + { + "name": "JSON Export for SyncSampleTableBox", + "description": "Provides JSON export coverage so CLI/UI can surface sync sample metadata", + "source_line": null + }, + { + "name": "StssSyncSampleTableParser Tests", + "description": "Unit tests validating happy path, empty table, and truncated entry scenarios for the parser", + "source_line": null + }, + { + "name": "JSONExportSnapshot Tests", + "description": "Tests ensuring JSON parse tree snapshots include new structured sync sample payload", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 890, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/next_tasks_metrics.json new file mode 100644 index 00000000..74c72ee8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/115_C11_stss_Sync_Sample_Table/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Validation rule VR-015 must reconcile stsc, stsz/stz2, stco/co64, and the new stss sync sample numbers.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend UI affordances to highlight sync samples once the validation overlay consumes SyncSampleTableBox details.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Validation Rule VR-015", + "description": "Reconciles stsc, stsz/stz2, stco/co64, and stss sync sample numbers to ensure consistency", + "source_line": null + }, + { + "name": "SyncSampleTableBox Validation Overlay", + "description": "Consumes SyncSampleTableBox details for validation purposes", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 361, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/Summary_of_Work_metrics.json new file mode 100644 index 00000000..2a95e35c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 408, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/next_tasks_metrics.json new file mode 100644 index 00000000..c0a7d8cd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/next_tasks_metrics.json @@ -0,0 +1,52 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/116_Summary_of_Work_Parser_Focus/next_tasks.md", + "n_spec": 8, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement C11 stss sync sample table parser to surface random-access sample numbers", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation rule #15 must correlate stsc chunk runs, stsz/stz2 sample sizes, and updated stco/co64 chunk offsets according to integration notes in specified docs", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate additional handler type categorizations for future boxes beyond current mapping set", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Schedule macOS CLI/UI large-file benchmark execution using R4 protocol once dedicated hardware runners are available, following performance benchmark planning", + "source_line": null + }, + { + "type": "invariant", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA only when macOS infrastructure is available, per release readiness runbook", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run random slice benchmark suite on macOS hardware with Combine support to compare mapped vs. chunked readers under identical workloads", + "source_line": null + }, + { + "type": "invariant", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate SwiftUI automation flow", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with CLI harness", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 3065, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/C12_dinf_dref_Data_Reference_Parser_metrics.json b/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/C12_dinf_dref_Data_Reference_Parser_metrics.json new file mode 100644 index 00000000..313f82f8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/C12_dinf_dref_Data_Reference_Parser_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/C12_dinf_dref_Data_Reference_Parser.md", + "n_spec": 10, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Enable ISOInspector to parse the movie data information container (dinf) and its data reference table (dref), exposing entry metadata (type, version, flags, and location payload) through the BoxParserRegistry so downstream components can resolve external or self-contained media references.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers dedicated decoders for dinf (container) and dref (full box) that iterate all child entries without breaking streaming guarantees.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each dref entry captures its reference type (e.g., url, urn), flags, and payload bytes, surfacing URL/URN strings for CLI JSON export and UI detail panes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The parser updates JSON export snapshots to include data reference collections under the owning track/media context, with regression coverage in ISOInspectorKitTests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation scaffolding consumes parsed references to associate chunk offsets with the correct reference index, enabling follow-up rule authoring without additional structural changes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Reference indices align with one-based numbering described in ISO/IEC 14496-12.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend existing full-box parsing helpers (FullBoxReader) to decode dref version/flags, then branch on entry type identifiers to extract URL and optional name fields.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure reference indices align with one-based numbering described in ISO/IEC 14496-12; unit tests should assert index ordering and flag-driven semantics (self-contained bit vs. external resource).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update CLI export mappers and SwiftUI detail views to include parsed data references, mirroring the formatting used for other sample table arrays.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with pending Validation Rule #15 work so parsed reference indices are available to correlation logic without duplicating traversal state.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxParserRegistry Registration for dinf", + "description": "Registers a decoder that parses the 'dinf' container box and exposes its child boxes.", + "source_line": null + }, + { + "name": "BoxParserRegistry Registration for dref", + "description": "Registers a decoder that parses the full-box 'dref', iterating over all data reference entries.", + "source_line": null + }, + { + "name": "FullBoxReader Extension for dref", + "description": "Extends FullBoxReader helpers to decode version, flags, and entry type identifiers for each dref entry.", + "source_line": null + }, + { + "name": "Data Reference Entry Parsing", + "description": "Parses each dref entry to capture reference type (url/urn), flags, payload bytes, and optional name fields.", + "source_line": null + }, + { + "name": "Reference Index Alignment", + "description": "Ensures parsed entries are indexed one\u2011based as per ISO/IEC 14496-12 and validates ordering and flag semantics.", + "source_line": null + }, + { + "name": "CLI JSON Export Mapper Update", + "description": "Updates the command\u2011line export to include data reference collections under the owning track/media context.", + "source_line": null + }, + { + "name": "SwiftUI Detail View Update", + "description": "Adds UI detail panes that display parsed data references, mirroring formatting of other sample tables.", + "source_line": null + }, + { + "name": "Validation Rule #15 Integration", + "description": "Makes parsed reference indices available for chunk offset correlation logic used by Validation Rule\u00a0#15.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3093, + "line_count": 44 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bcf0ffd1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/Summary_of_Work.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "dinf Container Registration", + "description": "Registers a dedicated parser for the 'dinf' container in BoxParserRegistry.", + "source_line": null + }, + { + "name": "dref Data Reference Parsing", + "description": "Parses 'dref' data reference boxes, decoding entry counts, types, version/flags, and location payloads (URL/URN) while preserving byte ranges for UI annotations.", + "source_line": null + }, + { + "name": "ParsedBoxPayload Extension with DataReferenceBox Model", + "description": "Extends ParsedBoxPayload to include a structured DataReferenceBox model used by JSON exporter and downstream clients.", + "source_line": null + }, + { + "name": "JSON Exporter Integration", + "description": "Exports parsed data reference information in JSON format, including data reference collections within track nodes.", + "source_line": null + }, + { + "name": "CLI JSON Snapshot Generation", + "description": "Generates CLI snapshots that reflect updated data reference collections for UI/CLI output synchronization.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1414, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..3b98a6d5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/117_C12_dinf_dref_Data_Reference_Parser/next_tasks.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "dinf/dref Data Reference Parser", + "description": "Parses data reference boxes to emit entry type, version/flags, and URL/URN payload metadata for downstream chunk lookup tracking.", + "source_line": null + }, + { + "name": "smhd/vmhd Media Header Surface", + "description": "Exposes media header fields (balance, graphics mode, opcolor) via BoxParserRegistry and updates JSON exports.", + "source_line": null + }, + { + "name": "edts/elst Edit List Decoder", + "description": "Decodes edit lists including segment duration, media time, and rate, and extends validation hooks to reconcile timeline adjustments with movie and track durations.", + "source_line": null + }, + { + "name": "udta/meta/keys/ilst Metadata Parser", + "description": "Parses baseline metadata boxes (udta, meta handler, keys, ilst) surfacing simple string/integer payloads for CLI export while maintaining handler mappings.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1880, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/C13_Surface_smhd_vmhd_Media_Header_Fields_metrics.json b/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/C13_Surface_smhd_vmhd_Media_Header_Fields_metrics.json new file mode 100644 index 00000000..770decea --- /dev/null +++ b/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/C13_Surface_smhd_vmhd_Media_Header_Fields_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/C13_Surface_smhd_vmhd_Media_Header_Fields.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expose audio (smhd) and video (vmhd) media header box fields through BoxParserRegistry so parsed trees and JSON exports include balance, graphics mode, and opcolor metadata for downstream UI and validation consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "smhd and vmhd parsers populate dedicated model structures registered with BoxParserRegistry and appear in CLI JSON output.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Balance and graphics mode/opcolor values are normalized into human-readable representations while retaining raw numeric forms for validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression fixtures cover representative audio- and video-track samples, updating snapshot baselines as needed without breaking unrelated boxes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation (DocC or inline developer notes) references the new fields so UI components can bind to them without guesswork.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the shared FullBox decoding utilities introduced in earlier tasks to handle version/flags fields before reading payload data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure handler metadata from hdlr stays consistent when presenting media header fields; cross-check existing archives for codec metadata formatting.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update BoxParserRegistry mappings, Swift data models, and JSON coding keys together to avoid mismatched exports.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parsed values must be validated against reference material ISO/IEC 14496-12 \u00a78.4.3 and available fixtures; spec gaps remain only if TODOs are added.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxParserRegistry Registration for smhd", + "description": "Registers the audio media header box parser so parsed trees include balance and opcolor metadata.", + "source_line": null + }, + { + "name": "BoxParserRegistry Registration for vmhd", + "description": "Registers the video media header box parser to expose graphics mode, opcolor, and balance fields in parsed output.", + "source_line": null + }, + { + "name": "FullBox Decoding Utility Integration", + "description": "Utilizes shared FullBox decoding utilities to parse version/flags before reading payload data for smhd and vmhd boxes.", + "source_line": null + }, + { + "name": "Human-Readable Normalization of Balance", + "description": "Converts raw numeric balance values into human-readable representations while retaining the original number for validation.", + "source_line": null + }, + { + "name": "Human-Readable Normalization of Graphics Mode and Opcolor", + "description": "Translates graphics mode and opcolor fields into readable forms, preserving raw numeric data.", + "source_line": null + }, + { + "name": "JSON Export Inclusion", + "description": "Ensures smhd and vmhd parsed data appear in CLI JSON output with correct coding keys.", + "source_line": null + }, + { + "name": "UI Binding Support for Media Header Fields", + "description": "Provides documented field names so UI components can bind to balance, graphics mode, opcolor, and related metadata.", + "source_line": null + }, + { + "name": "Regression Fixture Updates", + "description": "Adds or updates regression fixtures covering audio and video track samples to validate smhd and vmhd parsing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2458, + "line_count": 51 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/Summary_of_Work_metrics.json new file mode 100644 index 00000000..077f5254 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/Summary_of_Work_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/Summary_of_Work.md", + "n_spec": 0, + "n_func": 6, + "intent_atoms": [], + "functional_units": [ + { + "name": "smhd Box Parser", + "description": "Parses the smhd media header box and exposes normalized sound metadata such as balance, graphics mode, and opcolor.", + "source_line": null + }, + { + "name": "vmhd Box Parser", + "description": "Parses the vmhd media header box and exposes normalized video metadata such as graphics mode and opcolor.", + "source_line": null + }, + { + "name": "BoxParserRegistry Extension", + "description": "Registers the smhd and vmhd parsers so they can be resolved by the registry.", + "source_line": null + }, + { + "name": "JSONParseTreeExporter Update", + "description": "Exports parsed boxes into a JSON structure, including the new sound/video metadata fields.", + "source_line": null + }, + { + "name": "Structured Payload Encoder Update", + "description": "Encodes typed payload models for smhd and vmhd into structured data for CLI snapshots and DocC consumers.", + "source_line": null + }, + { + "name": "DocC Integration Notes Update", + "description": "Provides documentation on how to surface the media header details in DocC.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 970, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/next_tasks_metrics.json new file mode 100644 index 00000000..e940df29 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/next_tasks_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/118_C13_Surface_smhd_vmhd_Media_Header_Fields/next_tasks.md", + "n_spec": 7, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Surface smhd/vmhd media header fields (balance, graphics mode, opcolor) via BoxParserRegistry and refresh JSON exports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "C13 must be completed with P0+ priority and marked done.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use BoxParserRegistry to surface smhd/vmhd media header fields.", + "source_line": null + }, + { + "type": "user_story", + "description": "Decode edts/elst edit lists, including segment duration, media time, and rate, and extend validation hooks so timeline adjustments reconcile with mvhd/tkhd durations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "C14 must be completed with P0+ priority and marked pending.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend validation hooks to reconcile timeline adjustments with mvhd/tkhd durations.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement baseline metadata box coverage for udta, meta (handler), keys and\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Surface smhd/vmhd media header fields via BoxParserRegistry", + "description": "Expose balance, graphics mode, and opcolor fields from smhd and vmhd boxes through the parser registry and update JSON exports", + "source_line": null + }, + { + "name": "Decode edts/elst edit lists with timeline reconciliation", + "description": "Parse edit lists to provide segment duration, media time, rate, and adjust validation hooks so timelines match mvhd/tkhd durations", + "source_line": null + }, + { + "name": "Baseline metadata box coverage for udta/meta/keys/ilst atoms", + "description": "Surface simple string/integer payloads from these boxes for CLI export while maintaining handler mappings", + "source_line": null + }, + { + "name": "Validate stsc, stsz/stz2 sample sizes, stco/co64 offsets and sync samples", + "description": "Flag mismatches between chunk runs, sample sizes, and offsets along with sync sample metadata", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1490, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..884e1ffe --- /dev/null +++ b/DOCS/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 672, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/next_tasks_metrics.json new file mode 100644 index 00000000..40be05e2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/11_B5_VR003_Metadata_Validation/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement VR-003 metadata comparison rule so CLI and validation pipelines emit catalog-driven warnings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VR-003 metadata comparison rule is implemented and causes CLI and validation pipelines to emit catalog-driven warnings.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VR-003 Metadata Comparison Rule", + "description": "Implements a rule that compares metadata against catalog definitions and emits warnings during CLI operations and validation pipelines", + "source_line": null + }, + { + "name": "VR-006 Research Logging Integration", + "description": "Executes research logging for VR-006 alongside CLI and UI metadata consumption once implementation tasks begin", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 237, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/C14a_Finalize_Edit_List_Scope_metrics.json b/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/C14a_Finalize_Edit_List_Scope_metrics.json new file mode 100644 index 00000000..9ef98360 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/C14a_Finalize_Edit_List_Scope_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/C14a_Finalize_Edit_List_Scope.md", + "n_spec": 15, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Define the complete parsing and validation scope for the ISO Base Media File Format `edts/elst` edit list so subsequent parser work can rely on an authoritative contract aligned with ISO/IEC 14496-12 \u00a78.6 and previously archived movie (`mvhd`) and track (`tkhd`) header metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`elst` is the sole defined child of the optional `edts` container; multiple `edts` boxes are not expected, treat the first `elst` encountered under a track as authoritative and surface a warning if duplicates appear.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The full box header supplies `version` and `flags`; flags are unused in the current standard and should be preserved but ignored by consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`entry_count` (32-bit unsigned) follows the header and determines how many edit records to parse; large edit lists are valid and must stream without pre-allocation of all entries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Entry field widths depend on `version`: Version 0 uses 32\u2011bit unsigned `segment_duration` and 32\u2011bit signed `media_time`; Version 1 promotes both fields to 64\u2011bit; `media_rate` fields are always stored as a signed 16.16 fixed\u2011point pair `{ media_rate_integer (S16), media_rate_fraction (U16) }`.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`segment_duration` is expressed in the movie timescale obtained from `mvhd`; it represents presentation time on the movie timeline that this edit occupies.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`media_time` is expressed in the owning track\u2019s media timescale from `mdhd` and identifies the first media sample to play within the edit; a value of `-1` indicates an empty edit: playback outputs silence/black for the specified duration and does not consume media samples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`media_rate` controls playback rate adjustments. The spec requires `media_rate_fraction == 0`; non\u2011zero fractions should raise a diagnostics warning. `media_rate_integer` defaults to `0x0001` for normal playback. Values of `0` pause playback while advancing media time; negative values play in reverse and should flag unsupported-rate diagnostics in current builds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Empty edits that lead the list define presentation offsets; later segments advance the composed timeline. Trailing empty edits prolong presentation without consuming media and should be surfaced to consumers for trimming/diagnostics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing workflow: read `entry_count` and stream entries one at a time to avoid allocating unbounded arrays; surface progress to downstream consumers immediately so UI and CLI exports can render partial results.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "For each entry, normalize `segment_duration_seconds = segment_duration / mvhd.timescale`; `media_time_seconds = media_time / mdhd.timescale` (skip normalization for empty edits where `media_time == -1`).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`media_rate` should be emitted as a signed double by dividing the fixed\u2011point pair (`integer + fraction / 65536`).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Maintain cumulative movie timeline offsets to expose `presentation_start` and `presentation_end` for each edit entry.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Preserve the raw fixed\u2011point integers alongside normalized values so round\u2011tripping\u00a0to\u00a0JSON\u00a0exports\u00a0retains\u00a0fidelity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation:\u00a0Duration reconciliation\u00a0\u2013\u00a0Sum\u00a0of\u00a0all\u00a0segment_duration\u00a0\u2026\u00a0..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "elst Box Header Reader", + "description": "Parses the elst box header to extract version and flags.", + "source_line": null + }, + { + "name": "Entry Count Extractor", + "description": "Reads the 32-bit unsigned entry_count following the header.", + "source_line": null + }, + { + "name": "Edit Entry Streamer", + "description": "Streams edit entries one at a time without pre\u2011allocating an array.", + "source_line": null + }, + { + "name": "Versioned Field Parser", + "description": "Parses segment_duration, media_time and media_rate fields according to version (0 or 1).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5826, + "line_count": 84 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b4773591 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/Summary_of_Work.md", + "n_spec": 2, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The edit list duration must reconcile with mvhd/tkhd metadata and not contain unsupported rate or duplicate edit list scenarios.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The definitive elst parser scope defines box placement, version-specific field widths, field semantics, and normalization rules for segment duration, media time, and fixed-point rate conversion.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "elst parser scope definition", + "description": "Defines box placement, field widths, semantics, and normalization rules for edit list parsing", + "source_line": null + }, + { + "name": "validation checkpoints catalog", + "description": "Reconciles edit list durations with mvhd/tkhd metadata and flags unsupported rates or duplicate edits", + "source_line": null + }, + { + "name": "streaming considerations documentation", + "description": "Guides implementation, validation, and fixture refresh across downstream tasks C14b\u2013C14d", + "source_line": null + }, + { + "name": "scope document archival", + "description": "Archives the finalized scope for use by parser, validation, and fixture owners", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1434, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/next_tasks_metrics.json new file mode 100644 index 00000000..55ead6c3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/next_tasks_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/next_tasks.md", + "n_spec": 3, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement the elst parser in BoxParserRegistry using documented normalization rules", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate edit list validation checks comparing durations, ordering, and playback rate sanity", + "source_line": null + }, + { + "type": "user_story", + "description": "Refresh fixtures, exports, and snapshot baselines to cover empty, single-offset, multi-segment, and rate-adjusted edit lists", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 410, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/C14b_Implement_elst_Parser_metrics.json b/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/C14b_Implement_elst_Parser_metrics.json new file mode 100644 index 00000000..4d8a3218 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/C14b_Implement_elst_Parser_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/C14b_Implement_elst_Parser.md", + "n_spec": 7, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement streaming support for the `edts/elst` edit list within `BoxParserRegistry`, exposing normalized duration, media time, and playback rate metadata for UI and CLI consumers while respecting the finalized scope from C14a.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`BoxParserRegistry` registers an `elst` parser that reads entries incrementally, honoring version\u2011specific field sizes (32\u2011bit vs 64\u2011bit durations/media times).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each entry emits normalized seconds for segment duration and media time, plus the raw fixed\u2011point rate pair and a computed double value without accumulating entire lists in memory.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser records presentation offsets per entry and surfaces rate anomalies (non\u2011zero fractions, unsupported integers) for validation consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Large edit lists stream without excessive allocation and integrate with existing export pathways (JSON, CLI) without breaking regression tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "The parser must use the timescale context derived from already parsed `mvhd`, `tkhd`, and `mdhd` nodes available in parse state.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse `FullBoxReader` helpers for `(version, flags)` decoding and derive timescale context from already parsed `mvhd`, `tkhd`, and `mdhd` nodes via `BoxParserRegistry.withEditListEnvironmentProvider`. ", + "source_line": null + } + ], + "functional_units": [ + { + "name": "elst Parser Registration", + "description": "Registers an 'elst' parser in BoxParserRegistry that streams edit list entries.", + "source_line": null + }, + { + "name": "Edit List Entry Streaming", + "description": "Reads edit list entries incrementally, handling 32-bit or 64-bit fields based on version.", + "source_line": null + }, + { + "name": "Duration and Media Time Normalization", + "description": "Converts entry durations and media times to normalized seconds using movie/track/media timescales.", + "source_line": null + }, + { + "name": "Rate Extraction and Computation", + "description": "Outputs raw fixed\u2011point rate pair and computes a double playback rate per entry.", + "source_line": null + }, + { + "name": "Presentation Offset Recording", + "description": "Captures presentation offsets for each edit list entry.", + "source_line": null + }, + { + "name": "Anomaly Diagnostics", + "description": "Surfaces diagnostics for non\u2011zero fractional rates or unsupported integer rates.", + "source_line": null + }, + { + "name": "Lightweight Edit Entry Struct", + "description": "Represents each parsed edit entry with raw integers and normalized doubles for downstream use.", + "source_line": null + }, + { + "name": "Environment Context Injection", + "description": "Provides timescale context from mvhd, tkhd, mdhd via ParsePipeline environment provider to the parser.", + "source_line": null + }, + { + "name": "Streaming Performance Assurance", + "description": "Ensures large edit lists stream without excessive memory allocation.", + "source_line": null + }, + { + "name": "Export Compatibility", + "description": "Integrates parsed data with existing JSON and CLI export pathways without breaking regression tests.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3293, + "line_count": 63 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e39aa560 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/Summary_of_Work.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "The parser scope for `edts/elst` must be documented and include validation checkpoints and streaming considerations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "A streaming `elst` decoder is registered in `BoxParserRegistry` that emits normalized edit metadata, playback rates, and cumulative presentation offsets while keeping fields accessible to the CLI exporter.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The parser must emit structured payload surfaces for both 32-bit and 64-bit edit entries and normalize seconds using mvhd/mdhd timescales without test-only overrides.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "edts/elst Parser Scope Documentation", + "description": "Documents parser scope, validation checkpoints, and streaming considerations for the elst edit list parser.", + "source_line": null + }, + { + "name": "elst Edit List Parser Implementation", + "description": "Registers a streaming elst decoder that emits normalized edit metadata, playback rates, and cumulative presentation offsets; provides structured payload surfaces and supports 32-bit and 64-bit entries.", + "source_line": null + }, + { + "name": "Live Parse Pipeline Integration", + "description": "Integrates mvhd/mdhd timescales into the edit list environment so normalized seconds populate without test-only overrides.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1122, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..753a6c82 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/next_tasks_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/121_C14b_Implement_elst_Parser/next_tasks.md", + "n_spec": 11, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Finalize the edts/elst parser scope by reviewing ISO/IEC 14496-12 \u00a78.6 and confirming field widths, fixed\u2011point rate handling, and how edit list segment counts relate to mvhd/tkhd durations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Scope documented in DOCS/TASK_ARCHIVE/120_C14a_Finalize_Edit_List_Scope/C14a_Finalize_Edit_List_Scope.md to unblock parser, validation, and fixture follow\u2011ups.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement elst entry parsing within BoxParserRegistry, capturing segment duration, media time, and rate while normalizing rate to double precision for UI/export consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ensure large edit lists stream without over\u2011allocation.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parse pipeline now threads mvhd/mdhd timescales into the edit list environment.", + "source_line": null + }, + { + "type": "user_story", + "description": "Wire edit list payloads into validation so reconciled presentation durations align with movie/track headers and flag gaps or overlaps.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extend existing duration diagnostics to reference edit list context.", + "source_line": null + }, + { + "type": "user_story", + "description": "Refresh fixtures, JSON exports, and snapshot baselines covering common edit list scenarios (empty list, single offset, multi\u2011segment, rate adjustments) and document test execution notes in the new task summary.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement baseline metadata box coverage for udta, meta (handler), keys, and ilst atoms, surfacing simple string/integer payloads for CLI export.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Follow archival context in DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/Summary_of_Work.md to keep handler mappings consistent.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation Rule #15 correlates stsc chunk runs, stsz/stz2 sample sizes, and stco/co64 offsets to flag mismatches alongside the new sync sample metadata.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Edit List Parser", + "description": "Parses 'elst' box entries capturing segment duration, media time, and rate, normalizing rate to double precision.", + "source_line": null + }, + { + "name": "Edit List Validation Integration", + "description": "Validates edit list payloads against movie/track headers, flagging gaps or overlaps and extending duration diagnostics.", + "source_line": null + }, + { + "name": "Edit List Fixture Refresh", + "description": "Refreshes fixtures, JSON exports, and snapshot baselines for common edit list scenarios.", + "source_line": null + }, + { + "name": "Metadata Box Parser Coverage", + "description": "Parses 'udta', 'meta' (handler), 'keys', and 'ilst' atoms to surface simple string/integer payloads for CLI export.", + "source_line": null + }, + { + "name": "Chunk Run Validation Rule #15", + "description": "Correlates stsc, stsz/stz2 sample sizes, and stco/co64 offsets to flag mismatches with sync sample metadata.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2197, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/C14c_Edit_List_Duration_Validation_metrics.json b/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/C14c_Edit_List_Duration_Validation_metrics.json new file mode 100644 index 00000000..3f2a1da1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/C14c_Edit_List_Duration_Validation_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/C14c_Edit_List_Duration_Validation.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Validate edit list payloads so that presentation durations align with movie and track headers, flagging gaps, overlaps, and unsupported rate adjustments surfaced by the elst parser.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation compares summed edit list movie durations against mvhd.duration and reports discrepancies exceeding one tick of the movie timescale.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track-level reconciliation maps non-empty edits into media timescale units and surfaces drift relative to tkhd and mdhd durations, tolerating disabled tracks.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Diagnostics call out overlapping presentation windows, unsupported reverse/paused segments, and non-zero media_rate_fraction values with actionable messages.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Results flow into CLI/JSON exports and existing UI diagnostic channels without regressing current tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "Edit list payloads must be consumed by the validation pipeline alongside mvhd, tkhd, and mdhd metadata.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the validation pipeline to consume elst entries using cumulative presentation offsets computed by the parser.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Emit structured diagnostics tagged with affected track IDs for future fixture updates.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add targeted regression coverage exercising empty edits, multi-segment offsets, and mismatched durations using existing fixture corpus.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Edit List Payload Validation", + "description": "Validates elst entries against movie and track headers for duration consistency, gaps, overlaps, and rate adjustments.", + "source_line": null + }, + { + "name": "Presentation Duration Reconciliation", + "description": "Compares summed edit list movie durations to mvhd.duration and reports discrepancies beyond one tick of the movie timescale.", + "source_line": null + }, + { + "name": "Track-Level Edit Mapping", + "description": "Maps non-empty edits into media timescale units and surfaces drift relative to tkhd and mdhd durations, handling disabled tracks.", + "source_line": null + }, + { + "name": "Diagnostic Messaging for Overlaps and Unsupported Segments", + "description": "Generates structured diagnostics for overlapping presentation windows, reverse/paused segments, and non-zero media_rate_fraction values with actionable messages.", + "source_line": null + }, + { + "name": "CLI and JSON Export Integration", + "description": "Flows validation results into CLI outputs and JSON exports for downstream consumption.", + "source_line": null + }, + { + "name": "UI Diagnostic Channel Update", + "description": "Integrates new diagnostics into existing UI diagnostic channels without regression.", + "source_line": null + }, + { + "name": "Structured Diagnostic Tagging", + "description": "Tags diagnostics with affected track IDs to aid future fixture updates and assertions.", + "source_line": null + }, + { + "name": "Regression Test Coverage Extension", + "description": "Adds targeted regression tests covering empty edits, multi-segment offsets, and mismatched durations using existing fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3073, + "line_count": 50 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..778d4e62 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/Summary_of_Work.md", + "n_spec": 3, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Validation rule VR-014 must reconcile edit list presentation spans with mvhd, tkhd, and mdhd durations and surface unsupported playback rates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming coverage ensures media duration diagnostics defer until the owning mdhd payload is parsed, preserving order-agnostic validation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxValidator extended with a stateful edit list rule that tracks movie- and track-level context, computes tolerance-aware tick differences, and emits targeted messages for gaps, overruns, and rate anomalies.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Edit List Duration Reconciliation", + "description": "Validates that edit list presentation spans match movie, track, and media header durations and flags unsupported playback rates.", + "source_line": null + }, + { + "name": "Stateful Edit List Validation Rule (VR-014)", + "description": "Tracks movie and track context, computes tolerance-aware tick differences, and emits messages for gaps, overruns, and rate anomalies during validation.", + "source_line": null + }, + { + "name": "Deferred Media Duration Diagnostics", + "description": "Delays media duration checks until the owning media header payload is parsed to maintain order-agnostic validation.", + "source_line": null + }, + { + "name": "Parse Pipeline Live Tests for Edit List Scenarios", + "description": "Regression tests covering mismatched durations, deferred reconciliation, and unsupported rates in the parsing pipeline.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1174, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/next_tasks_metrics.json new file mode 100644 index 00000000..71fd17a0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/next_tasks_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/next_tasks.md", + "n_spec": 9, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Wire edit list payloads into validation so reconciled presentation durations align with movie/track headers and flag gaps or overlaps.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extend duration diagnostics to reference edit list context.", + "source_line": null + }, + { + "type": "invariant", + "description": "Reconciled presentation durations must align with movie/track headers.", + "source_line": null + }, + { + "type": "user_story", + "description": "Refresh fixtures, JSON exports, and snapshot baselines covering common edit list scenarios (empty list, single offset, multi-segment, rate adjustments) so VR-014 diagnostics have full regression coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fixtures, JSON exports, and snapshot baselines must cover empty list, single offset, multi-segment, and rate adjustment scenarios.", + "source_line": null + }, + { + "type": "invariant", + "description": "VR-014 diagnostics must have full regression coverage.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement baseline metadata box coverage for udta, meta (handler), keys, and ilst atoms, surfacing simple string/integer payloads for CLI export.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Handler mappings must remain consistent with archival context.", + "source_line": null + }, + { + "type": "invariant", + "description": "Baseline metadata box coverage includes udta, meta (handler), keys..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Edit List Duration Validation", + "description": "Validates that presentation durations from edit lists align with movie/track headers and flags gaps or overlaps.", + "source_line": null + }, + { + "name": "Edit List Fixture Refresh", + "description": "Refreshes fixtures, JSON exports, and snapshot baselines for common edit list scenarios to provide regression coverage.", + "source_line": null + }, + { + "name": "Metadata Box Coverage Export", + "description": "Parses udta, meta (handler), keys, and ilst atoms and surfaces simple string/integer payloads for CLI export.", + "source_line": null + }, + { + "name": "Sample Size & Chunk Offset Correlation Validation", + "description": "Correlates stsc chunk runs, stsz/stz2 sample sizes, and stco/co64 offsets to flag mismatches with sync sample metadata.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1598, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/C14d_Refresh_Edit_List_Fixtures_metrics.json b/DOCS/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/C14d_Refresh_Edit_List_Fixtures_metrics.json new file mode 100644 index 00000000..64370c25 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/C14d_Refresh_Edit_List_Fixtures_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/C14d_Refresh_Edit_List_Fixtures.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Update edit list diagnostics (VR-014) fixtures and exports to cover empty, single-offset, multi-segment, and rate-adjusted elst scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Refresh fixture inputs for all specified elst cases with regenerated JSON exports and snapshots reflecting VR-014 outputs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update any failing snapshot or export assertions in Tests/ISOInspectorKitTests to align with the new fixtures without regressing unrelated parsers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document test execution notes (e.g., swift test, targeted snapshot regenerations) within the eventual task summary.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Confirm regression coverage by running the full SwiftPM test suite after fixture updates.", + "source_line": null + }, + { + "type": "invariant", + "description": "Checksums and metadata of regenerated assets must stay in sync with Tests/Fixtures manifests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing fixture generation utilities in scripts/ and guidance from DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog to regenerate assets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Edit List Fixture Generation", + "description": "Generate test fixtures for edit list scenarios (empty, single-offset, multi-segment, rate-adjusted) using existing utilities in scripts/ and task archive guidance.", + "source_line": null + }, + { + "name": "JSON Export Regeneration", + "description": "Regenerate JSON exports of edit lists to reflect updated diagnostics VR-014 outputs.", + "source_line": null + }, + { + "name": "Snapshot Baseline Update", + "description": "Update snapshot baselines for edit list JSON exports under Tests/__Snapshots__/ to match regenerated data.", + "source_line": null + }, + { + "name": "Test Suite Execution", + "description": "Run the full SwiftPM test suite after fixture updates to confirm regression coverage and no regressions in unrelated parsers.", + "source_line": null + }, + { + "name": "Fixture Metadata Synchronization", + "description": "Ensure checksums and metadata of generated fixtures stay in sync with Tests/Fixtures/ manifests.", + "source_line": null + }, + { + "name": "Validation Rule Coordination", + "description": "Coordinate with Validation Rule #15 planning notes to avoid conflicting expectations for chunk/sample correlation follow-ups.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2631, + "line_count": 36 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/Summary_of_Work_metrics.json new file mode 100644 index 00000000..537fd2f4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/123_C14d_Refresh_Edit_List_Fixtures/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "Synthetic edit list fixtures must be regenerated for empty, single-offset, multi-segment, and rate-adjusted scenarios to ensure VR-014 diagnostics surface across representative payloads.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expand the fixture catalog metadata, regression tests, and JSON export snapshots to cover new assets and verify rule messaging.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Updated repository documentation must mark C14d complete and point follow-on efforts toward pending metadata parser work.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Proceed with C15 metadata container coverage and Validation Rule #15 chunk/sample correlation per existing planning documents.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Generate Synthetic Edit List Fixtures", + "description": "Creates synthetic edit list fixtures for various scenarios such as empty, single-offset, multi-segment, and rate-adjusted using generate_fixtures.py", + "source_line": null + }, + { + "name": "Export JSON Snapshots of Edit Lists", + "description": "Exports JSON representations of edit lists to verify rule messaging and snapshot consistency", + "source_line": null + }, + { + "name": "Run Validation Tests for Edit List Scenarios", + "description": "Executes Swift test cases filtered by specific edit list snapshot tests (empty, single-offset, multi-segment, rate-adjusted) and overall test suite", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1227, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/Summary_of_Work_metrics.json new file mode 100644 index 00000000..98413436 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/Summary_of_Work.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "Synthetic Edit List Fixtures Generation", + "description": "Generates synthetic edit list fixtures (empty, single-offset, multi-segment, rate-adjusted) via generate_fixtures.py and publishes them to the fixture catalog.", + "source_line": null + }, + { + "name": "Fixture Metadata Extension", + "description": "Extends fixture metadata to include VR-014 warning coverage information and new JSON export snapshots.", + "source_line": null + }, + { + "name": "Regression Tests for Edit List Fixtures", + "description": "Runs regression tests that assert VR-014 warning coverage for various edit list scenarios using snapshot comparisons.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Testing", + "description": "Executes Swift test cases to validate JSON export snapshots for empty, single-offset, multi-segment and rate\u2011adjusted edit lists.", + "source_line": null + }, + { + "name": "Documentation Update for C14d Completion", + "description": "Updates project documentation to mark C14d as complete and direct follow-up work to C15 and Validation Rule\u00a0#15.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1401, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/next_tasks_metrics.json new file mode 100644 index 00000000..bc699a40 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/next_tasks_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/124_Summary_of_Work_2025-10-20/next_tasks.md", + "n_spec": 2, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement baseline metadata box coverage for udta, meta (handler), keys, and ilst atoms to surface simple string/integer payloads for CLI export while preserving handler mappings documented in DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Baseline metadata box coverage must preserve handler mappings as documented in DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Refresh Edit List Fixtures", + "description": "Update and maintain JSON exports and snapshot baselines for common edit list scenarios such as empty lists, single offsets, multi-segment lists, and rate adjustments to ensure regression coverage.", + "source_line": null + }, + { + "name": "Baseline Metadata Box Coverage", + "description": "Implement support for metadata boxes udta, meta (handler), keys, and ilst atoms to expose simple string or integer payloads via CLI export while preserving handler mappings.", + "source_line": null + }, + { + "name": "Edit List Duration Validation Rule 15", + "description": "Validate consistency between stsc chunk runs, stsz/stz2 sample sizes, and stco/co64 offsets, flagging mismatches and providing diagnostics for edit list duration.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1071, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/C15_Metadata_Box_Coverage_metrics.json b/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/C15_Metadata_Box_Coverage_metrics.json new file mode 100644 index 00000000..18df29ce --- /dev/null +++ b/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/C15_Metadata_Box_Coverage_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/C15_Metadata_Box_Coverage.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement baseline parsing and export coverage for QuickTime metadata boxes (udta, meta with handler metadata, keys, and ilst) so the CLI can surface simple string and integer tags while preserving handler mappings captured in prior handler parser work.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers parsers for udta, meta, keys, and ilst boxes with baseline decoding for UTF-8 strings and integer payloads documented in MP4RA.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Handler mapping from the meta box correctly ties parsed ilst entries to the owning namespace (e.g., mdta, mdir Apple tags).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI export output includes the decoded metadata pairs in JSON/terminal formats with regression fixtures refreshed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and fixture tests cover representative tags (\u00a9nam, \u00a9day, integer values) and confirm graceful fallback for unsupported value types.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parsers emit structured warnings for unknown key types but do not block traversal.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse FullBoxReader utilities for version/flags handling in meta, keys, and ilst payloads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Leverage metadata planning artifacts to align exported field names and CLI formatting expectations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update fixture generation scripts to include sample udta/meta/ilst structures and extend validation suites accordingly.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxParserRegistry Registration for Metadata Boxes", + "description": "Registers parsers for 'udta', 'meta', 'keys', and 'ilst' boxes to enable baseline decoding of UTF-8 strings and integer payloads.", + "source_line": null + }, + { + "name": "Meta Box Handler Mapping", + "description": "Extracts handler codes from the 'meta' box and associates parsed 'ilst' entries with their owning namespace (e.g., mdta, mdir Apple tags).", + "source_line": null + }, + { + "name": "CLI Export of Decoded Metadata", + "description": "Outputs decoded metadata key-value pairs in JSON or terminal formats via the CLI, including string and integer tags.", + "source_line": null + }, + { + "name": "Structured Warning Emission for Unknown Key Types", + "description": "Generates structured warnings when encountering unsupported value types during parsing without halting traversal.", + "source_line": null + }, + { + "name": "Fixture Generation for Metadata Structures", + "description": "Creates sample 'udta/meta/ilst' structures and updates validation suites to support regression testing of metadata parsing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2583, + "line_count": 35 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/Summary_of_Work_metrics.json new file mode 100644 index 00000000..26048d98 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/Summary_of_Work.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Parsing, environment propagation, and JSON export coverage must be implemented for udta/meta/keys/ilst.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Dedicated metadata parsers and environment plumbing are added so handler context and key tables flow into ilst parsing.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The streaming walker is extended to accommodate meta payload offsets and FourCharCode decoding supports non-ASCII identifiers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "JSON export structured payloads include metadata detail encoders for metadata boxes and item lists.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Metadata Box Parsing", + "description": "Parses metadata boxes within the 'udta/meta/keys/ilst' structure, extracting key-value pairs and handling various data types.", + "source_line": null + }, + { + "name": "Environment Propagation for Metadata Parsing", + "description": "Propagates handler context and key tables into the metadata parsing process to ensure correct interpretation of metadata values.", + "source_line": null + }, + { + "name": "FourCharCode Decoding Extension", + "description": "Extends FourCharCode decoding logic to support non-ASCII identifiers used in metadata boxes.", + "source_line": null + }, + { + "name": "Streaming Walker Offset Handling", + "description": "Updates the streaming walker to accommodate meta payload offsets, enabling accurate traversal of nested metadata structures.", + "source_line": null + }, + { + "name": "JSON Export for Metadata Boxes", + "description": "Exports parsed metadata boxes into structured JSON format, including detailed encoders for metadata detail and item lists.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 778, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/next_tasks_metrics.json new file mode 100644 index 00000000..0e213f04 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/next_tasks_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/125_C15_Metadata_Box_Coverage/next_tasks.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement baseline metadata box coverage for udta, meta (handler), keys, and ilst atoms to surface simple string/integer payloads for CLI export while preserving handler mappings documented in DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Baseline metadata box coverage must expose simple string or integer payloads for the specified atoms (udta, meta, keys, ilst) and preserve handler mappings as per documentation.", + "source_line": null + }, + { + "type": "invariant", + "description": "Handler mappings documented in DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser must always be preserved when exposing metadata payloads.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Metadata Box Coverage for udta, meta, keys, ilst", + "description": "Provides CLI export of simple string/integer payloads from specified atoms while preserving handler mappings", + "source_line": null + }, + { + "name": "Validation Rule #15 for stsc/stsz/stz2/stco/co64 mismatch detection", + "description": "Flags mismatches between chunk runs, sample sizes, and offsets and reports edit list duration diagnostics", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 756, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/C17_mdat_Box_Parser_metrics.json b/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/C17_mdat_Box_Parser_metrics.json new file mode 100644 index 00000000..3d9bc843 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/C17_mdat_Box_Parser_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/126_C17_mdat_Box_Parser/C17_mdat_Box_Parser.md", + "n_spec": 7, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a parser that records the media data (mdat) box's byte range so the UI and CLI can display payload boundaries without materializing large media blobs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Register an mdat parser in BoxParserRegistry that emits a structured payload containing the header start offset, total size, and payload length while seeking past the media bytes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ensure the streaming reader advances using seek/skip semantics so even multi-gigabyte payloads do not allocate buffers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extend unit tests and JSON export baselines to prove offsets and sizes are reported for regular and large-size mdat fixtures without impacting existing validation rules (e.g., VR-005 ordering checks).", + "source_line": null + }, + { + "type": "invariant", + "description": "The parser must cooperate with existing VR-005 handling when mdat precedes moov in streaming files.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the shared chunked reader helpers to compute start offsets and to jump over payload bytes for both 32-bit and large-size headers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Surface the recorded metadata through existing detail/hex view models and CLI export structures so downstream components can surface payload boundaries without reading the media data.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Mdat Box Parser Registration", + "description": "Registers an mdat parser in the BoxParserRegistry that emits structured payload metadata", + "source_line": null + }, + { + "name": "Offset and Size Recording", + "description": "Captures header start offset, total size, and payload length for each mdat box", + "source_line": null + }, + { + "name": "Payload Skipping Mechanism", + "description": "Skips over media payload bytes using seek/skip semantics without allocating buffers", + "source_line": null + }, + { + "name": "Large-Size Header Support", + "description": "Handles both 32-bit and large-size mdat headers while computing offsets", + "source_line": null + }, + { + "name": "Metadata Exposure to UI", + "description": "Surfaces recorded metadata through detail/hex view models for UI display", + "source_line": null + }, + { + "name": "CLI Export Integration", + "description": "Provides mdat payload boundaries in CLI export structures without reading media data", + "source_line": null + }, + { + "name": "Validation Logging Cooperation", + "description": "Ensures parser cooperates with VR-005 validation logging when mdat precedes moov", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2245, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d4cddc51 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/126_C17_mdat_Box_Parser/Summary_of_Work.md", + "n_spec": 0, + "n_func": 6, + "intent_atoms": [], + "functional_units": [ + { + "name": "mdat parser", + "description": "Parses mdat boxes in the streaming pipeline and records byte ranges without loading payload data", + "source_line": null + }, + { + "name": "BoxParserRegistry registration for mdat", + "description": "Registers a dedicated mdat parser that emits MediaDataBox details with header offsets and payload range metadata", + "source_line": null + }, + { + "name": "ParsedBoxPayload extension", + "description": "Extends ParsedBoxPayload to include media_data detail", + "source_line": null + }, + { + "name": "JSON exporter update", + "description": "Exports structured media_data detail in JSON format", + "source_line": null + }, + { + "name": "CLI snapshot baseline refresh for mdat fixtures", + "description": "Refreshes CLI snapshot baselines for fixtures that include mdat boxes", + "source_line": null + }, + { + "name": "Regression coverage for registry and pipeline", + "description": "Verifies registry and live pipeline report captured offsets while avoiding payload reads", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 805, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..afe4d29c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/126_C17_mdat_Box_Parser/next_tasks_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/126_C17_mdat_Box_Parser/next_tasks.md", + "n_spec": 3, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expand metadata value decoding for additional data types surfaced by future fixtures so CLI exports stay aligned with MP4RA guidance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track coverage opportunities against DOCS/AI/ISOViewer/ISOInspector_PRD_TODO.md.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation Rule #15 correlates stsc chunk runs, stsz/stz2 sample sizes, and stco/co64 offsets to flag mismatches alongside the edit list duration diagnostics archived in DOCS/TASK_ARCHIVE/122_C14c_Edit_List_Duration_Validation/.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 798, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/C18_free_skip_Pass_Through_metrics.json b/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/C18_free_skip_Pass_Through_metrics.json new file mode 100644 index 00000000..f03bd26d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/C18_free_skip_Pass_Through_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/C18_free_skip_Pass_Through.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add support for parsing 'free' and 'skip' boxes as opaque padding segments in the streaming pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A parser or stub is registered that emits ParseEvent entries for 'free' and 'skip' types without decoding payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Byte range metadata (start offset, size) is preserved so UI/CLI presentations list padding regions accurately.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON exports and tree snapshots include nodes with type 'free'/'skip', size, and offsets while omitting payload fields.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Synthetic fixtures are created to cover mixed content scenarios where 'free' boxes interleave with metadata/data boxes.", + "source_line": null + }, + { + "type": "invariant", + "description": "The parsing pipeline must not attempt to decode the payload of 'free' or 'skip' boxes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend BoxParserRegistry with entries for 'free' and 'skip', reusing existing opaque-box utilities similar to 'mdat'.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Register free/skip parser", + "description": "Add entries to BoxParserRegistry that emit ParseEvent for free and skip boxes without decoding payloads.", + "source_line": null + }, + { + "name": "Preserve byte range metadata", + "description": "Ensure start offset and size of free/skip boxes are stored in ParseEvent for downstream UI and CLI consumers.", + "source_line": null + }, + { + "name": "Generate synthetic padding fixtures", + "description": "Create lightweight sample files containing free/skip boxes interleaved with other boxes to test parsing and export.", + "source_line": null + }, + { + "name": "CLI JSON output support", + "description": "Expose free/skip nodes in CLI JSON exports, including type, size, and offsets but no payload data.", + "source_line": null + }, + { + "name": "UI preview integration", + "description": "Allow Combine-backed UI stores to display free/skip nodes without additional work.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2118, + "line_count": 41 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c124d620 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must always register a shared padding parser in BoxParserRegistry so that free/skip nodes emit structured ParsedBoxPayload.PaddingBox details with accurate byte ranges.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit coverage in Tests/ISOInspectorKitTests/BoxParserRegistryTests.swift verifies the registration and emission of padding metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Live pipeline assertions in Tests/ISOInspectorKitTests/ParsePipelineLiveTests.swift confirm correct behavior during runtime.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON export scaffolding must encode padding metadata, as tested by regression coverage in Tests/ISOInspectorKitTests/ParseExportTests.swift.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend JSON export to include padding metadata for free/skip nodes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Documentation trackers must always reflect the completion status of the puzzle.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Free/Skip Opaque Pass-Through Handling", + "description": "Handles free and skip nodes by emitting structured ParsedBoxPayload.PaddingBox details with accurate byte ranges.", + "source_line": null + }, + { + "name": "Shared Padding Parser Registration", + "description": "Registers a shared padding parser in BoxParserRegistry for processing free/skip nodes.", + "source_line": null + }, + { + "name": "JSON Export of Padding Metadata", + "description": "Exports padding metadata to JSON format as part of the system\u2019s export scaffolding.", + "source_line": null + }, + { + "name": "Unit and Live Pipeline Testing", + "description": "Provides unit tests and live pipeline assertions to verify correct handling of free/skip nodes and padding metadata.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 859, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/next_tasks_metrics.json new file mode 100644 index 00000000..8590cded --- /dev/null +++ b/DOCS/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/127_C18_free_skip_Pass_Through/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 871, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/C15_Metadata_Value_Decoding_Expansion_metrics.json b/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/C15_Metadata_Value_Decoding_Expansion_metrics.json new file mode 100644 index 00000000..6d963a9a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/C15_Metadata_Value_Decoding_Expansion_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/C15_Metadata_Value_Decoding_Expansion.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expand metadata value decoding pipeline to render human-readable values for additional ilst data types across CLI and app exports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add decoding coverage for next tranche of MP4RA-listed metadata value types (boolean, signed/unsigned numeric variants, data flavors) with verified fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI JSON export and SwiftUI detail panes display normalized values for each newly supported type without falling back to hex dumps.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests cover at least one fixture per new type, ensuring decodeMetadataValue continues to resolve UTF-8/UTF-16/integer types while exercising the new cases.", + "source_line": null + }, + { + "type": "invariant", + "description": "decodeMetadataValue must always correctly interpret existing UTF-8/UTF-16/integer types and not regress when new types are added.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend decodeMetadataValue(type:data:) in BoxParserRegistry+Metadata.swift to branch on additional four-byte type codes surfaced by MP4RA and recent fixture captures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refresh MP4RA catalog snapshot or add targeted overrides in Sources/ISOInspectorKit/Metadata when upstream registry introduces new identifiers required for decoding.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce fixture updates (or synthetic samples) that emit the new metadata values and update JSON snapshot tests under Tests/ISOInspectorKitTests to confirm human-readable output.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Metadata Value Decoding Pipeline Extension", + "description": "Adds support for decoding new MP4RA metadata value types (boolean, signed/unsigned numeric variants, data flavors) in the CLI and app exports.", + "source_line": null + }, + { + "name": "CLI JSON Export Update", + "description": "Ensures that the command-line interface outputs human-readable values for all supported metadata types instead of hex dumps.", + "source_line": null + }, + { + "name": "SwiftUI Detail Pane Rendering", + "description": "Updates SwiftUI detail panes to display normalized values for newly supported metadata types.", + "source_line": null + }, + { + "name": "Fixture Generation and Management", + "description": "Creates or updates test fixtures emitting new metadata value types and maintains them in the repository.", + "source_line": null + }, + { + "name": "Unit Test Suite Enhancement", + "description": "Adds regression tests covering at least one fixture per new type, verifying correct decoding of UTF-8/UTF-16/integer values.", + "source_line": null + }, + { + "name": "Metadata Registry Refresh", + "description": "Refreshes or overrides MP4RA catalog entries to include identifiers needed for decoding new metadata types.", + "source_line": null + }, + { + "name": "Integration with Validation Rule #15", + "description": "Coordinates changes so that metadata field expansions do not regress pending chunk table audits.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2239, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/Summary_of_Work_metrics.json new file mode 100644 index 00000000..3f2e5047 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/Summary_of_Work.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "Metadata Value Decoding", + "description": "Decodes metadata values for boolean, float32/float64, and common binary payload types (JPEG/PNG/BMP) into human-readable output across parse tree and JSON exporters.", + "source_line": null + }, + { + "name": "Value Kind Exposure in ParsedBoxPayload", + "description": "Provides dedicated value kinds (boolean, float32, float64, data) and DataFormat descriptors within ParsedBoxPayload.MetadataItemListBox.Entry.Value for downstream consumers.", + "source_line": null + }, + { + "name": "Metadata Value Parsing Extension", + "description": "Extends BoxParserRegistry+Metadata.decodeMetadataValue to parse MP4RA type codes 13/14/15/23/24/27 and produce friendly display strings, with future variants noted via @todo.", + "source_line": null + }, + { + "name": "JSON Exporter Enhancement", + "description": "Surfaces new value kinds in JSON output with explicit fields (boolean_value, float32_value, float64_value, data_format) for CLI snapshots.", + "source_line": null + }, + { + "name": "Regression Test Coverage", + "description": "Includes tests exercising metadata decoding paths, synthetic JPEG payloads, and float/boolean fixtures to ensure correctness.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1684, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/next_tasks_metrics.json new file mode 100644 index 00000000..deed90ac --- /dev/null +++ b/DOCS/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/128_C15_Metadata_Value_Decoding_Expansion/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 963, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/C15_Metadata_Value_Type_Expansion_metrics.json b/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/C15_Metadata_Value_Type_Expansion_metrics.json new file mode 100644 index 00000000..66e7ece6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/C15_Metadata_Value_Type_Expansion_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/C15_Metadata_Value_Type_Expansion.md", + "n_spec": 7, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend metadata value decoding coverage so that udta/meta/ilst entries for additional MP4RA-defined data types render human-readable values across the CLI and SwiftUI app exports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "MP4RA metadata value types called out in the backlog (e.g., GIF/TIFF image payloads, signed fixed-point formats, any additional binary encodings) are decoded into readable structures for both CLI and app consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests cover each newly supported value type using fixtures or synthetic payloads while preserving existing coverage for previously handled types.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON export snapshots and app detail panes display meaningful representations for the new value types without regressions in existing metadata output.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and inline code comments reference the MP4RA specification identifiers for each added type to simplify future maintenance.", + "source_line": null + }, + { + "type": "invariant", + "description": "Unrecognized value types still fall back to binary representations with research log entries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the metadata decoder registry in BoxParserRegistry+Metadata.swift and related value adapters, ensuring Combine/UI pipelines continue to emit normalized metadata models.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Metadata Value Decoder Registry Extension", + "description": "Adds support for new MP4RA metadata value types in the decoder registry so CLI and SwiftUI can render human-readable values.", + "source_line": null + }, + { + "name": "Synthetic Payload Generator for Unavailable Fixtures", + "description": "Creates minimal synthetic payloads to drive parser behavior when real samples are not yet available.", + "source_line": null + }, + { + "name": "CLI Metadata Export Update", + "description": "Updates command-line interface to include expanded metadata value decoding in its output and regression snapshots.", + "source_line": null + }, + { + "name": "SwiftUI App Detail Pane Enhancement", + "description": "Enhances SwiftUI app detail panes to display meaningful representations of newly supported metadata types.", + "source_line": null + }, + { + "name": "Automated Test Suite Expansion", + "description": "Adds tests covering each new metadata value type using fixtures or synthetic data, while preserving existing coverage.", + "source_line": null + }, + { + "name": "Validation Hook Integration", + "description": "Reuses validation hooks to ensure unrecognized value types fall back to binary representations with research log entries.", + "source_line": null + }, + { + "name": "Documentation Update for MP4RA Types", + "description": "Updates documentation and inline code comments to reference MP4RA specification identifiers for each added type.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2717, + "line_count": 52 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/Summary_of_Work_metrics.json new file mode 100644 index 00000000..fb546ca1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/Summary_of_Work.md", + "n_spec": 4, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "Metadata value type follow-up is marked complete after landing decoding support for GIF, TIFF, and signed fixed-point MP4RA data types.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extended BoxParserRegistry+Metadata to recognize GIF (type=0x00000C), TIFF (type=0x000010), and signed fixed-point (type=0x000041, 0x000042) payloads, including signature fallbacks for legacy samples.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Added SignedFixedPoint metadata kind plus GIF/TIFF data formats to ParsedBoxPayload and wired JSON export encoding for the new structure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Metadata parser unit tests cover the new formats and verify both field summaries and parsed detail models.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Metadata Value Type Decoding", + "description": "Decodes metadata payloads for GIF, TIFF, and signed fixed-point MP4RA data types", + "source_line": null + }, + { + "name": "BoxParserRegistry+Metadata Extension", + "description": "Extends the box parser registry to recognize new metadata value types and handle legacy signatures", + "source_line": null + }, + { + "name": "SignedFixedPoint Metadata Kind", + "description": "Introduces a new metadata kind for signed fixed-point values", + "source_line": null + }, + { + "name": "GIF/TIFF Data Formats Support", + "description": "Adds support for GIF and TIFF data formats in parsed payloads", + "source_line": null + }, + { + "name": "JSON Export Encoding for New Structures", + "description": "Wires JSON export encoding to include the newly added metadata structures", + "source_line": null + }, + { + "name": "Metadata Parser Unit Tests", + "description": "Provides unit tests covering new formats, field summaries, and parsed detail models", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1225, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/next_tasks_metrics.json new file mode 100644 index 00000000..fac61761 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/129_C15_Metadata_Value_Type_Expansion/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 765, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/12_B5_VR001_VR002_Structural_Validation_metrics.json b/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/12_B5_VR001_VR002_Structural_Validation_metrics.json new file mode 100644 index 00000000..565392fe --- /dev/null +++ b/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/12_B5_VR001_VR002_Structural_Validation_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/12_B5_VR001_VR002_Structural_Validation.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement structural validation rules VR-001 and VR-002 in the streaming parser so that it raises fatal errors when box headers declare impossible sizes or containers fail to close at their declared boundaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VR-001 emits an error-level ValidationIssue whenever a box header\u2019s declared size is smaller than its header length or cannot fit within the remaining file range, and parsing skips forward safely.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VR-002 emits an error-level ValidationIssue when container boxes consume fewer or more bytes than their declared payload before closing, ensuring downstream code cannot assume structural integrity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover normal, undersized, oversized, and truncated scenarios for both rules, including regression fixtures that exercise nested containers and large-size headers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests confirm the streaming pipeline yields VR-001/VR-002 issues through ParsePipeline.live() without crashing, and CLI/UI consumers receive the propagated errors.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parsing must stop when a box header\u2019s declared size is smaller than its header length or cannot fit within the remaining file range (VR-001).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline.live()", + "description": "Streams parsing events enriched with metadata through the BoxValidator pipeline", + "source_line": null + }, + { + "name": "BoxValidator", + "description": "Validates box headers and container integrity during streaming parse", + "source_line": null + }, + { + "name": "VR-001 Validation Rule", + "description": "Emits error when a box header\u2019s declared size is smaller than its header length or cannot fit within remaining file range, then skips forward safely", + "source_line": null + }, + { + "name": "VR-002 Validation Rule", + "description": "Emits error when container boxes consume fewer or more bytes than their declared payload before closing", + "source_line": null + }, + { + "name": "ValidationIssue emission", + "description": "Generates error-level issues for structural validation failures that propagate through the pipeline to CLI/UI consumers", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3289, + "line_count": 49 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ad8a4ece --- /dev/null +++ b/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/Summary_of_Work.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "Headers must not have impossible sizes (VR-001).", + "source_line": null + }, + { + "type": "invariant", + "description": "Container boundaries must match their declared payload; drift is disallowed (VR-002).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming validator rules flag headers with impossible sizes and container boundary drift.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxValidatorTests cover error, underflow, and alignment scenarios, including regression for well-formed containers.", + "source_line": null + }, + { + "type": "invariant", + "description": "Live parsing must surface new issues alongside existing VR-003/VR-006 annotations.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 678, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/next_tasks_metrics.json new file mode 100644 index 00000000..c4373a45 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/12_B5_VR001_VR002_Structural_Validation/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 215, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..3d14fa5d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Summary_of_Work_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Summary_of_Work.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Sample counts across stsc, stsz/stz2, and stco/co64 tables must match; chunk offsets must be monotonic.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When totals diverge or offsets regress, SampleTableCorrelationRule emits VR-015 diagnostics.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "SampleTableCorrelationRule added to BoxValidator to reconcile chunk runs, sample sizes, and chunk offsets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SampleTableCorrelationRule", + "description": "Validates and reconciles chunk runs, sample sizes, and chunk offsets in media boxes, emitting VR-015 diagnostics when totals diverge or offsets regress.", + "source_line": null + }, + { + "name": "ParsePipelineLiveTests for aligned tables", + "description": "Regression tests that verify parsing of aligned tables, detecting sample count mismatches and non-monotonic chunk offsets.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1503, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Validation_Rule_15_Sample_Table_Correlation_metrics.json b/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Validation_Rule_15_Sample_Table_Correlation_metrics.json new file mode 100644 index 00000000..a1e159d0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Validation_Rule_15_Sample_Table_Correlation_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/Validation_Rule_15_Sample_Table_Correlation.md", + "n_spec": 7, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement Validation Rule #15 to cross\u2011check stsc chunk run definitions, stsz/stz2 sample sizes, and stco/co64 chunk offsets so mismatches are surfaced alongside existing edit list duration diagnostics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming validation emits a dedicated VR-015 diagnostic when correlated chunk/sample data is inconsistent (e.g., counts mismatch, offsets not monotonic, or sample totals disagree).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing fixtures covering chunk tables and edit lists gain positive/negative assertions for the new rule without regressing prior validation snapshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation output links to affected boxes (chunk table, sample size table, edit list) for UI highlighting and CLI reporting.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must use existing structured models emitted by BoxParserRegistry for stsc, stsz/stz2, and stco/co64 so validation runs without reparsing payload bytes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the validation aggregation pipeline established in VR-014 to include cross\u2011table summaries and computed totals.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add targeted fixtures or mutate existing archives to cover edge cases such as sparse chunk runs or zero\u2011sized samples.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VR-015 Diagnostic Emission", + "description": "Generates a dedicated VR\u2011015 diagnostic when stsc, stsz/stz2, and stco/co64 tables are inconsistent (count mismatches, non\u2011monotonic offsets, sample total discrepancies).", + "source_line": null + }, + { + "name": "Cross\u2011Table Validation Pipeline Extension", + "description": "Extends the existing VR\u2011014 aggregation pipeline to compute cross\u2011table summaries and totals for stsc, stsz/stz2, and stco/co64.", + "source_line": null + }, + { + "name": "Structured Model Utilization", + "description": "Uses pre\u2011parsed structured models from BoxParserRegistry for stsc, stsz/stz2, and stco/co64 instead of reparsing raw bytes during validation.", + "source_line": null + }, + { + "name": "Edit List Duration Integration", + "description": "Integrates VR\u2011015 diagnostics with edit list duration validation so timing warnings include chunk/sample anomalies.", + "source_line": null + }, + { + "name": "Metadata Coverage Coordination", + "description": "Ensures correlated diagnostics flow through CLI and UI layers by linking affected boxes (chunk table, sample size table, edit list) for highlighting and reporting.", + "source_line": null + }, + { + "name": "Fixture Generation & Mutation", + "description": "Creates or mutates test archives to cover edge cases such as sparse chunk runs, zero\u2011size samples, and misordered offsets for regression testing.", + "source_line": null + }, + { + "name": "Documentation & PRD Updates", + "description": "Updates documentation, workplan, backlog, and todo lists to reflect completion of VR\u2011015 rule implementation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2816, + "line_count": 46 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/next_tasks_metrics.json new file mode 100644 index 00000000..ec491459 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/130_VR15_Sample_Table_Correlation/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 525, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/C16_4_Future_Codec_Payload_Descriptors_metrics.json b/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/C16_4_Future_Codec_Payload_Descriptors_metrics.json new file mode 100644 index 00000000..3bbd138b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/C16_4_Future_Codec_Payload_Descriptors_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/C16_4_Future_Codec_Payload_Descriptors.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide typed parsers and export coverage for upcoming codec payload descriptors (Dolby Vision dvvC, AV1 av1C, VP9 vpcC, Dolby AC-4 dac4, MPEG-H mhaC) so ISOInspector can surface complete metadata as new fixtures land.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Catalog fixtures and decoding references for each targeted payload descriptor, confirming licensing coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Implement typed CodecPayload models and registry wiring for all targeted descriptors with graceful fallback for unknown variants.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extend unit tests and JSON snapshot baselines to include the new payload fields without regressing existing coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update CLI/UI documentation snippets to showcase the additional codec metadata fields once fixtures validate.", + "source_line": null + }, + { + "type": "invariant", + "description": "Feature flags or guarded registry entries must prevent incomplete payloads from shipping without fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing bit reader utilities for packed-field decoding and ensure colour metadata maps onto existing enums.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate fixture acquisition updates through scripts/generate_fixtures.py to record checksums and licenses alongside new samples.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Typed CodecPayload Models", + "description": "Defines strongly\u2011typed data structures for each codec payload descriptor (dvvC, av1C, vpcC, dac4, mhaC) and registers them in the system.", + "source_line": null + }, + { + "name": "Codec Payload Registry Wiring", + "description": "Registers codec payload parsers with a central registry, including graceful fallback handling for unknown or incomplete variants.", + "source_line": null + }, + { + "name": "Fixture Cataloging and Validation", + "description": "Catalogs test fixtures and decoding references for each targeted payload descriptor, verifying licensing coverage and checksum integrity.", + "source_line": null + }, + { + "name": "Unit Test Extension and Snapshot Updates", + "description": "Extends existing unit tests to cover new codec metadata fields and updates JSON snapshot baselines without regressing current coverage.", + "source_line": null + }, + { + "name": "CLI/UI Documentation Snippets Update", + "description": "Updates command\u2011line interface and user\u2011interface documentation to display the additional codec metadata fields once fixtures are validated.", + "source_line": null + }, + { + "name": "Feature Flag / Guarded Registry Implementation", + "description": "Introduces feature flags or guarded registry entries so incomplete payloads do not ship without corresponding fixtures.", + "source_line": null + }, + { + "name": "Bit Reader Utility Reuse", + "description": "Reuses existing bit reader utilities for decoding packed fields (e.g., AV1 operating point flags) and maps colour metadata onto existing enums.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2304, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bdf1c711 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/Summary_of_Work_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/Summary_of_Work.md", + "n_spec": 8, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add typed parsers for Dolby Vision (dvvC), AV1 (av1C), VP9 (vpcC), Dolby AC-4 (dac4), and MPEG-H (mhaC) configuration boxes to support future codec payload descriptors.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update sample entry registries so new visual formats (av01, vp09, vp08, dvav, dvvc) and audio formats (ac-4, mha1, mhm1) participate in visual/audio parsing flows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All unit, integration, and snapshot tests pass for the new parsers and registries on Linux.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The parser registry exposes human-readable fields such as versioning, tiers, bit depths, chroma layouts, presentation counts, compatibility flags for each codec.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parsing logic must correctly handle both clear and protected sample entries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce BoxParserRegistry+SampleDescriptionCodecFuture.swift with dedicated parsing helpers to surface human-readable fields for export and UI consumers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend parseCodecSpecificFields to wire new helpers into existing registry logic.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use reusable BitWriter support in unit test builders to express packed descriptor payloads precisely.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Dolby Vision Payload Parser", + "description": "Parses Dolby Vision dvvC configuration boxes and exposes human-readable fields for UI and export", + "source_line": null + }, + { + "name": "AV1 Payload Parser", + "description": "Parses AV1 av1C configuration boxes and surfaces versioning, tiers, bit depths, chroma layouts, presentation counts, compatibility flags", + "source_line": null + }, + { + "name": "VP9 Payload Parser", + "description": "Parses VP9 vpcC configuration boxes with detailed field extraction for UI consumers", + "source_line": null + }, + { + "name": "Dolby AC-4 Payload Parser", + "description": "Parses Dolby AC-4 dac4 configuration boxes and provides parsed fields to downstream consumers", + "source_line": null + }, + { + "name": "MPEG-H Payload Parser", + "description": "Parses MPEG-H mhaC configuration boxes and exposes parsed metadata", + "source_line": null + }, + { + "name": "Sample Description Registry Extension", + "description": "Extends the BoxParserRegistry to include new visual and audio formats in parsing flows for sample entries", + "source_line": null + }, + { + "name": "BitWriter Utility", + "description": "Reusable builder that writes packed descriptor payloads at bit level for unit test construction", + "source_line": null + }, + { + "name": "StsdSampleDescriptionParserTests Fixture Support", + "description": "Unit tests with fixture-backed coverage for each new codec payload, including snapshot testing", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1448, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/next_tasks_metrics.json new file mode 100644 index 00000000..38011573 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/131_C16_4_Future_Codec_Payload_Descriptors/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 262, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/B6_BoxParserRegistry_metrics.json b/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/B6_BoxParserRegistry_metrics.json new file mode 100644 index 00000000..aaceb62f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/B6_BoxParserRegistry_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/132_B6_Box_Parser_Registry/B6_BoxParserRegistry.md", + "n_spec": 8, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a shared registry that routes MP4/QuickTime box headers to the correct parser implementation for downstream modules (streaming pipeline, CLI, and UI) so they consistently decode typed payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A BoxParserRegistry type maps fourcc and UUID identifiers to parser closures, with facilities to register defaults at startup.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Container defaults recurse into child ranges while opaque leaves capture offset/length metadata without payload inflation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unknown box types return a safe placeholder payload and emit research hooks defined in existing validation rules.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover registry registration, unknown fallback behavior, and parser invocation for representative headers.", + "source_line": null + }, + { + "type": "invariant", + "description": "The streaming pipeline must request the registry instance instead of constructing parsers manually to centralize behavior.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement the registry under Sources/ISOInspectorKit/ISO, exposing a shared instance for app/CLI consumers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Seed registrations for all core Phase C parsers; leave extension points for codec\u2011specific handlers documented in the backlog.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxParserRegistry", + "description": "Central registry mapping MP4/QuickTime box fourcc and UUID identifiers to parser closures, providing a single source of truth for parsing logic.", + "source_line": null + }, + { + "name": "Shared Registry Instance", + "description": "Exposes a shared singleton instance of BoxParserRegistry for app, CLI, and UI consumers to access parsers consistently.", + "source_line": null + }, + { + "name": "Default Parser Registration", + "description": "Initializes the registry with default parsers for all core Phase C box types at startup, including container and leaf handling logic.", + "source_line": null + }, + { + "name": "Container Passthrough Logic", + "description": "Handles container boxes by recursively registering child ranges while capturing offset/length metadata without inflating payloads.", + "source_line": null + }, + { + "name": "Opaque Leaf Handling", + "description": "Captures offset and length metadata for opaque leaf boxes, returning a safe placeholder payload when the type is unknown.", + "source_line": null + }, + { + "name": "Unknown Box Fallback", + "description": "Provides a safe placeholder payload for unrecognized box types and emits research hooks defined in validation rules.", + "source_line": null + }, + { + "name": "Registry Registration API", + "description": "Public interface to register new parser closures for specific fourcc or UUID identifiers, allowing extension points for codec\u2011specific handlers.", + "source_line": null + }, + { + "name": "Streaming Pipeline Integration", + "description": "Ensures the streaming pipeline requests parsers from the registry instead of constructing them manually, centralizing parsing behavior.", + "source_line": null + }, + { + "name": "Unit Test Suite", + "description": "XCTest coverage verifying registry registration, unknown handling, and container passthrough logic.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2129, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/Summary_of_Work_metrics.json new file mode 100644 index 00000000..af174b87 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/132_B6_Box_Parser_Registry/Summary_of_Work.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "When a box is unregistered, the BoxParserRegistry must return a placeholder payload containing byte-range context instead of nil.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The default placeholder parser provides a payload shape that matches the expected structure for unknown boxes.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want the system to surface byte\u2011range context for unregistered boxes so that debugging is easier.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Box Parser Registry", + "description": "Provides a registry for parsing media boxes and returns placeholder payload metadata for unknown boxes", + "source_line": null + }, + { + "name": "Placeholder Payload Generation", + "description": "Generates byte-range context placeholders when unregistered boxes are encountered", + "source_line": null + }, + { + "name": "JSON Export Baselines", + "description": "Exports structured JSON representations of media data, including new placeholder fields in baseline, streaming, and edit-list fixtures", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 851, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/next_tasks_metrics.json new file mode 100644 index 00000000..f758d537 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/132_B6_Box_Parser_Registry/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/132_B6_Box_Parser_Registry/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Acquire real-world fixtures for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H codecs to replace synthetic payloads and refresh snapshot baselines once licensing is cleared.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 394, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/Summary_of_Work_metrics.json new file mode 100644 index 00000000..cc978713 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 416, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/next_tasks_metrics.json new file mode 100644 index 00000000..e2b729e7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/133_Summary_of_Work_2025-10-20_mvex_trex_Defaults/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Acquire real-world fixtures for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H codecs to replace synthetic payloads and refresh snapshot baselines once licensing is cleared.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 308, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/D2_moof_mfhd_Sequence_Number_metrics.json b/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/D2_moof_mfhd_Sequence_Number_metrics.json new file mode 100644 index 00000000..6340b216 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/D2_moof_mfhd_Sequence_Number_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/D2_moof_mfhd_Sequence_Number.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement fragment-level parsing for the moof container and its mfhd header so the CLI and UI expose correct sequence numbers for fragmented MP4 files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ISOInspectorKit parses moof boxes and captures the mfhd.sequence_number field with overflow-safe math.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming pipeline emits fragment nodes with offsets, sizes, and sequence numbers reflected in JSON export snapshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation layer gains basic checks ensuring sequence numbers increment monotonically when multiple fragments are present in a file.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI inspect / UI tree views present the decoded sequence number and no longer show placeholder or missing values for mfhd.", + "source_line": null + }, + { + "type": "invariant", + "description": "Error handling covers absent or zero sequence numbers by emitting validation warnings rather than crashing parsing consumers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing container iteration utilities to traverse moof children while guarding against nested fragment loops.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the box registry with fragment-specific parsers (mfhd, traf, tfhd, etc.) while keeping leaf payloads lightweight until D3 follows up on sample tables.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "moof Container Parser", + "description": "Parses the 'moof' container box and iterates over its child boxes while preventing nested fragment loops.", + "source_line": null + }, + { + "name": "mfhd Header Parser", + "description": "Extracts the 'mfhd.sequence_number' field from the 'mfhd' header with overflow\u2011safe arithmetic.", + "source_line": null + }, + { + "name": "Fragment Node Generator", + "description": "Emits fragment nodes containing offsets, sizes, and sequence numbers into the streaming pipeline for JSON export.", + "source_line": null + }, + { + "name": "Sequence Number Validation", + "description": "Checks that sequence numbers increment monotonically across multiple fragments in a file and issues warnings if absent or zero.", + "source_line": null + }, + { + "name": "CLI Inspect Command Update", + "description": "Updates the CLI 'inspect' command to display decoded sequence numbers instead of placeholders.", + "source_line": null + }, + { + "name": "UI Tree View Enhancement", + "description": "Enhances UI tree views to show fragment sequence numbers from parsed data.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2227, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/Summary_of_Work_metrics.json new file mode 100644 index 00000000..7223b419 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/Summary_of_Work_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/Summary_of_Work.md", + "n_spec": 5, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Support parsing of moof/mfhd sequence numbers in the BoxParserRegistry so that fragment sequence numbers are available through the streaming pipeline, JSON export, and CLI formatting layers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each parsed fragment header must declare a sequence number.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Sequence numbers across fragments must increase monotonically; warnings should be emitted when gaps or regressions occur.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always enforce that fragment sequence numbers are present and monotonic within a stream.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a dedicated MovieFragmentHeaderBox payload in the BoxParserRegistry to expose fragment sequence numbers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "moof Fragment Support", + "description": "Adds support for parsing 'moof' fragments in BoxParserRegistry and exposes fragment sequence numbers through the streaming pipeline.", + "source_line": null + }, + { + "name": "MovieFragmentHeaderBox Payload", + "description": "Introduces a dedicated payload type for MovieFragmentHeaderBox to surface fragment sequence numbers.", + "source_line": null + }, + { + "name": "Sequence Number Validation", + "description": "Validates that each fragment header declares a sequence number and that they increase monotonically, emitting warnings on gaps or regressions.", + "source_line": null + }, + { + "name": "JSON Export of Sequence Numbers", + "description": "Ensures fragment sequence numbers are included in the JSON export layer.", + "source_line": null + }, + { + "name": "CLI Formatting for Sequence Numbers", + "description": "Formats and displays fragment sequence numbers in CLI output.", + "source_line": null + }, + { + "name": "Unit Tests for Parser", + "description": "Provides unit tests covering parsing of moof fragments and validation logic.", + "source_line": null + }, + { + "name": "Live Pipeline Coverage Tests", + "description": "Adds live pipeline tests to confirm end-to-end emission of metadata.", + "source_line": null + }, + { + "name": "Validator Expectations Update", + "description": "Updates validator expectations to reflect new sequence number metadata.", + "source_line": null + }, + { + "name": "DASH Snapshot JSON Update", + "description": "Includes fragment sequence numbers in DASH snapshot JSON for integration testing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 878, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/next_tasks_metrics.json new file mode 100644 index 00000000..b442fe3d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/134_D2_moof_mfhd_Sequence_Number/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Parse D3 fragment data to expose sample run metadata and validate run flags", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture fixtures for multi-fragment streams to exercise monotonic sequence validation over longer timelines", + "source_line": null + } + ], + "functional_units": [ + { + "name": "D3 parse tfhd/trun fragment data", + "description": "Parse the traf/tfhd/tfdt/trun fragment data to expose sample run metadata and validate run flags", + "source_line": null + }, + { + "name": "Capture fixtures for multi-fragment streams", + "description": "Capture test fixtures that allow monotonic sequence validation over longer timelines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 251, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/Summary_of_Work_metrics.json new file mode 100644 index 00000000..8a3e6b80 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Parse and expose moof/mfhd sequence numbers in the media parsing pipeline, JSON export, and CLI formatting.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fragment sequence numbers must exist and be monotonic across fragments.", + "source_line": null + }, + { + "type": "invariant", + "description": "Sequence numbers flow through parse pipeline, JSON export, and CLI formatting consistently.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Registered moof/mfhd handlers via ParsedBoxPayload.MovieFragmentHeaderBox to integrate sequence number parsing into the system.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "moof/mfhd Sequence Number Parser", + "description": "Parses fragment header information from moof/mfhd boxes and registers handlers to flow sequence numbers through the parse pipeline, JSON export, and CLI formatting.", + "source_line": null + }, + { + "name": "Sequence Number Validation", + "description": "Validates that fragment sequence numbers exist and remain monotonic across fragments.", + "source_line": null + }, + { + "name": "JSON Export of Sequence Metadata", + "description": "Exports parsed sequence number metadata in JSON format as part of the system output.", + "source_line": null + }, + { + "name": "CLI Formatting of Sequence Data", + "description": "Formats and displays sequence number information via command-line interface.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 900, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/next_tasks_metrics.json new file mode 100644 index 00000000..ffc110bc --- /dev/null +++ b/DOCS/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/135_Summary_of_Work_2025-10-20_moof_mfhd_Sequence_Number/next_tasks.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must always have a completed D2 moof/mfhd sequence number parser before proceeding to D3 parsing tasks.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement D3 parsing and validation for traf/tfhd/tfdt/trun, establishing sample table scaffolding for fragment runs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The D3 parsing implementation must validate the specified fields and ensure that the sample table scaffolding is correctly established.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world fixtures for Dolby Vision, AV1\u2026 must be acquired before synthetic payloads can be replaced and snapshot baselines refreshed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "moof/mfhd sequence number parser", + "description": "Parses the sequence number from the moof/mfhd box in MP4 fragments", + "source_line": null + }, + { + "name": "traf/tfhd/tfdt/trun parsing and validation", + "description": "Parses and validates traf, tfhd, tfdt, and trun boxes to establish sample table scaffolding for fragment runs", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 537, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/2025-10-21-track-fragment-header_metrics.json b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/2025-10-21-track-fragment-header_metrics.json new file mode 100644 index 00000000..4662b2ac --- /dev/null +++ b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/2025-10-21-track-fragment-header_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/2025-10-21-track-fragment-header.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expose structured parsing for tfhd so fragment run metadata includes track defaults across Kit, CLI, and JSON export surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Public Kit API added/changed: ParsedBoxPayload.Detail.trackFragmentHeader, ParsedBoxPayload.TrackFragmentHeaderBox", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Call sites updated: CLI EventConsoleFormatter, JSON exporter snapshot fixture", + "source_line": null + }, + { + "type": "invariant", + "description": "Backward compatibility: additive parsing and formatting; existing fields remain intact", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsedBoxPayload.Detail.trackFragmentHeader", + "description": "Provides structured access to track fragment header information within parsed box payloads", + "source_line": null + }, + { + "name": "ParsedBoxPayload.TrackFragmentHeaderBox", + "description": "Represents the parsed track fragment header box data structure", + "source_line": null + }, + { + "name": "BoxParserRegistry+MovieFragments", + "description": "Registers and parses movie fragment boxes, including tfhd parsing", + "source_line": null + }, + { + "name": "JSONParseTreeExporter", + "description": "Exports parsed box payloads to JSON format, including track fragment header details", + "source_line": null + }, + { + "name": "EventConsoleFormatter", + "description": "Formats event console output for CLI, incorporating track fragment header information", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1055, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/D3_traf_tfhd_tfdt_trun_Parsing_metrics.json b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/D3_traf_tfhd_tfdt_trun_Parsing_metrics.json new file mode 100644 index 00000000..5945afee --- /dev/null +++ b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/D3_traf_tfhd_tfdt_trun_Parsing_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/D3_traf_tfhd_tfdt_trun_Parsing.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide fragment run parsing for traf, tfhd, tfdt, and trun boxes so ISOInspector exposes accurate sample table metadata for fragmented MP4 files across CLI, library exports, and UI surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ISOInspectorKit registers parsers for traf, tfhd, tfdt, and trun, emitting strongly typed models that honor optional fields governed by each flag bit.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming events, JSON exports, and CLI output include fragment run details: track IDs, default/sample flags, base decode time, sample counts, sizes, durations, and optional data offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and snapshot tests cover representative flag combinations (e.g., data-offset present, first-sample-flags overrides) and guard against malformed counts or offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation layer gains initial checks that correlate trun metadata with trex defaults and fail gracefully when runs declare zero progress or inconsistent array lengths.", + "source_line": null + }, + { + "type": "invariant", + "description": "Bounds and overflow checks on cumulative sample durations/sizes must mirror existing sample table protections, emitting warnings instead of crashing on malformed data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse FullBoxReader to read tfhd/trun version and flag fields, applying trex defaults when optional values are absent.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the streaming parser to accumulate fragment state so downstream consumers can cross-reference tfdt base decode time and trun timestamps during validation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update JSON export schemas and fixtures to include fragment run payloads; refresh CLI snapshot baselines.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "traf box parser", + "description": "Parses the 'traf' container box to expose fragment run metadata such as track IDs and default/sample flags", + "source_line": null + }, + { + "name": "tfhd box parser", + "description": "Reads 'tfhd' full-box fields, applies trex defaults, and emits typed model for track fragment header information", + "source_line": null + }, + { + "name": "tfdt box parser", + "description": "Parses 'tfdt' base decode time and makes it available to downstream consumers", + "source_line": null + }, + { + "name": "trun box parser", + "description": "Decodes 'trun' sample run data including counts, sizes, durations, offsets and optional flags", + "source_line": null + }, + { + "name": "fragment state accumulator", + "description": "Accumulates fragment-level state across boxes so downstream consumers can cross-reference tfdt and trun data during validation", + "source_line": null + }, + { + "name": "JSON export schema update", + "description": "Extends JSON export to include fragment run payloads with new fields", + "source_line": null + }, + { + "name": "CLI snapshot baseline refresh", + "description": "Updates CLI output snapshots to assert presence of new fragment run details", + "source_line": null + }, + { + "name": "validation layer enhancement", + "description": "Adds checks correlating trun metadata with trex defaults and guards against zero progress or inconsistent array lengths", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2755, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/Summary_of_Work_metrics.json new file mode 100644 index 00000000..26d748b5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/Summary_of_Work_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/Summary_of_Work.md", + "n_spec": 0, + "n_func": 6, + "intent_atoms": [], + "functional_units": [ + { + "name": "tfhd Track Fragment Header Parser", + "description": "Parses tfhd boxes in ISO media files and surfaces structured metadata for each track fragment.", + "source_line": null + }, + { + "name": "CLI Console Formatter Extension", + "description": "Formats parsed box data into human\u2011readable console output, including tfhd details.", + "source_line": null + }, + { + "name": "JSON Parse Tree Exporter", + "description": "Exports the full parse tree of ISO boxes to JSON, regenerating DASH segment snapshots.", + "source_line": null + }, + { + "name": "DASH Segment Snapshot Regeneration", + "description": "Recreates a snapshot of a DASH segment in JSON format from parsed box data.", + "source_line": null + }, + { + "name": "Parser Unit Tests for tfhd", + "description": "Automated tests validating correct parsing of tfhd boxes.", + "source_line": null + }, + { + "name": "Console Formatter Unit Tests", + "description": "Tests ensuring console output correctly reflects parsed data.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1146, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/next_tasks_metrics.json new file mode 100644 index 00000000..c7a1d5dd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/136_Summary_of_Work_2025-10-21_tfhd_Track_Fragment_Header/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement parsing and validation for D3 tasks involving traf/tfhd/tfdt/trun to establish sample table scaffolding for fragment runs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration coverage must be added for multi-fragment assets once suitable fixtures are available, exercising the D2 monotonic validation paths end-to-end.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real-world fixtures for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H codecs must be acquired before synthetic payloads can be replaced and snapshot baselines refreshed due to licensing constraints.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "D3 Parsing and Validation", + "description": "Parses and validates traf/tfhd/tfdt/trun boxes to establish sample table scaffolding for fragment runs", + "source_line": null + }, + { + "name": "Integration Coverage for Multi-Fragment Assets", + "description": "Adds integration tests covering multi-fragment assets to exercise D2 monotonic validation paths end-to-end", + "source_line": null + }, + { + "name": "Real-World Fixture Acquisition", + "description": "Acquires real-world media fixtures for Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG-H codecs to replace synthetic payloads and refresh snapshot baselines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 570, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/D3_traf_tfhd_tfdt_trun_Parsing_metrics.json b/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/D3_traf_tfhd_tfdt_trun_Parsing_metrics.json new file mode 100644 index 00000000..4addd79e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/D3_traf_tfhd_tfdt_trun_Parsing_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/D3_traf_tfhd_tfdt_trun_Parsing.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement fragment run parsing for traf, tfhd, tfdt, and trun boxes to expose accurate sample timing, offsets, and flag-driven defaults in ISOInspector.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Register parsers for traf, tfhd, tfdt, and trun that emit typed models respecting flag-controlled optional fields and trex defaults.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming events, JSON exports, and CLI rendering must include fragment run details: track IDs, base decode times, sample counts, sizes, durations, data offsets, and optional per-sample overrides.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation must cross-check trun payloads against trex defaults, rejecting inconsistent counts or zero-progress runs while handling errors gracefully.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and snapshot tests cover representative flag combinations (e.g., data-offset present, first-sample-flags overrides) and malformed boundary cases.", + "source_line": null + }, + { + "type": "invariant", + "description": "Fragment state must be maintained within the streaming pipeline so tfdt base decode times and trun sample timing feed aggregation logic shared by validation, export, and UI layers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse FullBoxReader helpers for (version, flags) decoding and pipe defaults from existing trex models when optional fields are omitted.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update JSON schemas, snapshots, and CLI fixtures to include fragment run payloads; refresh any impacted UI previews once streaming structs change.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "traf Box Parser", + "description": "Parses the 'traf' box to extract fragment run metadata such as track ID and associated child boxes.", + "source_line": null + }, + { + "name": "tfhd Box Parser", + "description": "Parses the 'tfhd' box to read track fragment header information, including flags and default values for sample properties.", + "source_line": null + }, + { + "name": "tfdt Box Parser", + "description": "Parses the 'tfdt' box to decode base decode time for each fragment run.", + "source_line": null + }, + { + "name": "trun Box Parser", + "description": "Parses the 'trun' box to read sample count, data offset, duration, size, flags and per\u2011sample entries.", + "source_line": null + }, + { + "name": "Fragment Run Validation", + "description": "Validates trun payloads against trex defaults, ensuring consistency and error handling for malformed runs.", + "source_line": null + }, + { + "name": "Streaming State Management", + "description": "Maintains fragment state across the streaming pipeline to provide base decode times and sample timing information to downstream layers.", + "source_line": null + }, + { + "name": "JSON Export Extension", + "description": "Extends JSON schemas and exports to include fragment run details such as track ID..", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2808, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/Summary_of_Work_metrics.json new file mode 100644 index 00000000..a44acc04 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/Summary_of_Work_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/Summary_of_Work.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must always register tfdt, trun, and traf parsers in BoxParserRegistry to provide fragment environment plumbing.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide structured payloads for track fragments with resolved defaults.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Typed models for track fragment decode time, run entries, and aggregated fragment summaries must be available with JSON and CLI formatting coverage.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation must include VR-017 fragment run checks.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expose fragment metadata in DASH segment exports via refreshed snapshot.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All tests (swiftswift test\u00a0\u2026\u00a0..?\u2026??", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Track Fragment Parser Registration", + "description": "Registers tfdt, trun, and traf parsers in BoxParserRegistry to handle track fragment parsing.", + "source_line": null + }, + { + "name": "Typed Models for Track Fragment Data", + "description": "Provides typed models for decode time, run entries, and aggregated fragment summaries with JSON and CLI formatting.", + "source_line": null + }, + { + "name": "Fragment Run Validation", + "description": "Extends validation logic with VR-017 checks for fragment runs.", + "source_line": null + }, + { + "name": "DASH Segment Snapshot Export", + "description": "Refreshes DASH segment snapshot to include fragment metadata in exports.", + "source_line": null + }, + { + "name": "CLI Formatting for Fragment Summaries", + "description": "Formats track fragment summaries for command-line interface output.", + "source_line": null + }, + { + "name": "JSON Export of Fragment Metadata", + "description": "Exports structured payloads with JSON formatting for track fragments.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1257, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/next_tasks_metrics.json new file mode 100644 index 00000000..d5f380e3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/137_D3_traf_tfhd_tfdt_trun_Parsing/next_tasks.md", + "n_spec": 2, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must always maintain accurate fragment parsing and validation for traf/tfhd/tfdt/trun fragments.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Fragment coverage expansion with multi-trun, negative data_offset, composition offset, and missing tfdt fixtures is now documented in DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Fragment_Fiber...", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fragment Run Parsing and Validation", + "description": "Parses, validates, and exports fragment run data for traf/tfhd/tfdt/trun fragments.", + "source_line": null + }, + { + "name": "Fragment Coverage Expansion Documentation", + "description": "Provides expanded coverage of multi-trun, negative data_offset, composition offset, and missing tfdt scenarios with verification details.", + "source_line": null + }, + { + "name": "Downstream Validator and CLI Polish Intake", + "description": "Evaluates and queues downstream validator and CLI polish tasks that consume new fragment summaries once additional DASH/HLS fixtures are available.", + "source_line": null + }, + { + "name": "Real-World Fixture Acquisition for Codecs", + "description": "Acquires real-world media fixtures for Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H to replace synthetic payloads and refresh snapshot baselines after licensing clearance.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 960, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Fragment_Fixture_Coverage_metrics.json b/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Fragment_Fixture_Coverage_metrics.json new file mode 100644 index 00000000..a82676f5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Fragment_Fixture_Coverage_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Fragment_Fixture_Coverage.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expand the fragment fixture catalog with synthetic samples that stress new traf/tfhd/tfdt/trun parsing paths so the validator, CLI, and exports exercise multi-run edge cases before assets are promoted into the golden regression set.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New fixtures capture scenarios noted after Task D3: multi-trun runs, negative data_offset, fragments without tfdt, version 0 composition offsets and are registered in the fixture catalog with licensing metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression assets are wired into Swift test suites and JSON/CLI snapshot baselines so fragment summaries and validation warnings are asserted end-to-end.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in the fixture catalog README reflects additional generation profiles or manifest entries required to reproduce new assets locally.", + "source_line": null + }, + { + "type": "invariant", + "description": "Existing fixture automation generate_fixtures.py already regenerates catalogued assets with checksum enforcement, making it the preferred entry point for expanding fragment coverage.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Tests/ISOInspectorKitTests/Fixtures/generate_fixtures.py and its manifest workflow to produce deterministic fragment assets, storing large binaries under documented fixture directories with mirrored license texts.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update Documentation/FixtureCatalog/manifest.json, Tests/ISOInspectorKitTests/Fixtures/catalog.json and related README guidance to describe new fragment profiles and reproduction commands.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Generate Synthetic Fragment Fixtures", + "description": "Creates deterministic MP4 fragment assets covering multi-trun runs, negative data_offset, missing tfdt, and default composition offsets via generate_fixtures.py", + "source_line": null + }, + { + "name": "Register Fixtures in Catalog", + "description": "Adds new fixture entries to catalog.json with licensing metadata and manifest updates", + "source_line": null + }, + { + "name": "Update Documentation for New Profiles", + "description": "Refreshes README and manifest files to describe reproduction commands and profile details", + "source_line": null + }, + { + "name": "Run Fragment Coverage Tests", + "description": "Executes Swift test suites (FixtureCatalogExpandedCoverageTests, JSONExportSnapshotTests, FragmentFixtureCoverageTests) to assert fragment summaries and validation warnings end-to-end", + "source_line": null + }, + { + "name": "Update CLI Snapshot Baselines", + "description": "Refreshes command-line integration snapshots after confirming new fixtures", + "source_line": null + }, + { + "name": "Maintain License Texts for Large Binaries", + "description": "Stores large binary fixture files with mirrored license texts in documented directories", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3375, + "line_count": 32 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d3ff4c72 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/Summary_of_Work.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add synthetic fragment fixtures covering multi-`trun` aggregation, negative `data_offset` handling, and fragments without `tfdt` while exercising version 0 composition offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Generated new base64 fixtures (`fragmented_multi_trun`, `fragmented_negative_offset`, `fragmented_no_tfdt`) via `generate_fixtures.py` and registered them in `Tests/ISOInspectorKitTests/Fixtures/catalog.json` with descriptive tags and expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extended `FixtureCatalogExpandedCoverageTests`, `JSONExportSnapshotTests`, and the new `FragmentFixtureCoverageTests` to assert run aggregation, decode-time defaults, and CLI/export snapshots for the additional fixtures.", + "source_line": null + }, + { + "type": "invariant", + "description": "Updated catalog metadata, fixture documentation, and JSON snapshot baselines so validator, CLI, and export flows incorporate the new assets.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Documented regeneration steps in `Documentation/FixtureCatalog/README.md` and `Tests/ISOInspectorKitTests/Fixtures/README.md`; marked the puzzle as complete in `DOCS/INPROGRESS/next_tasks.md`", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verify by running `swift test --filter FragmentFixtureCoverageTests` and `swift test --filter JSONExportSnapshotTests`. ", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fragment Fixture Coverage", + "description": "Provides synthetic fragment fixtures covering multi-trun aggregation, negative data_offset handling, and fragments without tfdt while exercising version 0 composition offsets.", + "source_line": null + }, + { + "name": "Fixture Catalog Registration", + "description": "Registers new base64 fixtures in the catalog with descriptive tags and expectations for use by validator, CLI, and export flows.", + "source_line": null + }, + { + "name": "Fixture Coverage Tests", + "description": "Runs tests to assert run aggregation, decode-time defaults, and CLI/export snapshots for additional fixtures.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Tests", + "description": "Validates JSON export snapshots against baseline data for the new fixtures.", + "source_line": null + }, + { + "name": "Documentation of Regeneration Steps", + "description": "Documents steps to regenerate fixtures in README files and marks puzzle completion.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1233, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/next_tasks_metrics.json new file mode 100644 index 00000000..6ad53cea --- /dev/null +++ b/DOCS/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/138_Fragment_Fixture_Coverage/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Fragment Fixture Coverage now includes multi-trun, negative data_offset, missing tfdt, and composition offset fixtures to cover fragment parser edge cases.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validator & CLI Polish: audit downstream consumers of the fragment summaries (validators, CLI formatting) and queue readability or diagnostics adjustments enabled by new data.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real-World Assets must wait for external licensing approvals before synthetic payloads can be replaced and regression baselines refreshed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fragment Fixture Coverage", + "description": "Provides comprehensive test fixtures covering fragment parser edge cases such as multi-trun, negative data_offset, missing tfdt, and composition offset.", + "source_line": null + }, + { + "name": "Validator & CLI Polish", + "description": "Audits downstream consumers of fragment summaries, adjusting readability or diagnostics for validators and CLI formatting based on new data.", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H to replace synthetic payloads with real-world assets and refresh regression baselines.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 852, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c6838ae6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Summary_of_Work_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Summary_of_Work.md", + "n_spec": 0, + "n_func": 3, + "intent_atoms": [], + "functional_units": [ + { + "name": "VR-017 Diagnostics Enhancement", + "description": "Provides detailed diagnostics for VR-017 validation errors, including track/run context and missing entry indexes.", + "source_line": null + }, + { + "name": "CLI Formatter Extension", + "description": "Extends the command\u2011line interface to display run indices, decode/presentation ranges, and data offset coverage for fragment fixtures.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Support", + "description": "Enables exporting snapshots in JSON format without requiring schema updates after verification.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 738, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Validator_and_CLI_Polish_metrics.json b/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Validator_and_CLI_Polish_metrics.json new file mode 100644 index 00000000..1054fe60 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Validator_and_CLI_Polish_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/139_Validator_and_CLI_Polish/Validator_and_CLI_Polish.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure validator messaging, CLI formatting, and JSON export snapshots fully incorporate the expanded fragment fixture metadata so diagnostics and summaries stay accurate and readable for complex moof/traf scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxValidator (and related validation rule surfaces) reflect fragment fixture metadata without regressions, emitting diagnostics that reference run aggregation, offsets, and timing where applicable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "isoinspect CLI output (human-readable and JSON modes) formats the new fragment details coherently, including friendly headings, ordering, and highlighting for warnings/errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON export snapshots and associated tests remain stable or are updated deliberately to match the refined formatter output for the new fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation or release notes are refreshed if user-facing CLI/validator messaging changes materially.", + "source_line": null + }, + { + "type": "invariant", + "description": "System constraints or rules that must always hold: The validator and CLI must consistently present fragment metadata across all modes without regressions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Review and align diagnostic text in BoxValidator.swift with newly captured metadata; audit CLI printers to ensure consistent rendering; coordinate documentation updates before publishing changes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxValidator Diagnostic Generation", + "description": "Generates diagnostics for ISO boxes, incorporating expanded fragment fixture metadata such as run aggregation, offsets, and timing.", + "source_line": null + }, + { + "name": "ISOInspector CLI Human-Readable Output", + "description": "Formats validation results into a user-friendly console display with headings, ordering, and highlighting for warnings/errors.", + "source_line": null + }, + { + "name": "ISOInspector CLI JSON Export", + "description": "Outputs validation results in JSON format, including detailed fragment metadata and maintaining snapshot stability.", + "source_line": null + }, + { + "name": "Fragment Metadata Formatter", + "description": "Shared formatting helpers that render fragment summaries consistently across the CLI and documentation.", + "source_line": null + }, + { + "name": "Validation Rule Surface Update", + "description": "Updates rule types to align diagnostic text with newly captured fragment fixture metadata.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3195, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/next_tasks_metrics.json new file mode 100644 index 00000000..f1bf6236 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/139_Validator_and_CLI_Polish/next_tasks_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/139_Validator_and_CLI_Polish/next_tasks.md", + "n_spec": 3, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Validator diagnostics and CLI formatting must incorporate fragment fixture metadata", + "source_line": null + }, + { + "type": "invariant", + "description": "JSON export snapshots must be revalidated with expanded coverage", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Validator Diagnostics", + "description": "Provides diagnostic information for validation processes", + "source_line": null + }, + { + "name": "CLI Formatting", + "description": "Formats command-line interface output incorporating fragment fixture metadata", + "source_line": null + }, + { + "name": "JSON Export Snapshots", + "description": "Exports snapshots in JSON format and revalidates them with expanded coverage", + "source_line": null + }, + { + "name": "Real-World Asset Licensing", + "description": "Manages licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 543, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/13_B5_VR004_VR005_Ordering_Validation_metrics.json b/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/13_B5_VR004_VR005_Ordering_Validation_metrics.json new file mode 100644 index 00000000..377ed908 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/13_B5_VR004_VR005_Ordering_Validation_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/13_B5_VR004_VR005_Ordering_Validation.md", + "n_spec": 11, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement remaining B5 ordering rules so the streaming validator surfaces VR-004 when no ftyp appears before media boxes and VR-005 when moov trails mdat outside of explicit streaming scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming parses raise a VR-004 error if any media-designated box (moov, mdat, trak, moof, etc.) arrives before an ftyp, and tests assert the issue flows through ParsePipeline.live() and CLI formatters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VR-005 warnings trigger when mdat precedes moov unless an accepted streaming signal (e.g., mvex/fragmented layout flag) was observed, with fixtures covering both the violation and the allowed exception.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation summaries and research logs continue to include VR-006 information without regression, ensuring ordering signals feed the broader metadata UX plans.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and backlog trackers update to reflect VR-004/VR-005 completion and remaining VR-006 follow-up work.", + "source_line": null + }, + { + "type": "invariant", + "description": "The validator state machine must track whether ftyp appeared before other top-level media boxes, leveraging existing event ordering guarantees from the streaming pipeline.", + "source_line": null + }, + { + "type": "invariant", + "description": "The set of boxes considered \"media\" for VR-004 is defined and references MP4RA catalog metadata so additions remain future\u2011proof once B4 integration lands.", + "source_line": null + }, + { + "type": "invariant", + "description": "For VR-005, watch for moov and mdat top-level encounters while recognizing fragmented workflows (e.g., presence of mvex, sidx, moof) as streaming-friendly layouts to avoid false positives.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the validator state machine to track ftyp appearance before other top-level media boxes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define the set of media boxes for VR-004 using MP4RA catalog metadata.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Recognize fragmented workflows (mvex, sidx, moof) as streaming-friendly layouts to avoid false positives for VR-005.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Streaming Validator Ordering Rules", + "description": "Enforces VR-004 and VR-005 ordering constraints during streaming parsing", + "source_line": null + }, + { + "name": "FTYP Presence Tracker", + "description": "Tracks whether an ftyp box has appeared before other top-level media boxes", + "source_line": null + }, + { + "name": "Media Box Set Definition", + "description": "Defines the set of boxes considered media for VR-004 validation", + "source_line": null + }, + { + "name": "Fragmented Layout Detector", + "description": "Detects presence of mvex, sidx, moof to identify streaming-friendly layouts and suppress VR-005 warnings", + "source_line": null + }, + { + "name": "Moov-Mdat Ordering Checker", + "description": "Checks top-level encounters of moov and mdat to trigger VR-005 warnings when appropriate", + "source_line": null + }, + { + "name": "ParsePipeline Integration", + "description": "Integrates ordering rule checks into ParsePipeline.live() flow and CLI formatters", + "source_line": null + }, + { + "name": "Unit & Integration Test Fixtures", + "description": "Provides deterministic test cases for both violation and compliant sequences for VR-004/VR-005", + "source_line": null + }, + { + "name": "CLI/UI Messaging Extension", + "description": "Coordinates error/warning output with VR-006 research logging for downstream consumers", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3511, + "line_count": 55 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e5353597 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/Summary_of_Work.md", + "n_spec": 7, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Flag media boxes that appear before the required ftyp declaration during live parsing (VR-004).", + "source_line": null + }, + { + "type": "user_story", + "description": "Warn when mdat precedes moov outside of recognized streaming layouts (VR-005).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Implement stateful ordering rules in BoxValidator to track file-type and movie box sequencing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Expand live pipeline tests to cover VR-004/VR-005 violations and permitted streaming exceptions.", + "source_line": null + }, + { + "type": "invariant", + "description": "Box ordering must respect ftyp before other boxes except allowed streaming layouts.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Centralise MP4 container box detection through FourCharContainerCode enum instead of string literals.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use MediaAndIndexBoxCode enum to strongly type mdat, sidx, styp and replace raw strings in validators.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxValidator Ordering Rules", + "description": "Validates the sequence of MP4 boxes during live parsing, flagging media boxes before ftyp (VR-004) and mdat before moov outside streaming layouts (VR-005).", + "source_line": null + }, + { + "name": "FourCharContainerCode Enum", + "description": "Centralised enumeration for MP4 container box detection used in traversal logic.", + "source_line": null + }, + { + "name": "MediaAndIndexBoxCode Enum", + "description": "Strongly typed enumeration for media and index boxes (mdat, sidx, styp) with conversion helpers and category sets.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1500, + "line_count": 49 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/next_tasks_metrics.json new file mode 100644 index 00000000..08226c85 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/13_B5_VR004_VR005_Ordering_Validation/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 215, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/D5_mfra_tfra_mfro_Random_Access_metrics.json b/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/D5_mfra_tfra_mfro_Random_Access_metrics.json new file mode 100644 index 00000000..a9081d27 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/D5_mfra_tfra_mfro_Random_Access_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/D5_mfra_tfra_mfro_Random_Access.md", + "n_spec": 8, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide parsing and data-model support for the mfra, tfra, and mfro random access boxes so ISOInspector surfaces fragment index metadata across the core library, CLI, and UI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "mfra, tfra, and mfro parsers emit structured nodes via BoxParserRegistry, preserving offsets, sizes, and per-track random access entries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Sample fixtures (fragmented MP4/DASH) produce deterministic random access metadata that flows through CLI output, JSON export, and the SwiftUI detail views.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests cover representative entry combinations (single-track, multi-track, and empty tables) and guard against malformed lengths or inconsistent offsets.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the parser registry and decoding layer with dedicated types for MovieFragmentRandomAccessBox, TrackFragmentRandomAccessBox, and MovieFragmentRandomAccessOffsetBox, mirroring the earlier fragment parser style.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse stream context established in D3 (traf/tfhd/tfdt/trun) to correlate random access entries with fragment sequence numbers where data is available.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update CLI formatting, JSON export, and UI presentation helpers so random access entries display track IDs, times, and offsets without regressing existing snapshot tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validate payload ranges against the Phase E containment rules once those checks land, ensuring random access metadata does not flag false positives.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "mfra Box Parser", + "description": "Parses the MovieFragmentRandomAccessBox and emits structured nodes with offsets, sizes, and per-track random access entries.", + "source_line": null + }, + { + "name": "tfra Box Parser", + "description": "Parses the TrackFragmentRandomAccessBox and emits structured nodes with track-specific random access entries.", + "source_line": null + }, + { + "name": "mfro Box Parser", + "description": "Parses the MovieFragmentRandomAccessOffsetBox and emits structured nodes with offset information for fragmented MP4s.", + "source_line": null + }, + { + "name": "CLI Random Access Output Formatter", + "description": "Formats and displays random access metadata in the command-line interface, showing track IDs, times, and offsets.", + "source_line": null + }, + { + "name": "JSON Export of Random Access Metadata", + "description": "Exports parsed random access data to JSON format for downstream consumption.", + "source_line": null + }, + { + "name": "SwiftUI Detail View for Random Access", + "description": "Displays random access entries (track ID, time, offset) in the SwiftUI UI detail views.", + "source_line": null + }, + { + "name": "Parser Registry Extension", + "description": "Extends BoxParserRegistry to include mfra, tfra, and mfro parsers.", + "source_line": null + }, + { + "name": "Stream Context Correlation", + "description": "Correlates random access entries with fragment sequence numbers using existing traf/tfhd/tfdt/trun context.", + "source_line": null + }, + { + "name": "Automated Random Access Tests", + "description": "Unit tests covering single-track, multi-track, empty tables, and malformed payloads for mfra/tfra/ mfro parsing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2307, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bc434b52 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/Summary_of_Work_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/Summary_of_Work.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expose random access metadata through parsed payload models for mfra, tfra, and mfro boxes", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide CLI output and JSON export of random access metadata via EventConsoleFormatter and JSONParseTreeExporter", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsedBoxPayload must expose typed track summaries and offset metadata for mfra, tfra, and mfro boxes", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "RandomAccessIndexCoordinator tracks fragment order and provides lookup context to parsers", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "tfra entries correlate with previously parsed traf/trun fragments", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover random access parsing, CLI formatting, and JSON export", + "source_line": null + }, + { + "type": "invariant", + "description": "RandomAccessIndexCoordinator must always maintain fragment order consistency", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Dedicated random access parsers added to BoxParserRegistry with TaskLocal environment plumbing", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsedBoxPayload Accessors for Random Access Boxes", + "description": "Exposes typed track summaries and offset metadata from parsed mfra, tfra, and mfro boxes via ParsedBoxPayload accessors.", + "source_line": null + }, + { + "name": "RandomAccessParser Registration in BoxParserRegistry", + "description": "Registers dedicated parsers for random access tables (mfra, tfra, mfro) and wires TaskLocal environment so tfra entries correlate with previously parsed traf/trun fragments.", + "source_line": null + }, + { + "name": "RandomAccessIndexCoordinator in ParsePipeline", + "description": "Tracks fragment order, provides lookup context to parsers, aggregates mfra summaries, and emits them alongside existing fragment payloads during parsing.", + "source_line": null + }, + { + "name": "CLI Output Enhancement for Random Access Metadata", + "description": "Updates EventConsoleFormatter to surface random access metadata in command\u2011line output.", + "source_line": null + }, + { + "name": "JSON Export of Parse Trees with Random Access Data", + "description": "Extends JSONParseTreeExporter to include random access metadata in exported parse trees.", + "source_line": null + }, + { + "name": "Unit Tests for Random Access Parsing and Formatting", + "description": "Provides test suites (e.g., TfraTrackFragmentRandomAccessParserTests) covering parsing, CLI formatting, and JSON export behaviors.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1702, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/next_tasks_metrics.json new file mode 100644 index 00000000..a673c1be --- /dev/null +++ b/DOCS/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/next_tasks_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/140_D5_mfra_tfra_mfro_Random_Access/next_tasks.md", + "n_spec": 5, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build random access table parsing so fragment indexing metadata is available across ISOInspectorKit, CLI, and UI flows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Random access tables are implemented for mfra/tfra/mfro fragments and accessible in all three flows (ISOInspectorKit, CLI, UI).", + "source_line": null + }, + { + "type": "invariant", + "description": "The implementation must be completed before the next tasks can proceed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines once approvals land.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals are obtained for all listed codecs and assets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Random Access Table Parsing", + "description": "Builds random access table parsing so fragment indexing metadata is available across ISOInspectorKit, CLI, and UI flows.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Integration", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 542, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/2025-10-21-sample-encryption-parser-alignment_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/2025-10-21-sample-encryption-parser-alignment_metrics.json new file mode 100644 index 00000000..88288765 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/2025-10-21-sample-encryption-parser-alignment_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/2025-10-21-sample-encryption-parser-alignment.md", + "n_spec": 7, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Align the new senc/saio/saiz parser scaffolding with targeted unit tests so placeholder metadata is emitted consistently.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Public Kit API added/changed: ParsedBoxPayload.Detail now exposes sampleEncryption, sampleAuxInfoOffsets, and sampleAuxInfoSizes detail structs with range helpers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser registry registration for senc/saio/saiz boxes uses the new detail accessors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing consumers continue to parse previous detail cases; JSON exporter keeps placeholders until D6B lands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests: SencSampleEncryptionParserTests, SaioSampleAuxInfoOffsetsParserTests, SaizSampleAuxInfoSizesParserTests are implemented and pass.", + "source_line": null + }, + { + "type": "invariant", + "description": "Backward compatibility must be maintained for existing consumers parsing previous detail cases.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Kit components involved: BoxParserRegistry+MovieFragments, ParsedBoxPayload, BoxParserRegistry+DefaultParsers, JSONParseTreeExporter.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsedBoxPayload.Detail sampleEncryption accessor", + "description": "Provides access to parsed sample encryption metadata for a box", + "source_line": null + }, + { + "name": "ParsedBoxPayload.Detail sampleAuxInfoOffsets accessor", + "description": "Provides access to parsed auxiliary info offsets metadata for a box", + "source_line": null + }, + { + "name": "ParsedBoxPayload.Detail sampleAuxInfoSizes accessor", + "description": "Provides access to parsed auxiliary info sizes metadata for a box", + "source_line": null + }, + { + "name": "BoxParserRegistry registration for senc boxes", + "description": "Registers the parser for 'senc' boxes in the registry", + "source_line": null + }, + { + "name": "BoxParserRegistry registration for saio boxes", + "description": "Registers the parser for 'saio' boxes in the registry", + "source_line": null + }, + { + "name": "BoxParserRegistry registration for saiz boxes", + "description": "Registers the parser for 'saiz' boxes in the registry", + "source_line": null + }, + { + "name": "JSONParseTreeExporter placeholder emission for sample encryption metadata", + "description": "Exports placeholder JSON when sample encryption metadata is not yet available", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1087, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6A_Register_Sample_Encryption_Parsers_PRD_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6A_Register_Sample_Encryption_Parsers_PRD_metrics.json new file mode 100644 index 00000000..5944bdf5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6A_Register_Sample_Encryption_Parsers_PRD_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6A_Register_Sample_Encryption_Parsers_PRD.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add dedicated stub-level parsers for the senc, saio, and saiz Common Encryption helper boxes to capture version headers, entry counts, and byte ranges without touching protected payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsedBoxPayload objects emitted from the new handlers include version/flags (where applicable), IV size hints, table lengths, and byte ranges for the box content and auxiliary tables.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Registry lookups resolve the new parser identifiers so streaming parses of fragmented files capture placeholder metadata without throwing or skipping nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser unit tests feed synthetic senc, saio, and saiz payloads through the registry and assert emitted field values and byte ranges follow expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming integration tests parse a fragmented fixture containing the placeholder boxes, verifying no crashes occur when tables are empty, duplicated, or contain out-of-range offsets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Each read must be guarded with payload range checks and return informational validation issues if entries exceed the box payload to avoid crashes during malformed inputs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Register new parser functions sampleEncryption, sampleAuxInfoOffsets, and sampleAuxInfoSizes under BoxParserRegistry.DefaultParsers using FullBoxReader pattern and mirror existing field emission patterns.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire the new handlers into the fragment registry so traf traversal automatically invokes them when the boxes appear, matching how tfhd and related parsers are registered today.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Default to 32-bit saio offsets and saiz lengths, emitting validation warnings or notes when 64-bit flag combinations appear until future work promotes support.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Register sampleEncryption parser", + "description": "Adds a parser for the senc box that reads version/flags, IV size hints, entry counts and byte ranges without decrypting data.", + "source_line": null + }, + { + "name": "Register sampleAuxInfoOffsets parser", + "description": "Adds a parser for the saio box that records offset table entries, default 32\u2011bit offsets, and validates 64\u2011bit flag combinations.", + "source_line": null + }, + { + "name": "Register sampleAuxInfoSizes parser", + "description": "Adds a parser for the saiz box that records size table entries, default 32\u2011bit lengths, and emits validation notes for 64\u2011bit flags.", + "source_line": null + }, + { + "name": "Wire parsers into fragment registry", + "description": "Integrates the new parsers into BoxParserRegistry.DefaultParsers so they are invoked during traf traversal of fragmented files.", + "source_line": null + }, + { + "name": "Emit ParsedBoxPayload with metadata", + "description": "Each parser returns a ParsedBoxPayload containing version/flags, IV size hints, table lengths, and byte ranges for the box content and auxiliary tables.", + "source_line": null + }, + { + "name": "Unit tests for placeholder parsers", + "description": "Provides focused unit tests that feed synthetic senc, saio, saiz payloads through the registry and assert emitted field values and byte ranges.", + "source_line": null + }, + { + "name": "Streaming integration tests", + "description": "Extends streaming tests to parse fragmented fixtures with placeholder boxes, ensuring no crashes when tables are empty or out\u2011of\u2011range.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5438, + "line_count": 41 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6B_Surface_Sample_Encryption_Metadata_PRD_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6B_Surface_Sample_Encryption_Metadata_PRD_metrics.json new file mode 100644 index 00000000..bd62493b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6B_Surface_Sample_Encryption_Metadata_PRD_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6B_Surface_Sample_Encryption_Metadata_PRD.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Propagate placeholder metadata for senc, saio, and saiz boxes so users can view encryption scaffolding without decrypting payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Exported JSON contains new structured nodes for senc, saio, and saiz with counts, byte ranges, and scalar fields matching CLI/UI summaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI streaming output indicates when encryption metadata is present (e.g., \"encryption entries=... iv_size=...\") and SwiftUI detail panes list the same information alongside validation issues without regressions to existing layouts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No raw encrypted payload bytes are persisted; only metadata and ranges are surfaced, maintaining alignment with product security requirements.", + "source_line": null + }, + { + "type": "invariant", + "description": "JSON schema updates must not break downstream automation; changes gated behind versioned snapshots and documented in release notes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Console output should remain concise by default, using verbosity toggles for detailed listings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParsedBoxPayload.Detail with lightweight structures (SampleEncryptionBox, etc.) to capture counts, IV sizing, and referenced offsets.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing naming patterns for field keys (entries[x].encryption.*) from sample description protection helpers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Prefer optional encoding in JSONParseTreeExporter to avoid bloating diff noise.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add localized string resources or reuse existing label helpers for SwiftUI accessibility.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsedBoxPayload.Detail SampleEncryptionBox", + "description": "Represents placeholder metadata for the \u2018senc\u2019 box, exposing count, IV size and byte range.", + "source_line": null + }, + { + "name": "ParsedBoxPayload.Detail SampleAuxInfoOffsetsBox", + "description": "Represents placeholder metadata for the \u2018saio\u2019 box, exposing referenced offsets and byte range.", + "source_line": null + }, + { + "name": "ParsedBoxPayload.Detail SampleAuxInfoSizesBox", + "description": "Represents placeholder metadata for the \u2018saiz\u2019 box, exposing size table entries and byte range.", + "source_line": null + }, + { + "name": "JSONParseTreeExporter Encryption Metadata Export", + "description": "Encodes the new senc/saio/saiz detail payloads into JSON so CLI and UI can consume them.", + "source_line": null + }, + { + "name": "EventConsoleFormatter Encryption Summary", + "description": "Appends concise encryption summaries (entries count, IV\u2011size) to the console output for each parsed box.", + "source_line": null + }, + { + "name": "ParseTreeDetailView Encryption Metadata Display", + "description": "Shows the new encryption metadata fields in SwiftUI detail panes with accessible labels.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6169, + "line_count": 46 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6C_Validate_Sample_Encryption_Placeholders_PRD_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6C_Validate_Sample_Encryption_Placeholders_PRD_metrics.json new file mode 100644 index 00000000..04ebef66 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6C_Validate_Sample_Encryption_Placeholders_PRD_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6C_Validate_Sample_Encryption_Placeholders_PRD.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a developer, I want to validate and document that the `senc`, `saio`, and `saiz` placeholder workflows behave correctly across kit, CLI, and app surfaces so that stakeholders can see encryption scaffolding without decrypting samples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests fail if placeholder parsing regresses (missing fields, incorrect counts, unexpected crashes), providing clear diagnostics for malformed fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility and export workflows in the app continue to pass existing assertions while including encryption metadata in exported JSON snapshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updates land alongside code changes, and release notes highlight the new visibility so distribution artifacts communicate the enhancement to end users.", + "source_line": null + }, + { + "type": "invariant", + "description": "Synthetic fixtures must be deterministic and self\u2011contained, using helper builders or inline byte buffers with hex literals and comments for readability.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation utilities should assert warnings rather than hard failures when encountering unsupported flag combinations, matching graceful degradation goals.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing export and CLI test patterns to validate JSON parity and command output; extend them to cover encryption metadata scenarios.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce SwiftUI regression coverage (snapshot or view\u2011model tests) confirming the detail pane renders encryption metadata without crashing, leveraging document session export tests as references.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update DocC onboarding guides, release notes, and next_tasks.md to announce placeholder visibility and record remaining follow-ups.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Synthetic Fragmented Fixture Builder", + "description": "Creates minimal moof/traf samples embedding senc, saio, and saiz tables with varied combinations for deterministic tests", + "source_line": null + }, + { + "name": "ISOInspectorKit Placeholder Parser Tests", + "description": "Unit tests that parse fixtures and assert emitted fields, detail structs, and validation issues for encryption placeholders", + "source_line": null + }, + { + "name": "CLI Export-JSON Validation Tests", + "description": "Integration tests verifying export-json output, console summaries, and failure handling when placeholders are absent or malformed", + "source_line": null + }, + { + "name": "SwiftUI Detail Pane Rendering Tests", + "description": "Regression coverage confirming the detail pane renders encryption metadata without crashing using snapshot or view-model tests", + "source_line": null + }, + { + "name": "DocC Onboarding Guide Updates", + "description": "Documentation updates that announce placeholder visibility to developers in DocC guides", + "source_line": null + }, + { + "name": "Release Notes Enhancements", + "description": "Release notes highlighting new visibility of encryption scaffolding for end users", + "source_line": null + }, + { + "name": "Next Tasks Documentation", + "description": "Document remaining edge cases and future follow-ups in next_tasks.md", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6260, + "line_count": 47 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6_Recognize_senc_saio_saiz_Placeholders_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6_Recognize_senc_saio_saiz_Placeholders_metrics.json new file mode 100644 index 00000000..dc835949 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6_Recognize_senc_saio_saiz_Placeholders_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/D6_Recognize_senc_saio_saiz_Placeholders.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement stub-level parsing for sample encryption support boxes (senc, saio, saiz) so fragment workflows expose byte ranges and counts without decrypting payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers dedicated handlers for senc, saio, and saiz that read version/flag headers and emit summary fields such as entry counts, default IV sizes, and referenced offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsedBoxPayload instances capture byte ranges for each structure so JSON export, CLI reports, and SwiftUI detail panes can highlight where encryption metadata lives.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover synthetic fragment fixtures exercising each box type, validating parsed field values and ensuring unknown/unsupported flag combinations degrade gracefully with informational validation issues rather than crashes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and changelog entries mention the new coverage so stakeholders know encrypted sample scaffolding is now visible even without decryption capabilities.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parser must not attempt to decrypt protected payloads; it should only record metadata.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend BoxParserRegistry.DefaultParsers in BoxParserRegistry+MovieFragments.swift to include parser functions for senc, saio, and saiz, wiring them into the registry so they populate ParsedBoxPayload.Field entries with offsets, counts, and IV sizing hints.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use FullBoxReader for senc to extract version/flags, handling optional constant IV sections before iterating sample records; stub per-sample payloads by recording counts and sizes rather than storing raw encryption data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "For saio/saiz prefer 32-bit entry arrays initially and gate 64-bit offsets via feature flags or warnings until fixtures exist; surface aggregate totals so validators/UI can warn when offsets fall outside their parent payload range.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Register Sample Encryption Box Parsers", + "description": "Adds registry handlers that emit placeholder metadata for senc, saio, and saiz boxes", + "source_line": null + }, + { + "name": "Surface Sample Encryption Metadata Across Outputs", + "description": "Propagates new fields through kit models, JSON exports, CLI formatting, and SwiftUI detail panes", + "source_line": null + }, + { + "name": "Validate & Document Sample Encryption Placeholder Coverage", + "description": "Establishes regression fixtures, tests, and documentation updates covering the new functionality end-to-end", + "source_line": null + }, + { + "name": "Parse senc Box", + "description": "Parses version/flags and records entry counts, default IV sizes, and placeholder sample records without decrypting data", + "source_line": null + }, + { + "name": "Parse saio Box", + "description": "Parses 32-bit (and optionally 64-bit) offset entries, records byte ranges and totals for encryption offsets", + "source_line": null + }, + { + "name": "Parse saiz Box", + "description": "Parses size entries, records byte ranges and totals for encryption sizes", + "source_line": null + }, + { + "name": "Emit ParsedBoxPayload Fields", + "description": "Captures byte ranges for each structure so JSON export, CLI reports, and SwiftUI detail panes can highlight where encryption metadata lives", + "source_line": null + }, + { + "name": "Unit Tests for Sample Encryption Parsing", + "description": "Tests synthetic fragment fixtures exercising each box type and validates parsed field values and graceful degradation", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4413, + "line_count": 35 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/E1_Enforce_Parent_Containment_and_Non_Overlap_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/E1_Enforce_Parent_Containment_and_Non_Overlap_metrics.json new file mode 100644 index 00000000..f079d448 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/E1_Enforce_Parent_Containment_and_Non_Overlap_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/E1_Enforce_Parent_Containment_and_Non_Overlap.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure that every parsed child box remains fully within its parent\u2019s byte range and that the parser never emits overlapping container spans.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation pipeline detects when a child box\u2019s declared end exceeds its parent\u2019s boundary or when cumulative child spans surpass the parent\u2019s payload.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser gracefully records and reports non-overlap violations without crashing, enabling CLI and UI consumers to surface errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and integration tests cover overlapping/overflowing child scenarios across representative fixtures.", + "source_line": null + }, + { + "type": "invariant", + "description": "The parser must never emit overlapping container spans.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit existing BoxValidator and streaming parser metrics to confirm available offset metadata for parent/child comparisons.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce containment accounting that tracks active parent ranges and flags violations as .error issues when children overrun or overlap siblings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend fixture set or synthesize targeted samples (e.g., truncated child boxes) to exercise new detection paths and assert emitted validation issues.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire validation outputs into CLI/UI surfaces, ensuring regression suites assert both messaging and continued parse stability after errors.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parent Containment Validation", + "description": "Detects when a child box's declared end exceeds its parent's byte range and flags an error.", + "source_line": null + }, + { + "name": "Non-Overlap Detection", + "description": "Ensures that cumulative child spans do not overlap within the same parent container, reporting violations as errors.", + "source_line": null + }, + { + "name": "Parser Error Reporting", + "description": "Gracefully records and reports validation errors without crashing, allowing CLI/UI consumers to surface them.", + "source_line": null + }, + { + "name": "Validation Output Integration", + "description": "Wires validation results into CLI and UI surfaces for user visibility.", + "source_line": null + }, + { + "name": "Test Coverage for Overlap/Overflow Scenarios", + "description": "Unit and integration tests that exercise overlapping or overflowing child box scenarios across representative fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2255, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/Summary_of_Work_metrics.json new file mode 100644 index 00000000..3914dcdf --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/Summary_of_Work.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "Sample Encryption Box Parser Registration", + "description": "Registers parsers for sample encryption boxes (senc, saio, saiz) and provides populated ranges/counts", + "source_line": null + }, + { + "name": "JSON Exporter Inclusion of Sample Encryption Metadata", + "description": "Exports media metadata to JSON including sample encryption placeholder information", + "source_line": null + }, + { + "name": "CLI Summary Display of Sample Encryption Metadata", + "description": "Command-line interface outputs summaries of sample encryption metadata", + "source_line": null + }, + { + "name": "SwiftUI Detail Pane for Sample Encryption Metadata", + "description": "Provides a SwiftUI UI component that displays detailed sample encryption metadata", + "source_line": null + }, + { + "name": "Sample Encryption Placeholder Validation Fixture", + "description": "Validates placeholder metadata end-to-end using fixtures and snapshot tests", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1637, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/next_tasks_metrics.json new file mode 100644 index 00000000..d3421fe3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/141_Summary_of_Work_2025-10-21_Sample_Encryption/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes cannot exceed parent ranges and must not overlap payloads.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement real\u2011world asset licensing for Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG\u2011H to replace synthetic payloads in regression baselines.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Parses and validates sample encryption placeholder data for senc/saio/saiz boxes, providing regression fixtures and coverage.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Ensures child boxes stay within parent ranges and flags overlapping payloads, with support for CLI and UI surfaces.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 968, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/E3_Warn_on_Unusual_Top_Level_Ordering_metrics.json b/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/E3_Warn_on_Unusual_Top_Level_Ordering_metrics.json new file mode 100644 index 00000000..a490180f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/E3_Warn_on_Unusual_Top_Level_Ordering_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/E3_Warn_on_Unusual_Top_Level_Ordering.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide an advisory warning when top-level boxes in a media file arrive in an unexpected order so that CLI, JSON exports, and UI can guide reviewers to potential packaging issues without blocking legitimate streaming layouts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Advisory diagnostics are triggered when the ordering of 'moov'/'ftyp' differs from common multiplexing layouts yet still passes existing VR-004/VR-005 checks, with tests confirming visibility in CLI and JSON export.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Configuration supports severity toggles so UI consumers can present non-blocking guidance distinct from structural errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression fixtures cover baseline MP4, fragmented, and streaming-friendly orderings to avoid false positives, and documentation cross-links the new advisory to VR-004/VR-005 behavior.", + "source_line": null + }, + { + "type": "invariant", + "description": "The validator must use the existing event sequencing model and state machine hooks for top-level encounters and streaming signals without duplicating logic from VR-004/VR-005.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Advisory messages will be plumbed through the existing validation payload, augmenting JSON exports with a dedicated advisory code, avoiding schema churn.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Advisory Validation Rule for Unusual Top-Level Ordering", + "description": "Detects and warns when top-level MP4 boxes (e.g., moov, ftyp) appear in an uncommon order that still passes existing fatal/warning checks.", + "source_line": null + }, + { + "name": "CLI Diagnostic Output Extension", + "description": "Outputs advisory messages to the command-line interface so users see warnings about unusual ordering.", + "source_line": null + }, + { + "name": "JSON Export Advisory Field", + "description": "Adds a dedicated advisory code and message to JSON exports of validation results.", + "source_line": null + }, + { + "name": "UI Guidance Component", + "description": "Provides non-blocking UI feedback for reviewers, highlighting potential packaging issues based on the advisory.", + "source_line": null + }, + { + "name": "Severity Toggle Configuration", + "description": "Allows configuration of advisory severity levels so consumers can control warning visibility versus errors.", + "source_line": null + }, + { + "name": "Validator State Machine Hook Integration", + "description": "Reuses existing state machine hooks to register top-level box encounters and emit soft advisories when heuristics flag uncommon patterns.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2664, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/Summary_of_Work_metrics.json new file mode 100644 index 00000000..6d639810 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/Summary_of_Work_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/Summary_of_Work.md", + "n_spec": 3, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Warn users on unusual top-level ordering of ftyp/moov sequences in media streams via CLI/JSON streams.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The system must flag atypical ftyp/moov sequences as advisory warnings while preserving streaming layouts.", + "source_line": null + }, + { + "type": "invariant", + "description": "Streaming layouts remain advisory-only and are not altered by the warning rule.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 414, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/next_tasks_metrics.json new file mode 100644 index 00000000..a92d2342 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/142_E3_Warn_on_Unusual_Top_Level_Ordering/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Recognize senc, saio, and saiz boxes during fragment parsing so the pipeline records their offsets/sizes and surfaces presence to CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Child boxes cannot exceed parent ranges; overlapping payloads are flagged for CLI/UI surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validator warns when ftyp or moov appear in atypical top-level sequences while keeping streaming layouts non-blocking.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Recognizes senc, saio, and saiz boxes during fragment parsing, records their offsets/sizes, and surfaces presence to CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes do not exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Warn on Unusual Top-Level Ordering Advisory", + "description": "Issues advisory warnings when ftyp or moov appear in atypical top-level sequences while maintaining non-blocking streaming layouts.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1243, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/E4_Verify_avcC_hvcC_Invariants_metrics.json b/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/E4_Verify_avcC_hvcC_Invariants_metrics.json new file mode 100644 index 00000000..c54939d4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/E4_Verify_avcC_hvcC_Invariants_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/E4_Verify_avcC_hvcC_Invariants.md", + "n_spec": 8, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Validate codec configuration invariants in avcC and hvcC boxes to surface malformed entries consistently across ISOInspectorKit, CLI, and JSON exports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation detects and flags lengthSizeMinusOne values outside {0,1,2,3} for both avcC and hvcC payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Mismatched array counts (e.g., SPS/PPS/VPS descriptors with inconsistent lengths) trigger actionable warnings/errors that flow through CLI output, UI badges, and JSON export metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and snapshot tests cover representative fixtures (valid + invalid) ensuring regression protection across Kit, CLI, and export modules.", + "source_line": null + }, + { + "type": "invariant", + "description": "lengthSizeMinusOne must be within the set {0,1,2,3} for avcC and hvcC payloads.", + "source_line": null + }, + { + "type": "invariant", + "description": "Array counts for SPS/PPS/VPS descriptors must be consistent with declared lengths.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend existing validation infrastructure (VR-series rules) with codec-specific checks that run during streaming parse without requiring payload re-reads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse fixture coverage from codec parser tasks and add targeted malformed fixtures if gaps exist.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "avcC lengthSizeMinusOne Validation", + "description": "Detects and flags avcC payloads where lengthSizeMinusOne is not one of {0,1,2,3} during streaming parse.", + "source_line": null + }, + { + "name": "hvcC lengthSizeMinusOne Validation", + "description": "Detects and flags hvcC payloads where lengthSizeMinusOne is not one of {0,1,2,3} during streaming parse.", + "source_line": null + }, + { + "name": "SPS/PPS/VPS Array Count Consistency Check", + "description": "Triggers warnings/errors when the number of SPS, PPS, or VPS descriptors in avcC/hvcC does not match declared array lengths.", + "source_line": null + }, + { + "name": "NAL Unit Length Validation for Codec Descriptors", + "description": "Ensures that NAL units within codec descriptor arrays are non\u2011zero length and correctly formatted.", + "source_line": null + }, + { + "name": "CLI Output Messaging for Codec Invariant Violations", + "description": "Outputs clear warning identifiers and messages to the command\u2011line interface when codec validation failures occur.", + "source_line": null + }, + { + "name": "UI Badge Generation for Codec Validation Status", + "description": "Displays visual badges in the user interface indicating presence of codec invariant violations.", + "source_line": null + }, + { + "name": "JSON Export Metadata Augmentation", + "description": "Adds codec validation warnings/errors into JSON export metadata so downstream tools can consume them.", + "source_line": null + }, + { + "name": "Unit and Snapshot Test Suite for Codec Validations", + "description": "Provides tests covering valid and invalid avcC/hvcC fixtures to ensure regression protection across Kit, CLI, and export modules.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2466, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/Summary_of_Work_metrics.json new file mode 100644 index 00000000..07002d25 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/Summary_of_Work_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/Summary_of_Work.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "ISOInspectorKit must validate lengthSizeMinusOne, parameter-set counts, and HEVC NAL array integrity for avcC/hvcC configurations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxValidator must include CodecConfigurationValidationRule that inspects protected sample entries, checks for zero-length NAL units, and flags truncated payloads with contextual messages in CLI/JSON outputs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CodecConfigurationValidationRule", + "description": "Validates codec configuration boxes for avcC/hvcC invariants such as lengthSizeMinusOne, parameter-set counts, and HEVC NAL array integrity", + "source_line": null + }, + { + "name": "BoxValidator", + "description": "Component that applies validation rules to ISO media boxes and produces CLI/JSON output with contextual messages", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 635, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/next_tasks_metrics.json new file mode 100644 index 00000000..2c9f6a5a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/143_E4_Verify_avcC_hvcC_Invariants/next_tasks.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Recognize senc, saio, and saiz boxes during fragment parsing so the pipeline records their offsets/sizes and surfaces presence to CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Child boxes cannot exceed parent ranges; overlapping payloads are flagged for CLI/UI surfaces.", + "source_line": null + }, + { + "type": "invariant", + "description": "Codec configuration validator enforces lengthSizeMinusOne, parameter-set counts, and NAL array integrity across ISOInspectorKit.", + "source_line": null + }, + { + "type": "invariant", + "description": "Advisory validator warns when ftyp or moov appear in atypical top-level sequences while keeping streaming layouts non-blocking.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure licensing for Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG-H fixtures so synthetic payloads can be replaced and regression baselines refreshed once approvals land.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Recognizes senc, saio, and saiz boxes during fragment parsing, records their offsets/sizes, and surfaces presence to CLI/UI without attempting decryption.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes do not exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Verify avcC/hvcC Invariants Validator", + "description": "Ensures codec configuration entries have correct lengthSizeMinusOne, parameter-set counts, and NAL array integrity, surfacing errors in CLI and JSON.", + "source_line": null + }, + { + "name": "Warn on Unusual Top-Level Ordering Advisory", + "description": "Issues warnings when ftyp or moov appear in atypical top-level sequences while maintaining non-blocking streaming layouts.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1621, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/E5_Basic_stbl_Coherence_Checks_metrics.json b/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/E5_Basic_stbl_Coherence_Checks_metrics.json new file mode 100644 index 00000000..5fb1362e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/E5_Basic_stbl_Coherence_Checks_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/E5_Basic_stbl_Coherence_Checks.md", + "n_spec": 7, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide basic coherence checks for stbl sample tables so that timeline calculations and downstream tooling can trust stbl-derived metadata without manual inspection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation emits warnings/errors when declared sample counts or entry lengths disagree across stts, ctts, stsc, stsz/stz2, and chunk offset tables.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI, JSON export, and UI surfaces reflect the new diagnostics with regression coverage for representative fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and backlog entries referencing E5 are updated to indicate the checks are live and verified.", + "source_line": null + }, + { + "type": "invariant", + "description": "Existing validation infrastructure (VR-00x series) must not be disrupted; lightweight count comparisons should precede deeper correlation efforts.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing stbl parsers (stsc, stsz/stz2, stco/co64) to enable cross-table comparisons without new parsing dependencies.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with ongoing E1 containment work to avoid duplicated diagnostics when boundary violations cascade into count mismatches.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Table Coherence Validator", + "description": "Validates that declared sample counts and entry lengths are consistent across stts, ctts, stsc, stsz/stz2, and chunk offset tables, emitting warnings or errors when mismatches occur.", + "source_line": null + }, + { + "name": "CLI Diagnostic Reporter", + "description": "Outputs coherence check diagnostics through the command-line interface as part of the validation run.", + "source_line": null + }, + { + "name": "JSON Exporter for Diagnostics", + "description": "Exports the results of sample table coherence checks in JSON format for downstream tooling.", + "source_line": null + }, + { + "name": "UI Diagnostic Surface", + "description": "Displays coherence check warnings and errors within the user interface, reflecting new diagnostics.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2275, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/Summary_of_Work_metrics.json new file mode 100644 index 00000000..80fd0311 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The number of samples derived from the time-to-sample (stts) and composition-offset (ctts) tables must equal the total sample sizes specified in the stsz table and be consistent with chunk coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON exporter snapshots must include decoding-time and composition-offset table details for each sample-table.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline live tests must assert VR-015 diagnostics on stsz and ctts events that emit them.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "SampleTableCorrelationRule aggregates sample counts from stts and ctts boxes and compares them against stsz and chunk coverage to validate coherence.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stbl Coherence Checks", + "description": "Validates consistency between decoding-time (stts), composition-offset (ctts), sample sizes (stsz), and chunk layouts in MP4 sample tables.", + "source_line": null + }, + { + "name": "JSON Exporter Snapshots for Sample Tables", + "description": "Exports updated JSON representations of sample-table metadata, including new table details and validation signals.", + "source_line": null + }, + { + "name": "ParsePipeline Live Tests for stbl Events", + "description": "Runs live tests that assert VR-015 diagnostics on stsz and ctts events emitted during parsing.", + "source_line": null + }, + { + "name": "SampleTableCorrelationRule Aggregation", + "description": "Aggregates sample counts from time-to-sample and composition-offset boxes to compare against sample sizes and chunk coverage, ensuring coherence.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 959, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/next_tasks_metrics.json new file mode 100644 index 00000000..911996d4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/next_tasks_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/144_E5_Basic_stbl_Coherence_Checks/next_tasks.md", + "n_spec": 5, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Recognize `senc`, `saio`, and `saiz` boxes during fragment parsing so the pipeline records their offsets/sizes and surfaces presence to CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Child boxes cannot exceed parent ranges, flag overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validate that sample table counts and array lengths across `stts/ctts/stsc/stsz/stz2/stco` align, surfacing structured warnings in CLI/UI outputs.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement the configuration layer, CLI flags, and UI settings for Validation Rule Preset Controls with bundled preset manifests, Application Support storage for custom sets, global-vs-document persistence layers, export metadata marking disabled rules as `skipped`, and CLI alias flags.", + "source_line": null + }, + { + "type": "invariant", + "description": "Sample table counts and array lengths across `stts/ctts/stsc/stsz/stz2/stco` must align.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Recognizes senc, saio, and saiz boxes during fragment parsing, records their offsets/sizes, and surfaces presence to CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes cannot exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Basic stbl Coherence Checks", + "description": "Validates alignment of sample table counts and array lengths across stts/ctts/stsc/stsz/stz2/stco, surfacing structured warnings in CLI/UI outputs.", + "source_line": null + }, + { + "name": "Validation Rule Preset Controls", + "description": "Provides configuration layer, CLI flags, and UI settings for toggling validation rule presets, including storage, persistence layers, export metadata marking disabled rules as skipped, and alias flags.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Manages licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Codec Validation Coverage Expansion", + "description": "Expands coverage of codec validation features.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1879, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/B7_Validation_Rule_Preset_Configuration_metrics.json b/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/B7_Validation_Rule_Preset_Configuration_metrics.json new file mode 100644 index 00000000..4c2fbf5b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/B7_Validation_Rule_Preset_Configuration_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/B7_Validation_Rule_Preset_Configuration.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Enable downstream CLI and SwiftUI surfaces to consume a consistent validation configuration API via preset registries and per-rule toggles.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ValidationConfiguration and ValidationPreset types enumerate rule identifiers, load bundled presets, and default to all rules enabled with Codable support for persistence.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Application Support storage persists user-authored presets alongside global defaults, and per-document overrides inherit from the active preset.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation output metadata records the active preset and lists disabled rules as \"skipped\" for audit trails.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests cover preset selection, per-rule overrides, and default fallbacks in ISOInspectorKit so downstream consumers can rely on deterministic behavior.", + "source_line": null + }, + { + "type": "invariant", + "description": "Preset manifest schema must include name, description, and default rule states.", + "source_line": null + }, + { + "type": "invariant", + "description": "Rule identifiers VR-001\u2026VR-015 must stay synchronized with the rule registry.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose preset listings, change notifications, and serialization helpers to downstream layers (CLI and app).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ValidationConfiguration", + "description": "Manages rule identifiers, loads bundled presets, defaults to all rules enabled, and provides Codable persistence.", + "source_line": null + }, + { + "name": "ValidationPreset", + "description": "Represents a preset with name, description, and default rule states; can be loaded from JSON manifests.", + "source_line": null + }, + { + "name": "PresetRegistry", + "description": "Catalogs available validation presets and exposes listings for downstream consumers.", + "source_line": null + }, + { + "name": "RuleToggleAPI", + "description": "Provides per-rule enable/disable toggles at runtime within a preset configuration.", + "source_line": null + }, + { + "name": "PresetPersistence", + "description": "Persists user-authored presets in Application Support storage alongside global defaults.", + "source_line": null + }, + { + "name": "PresetChangeNotification", + "description": "Notifies downstream layers (CLI, UI) when the active preset changes.", + "source_line": null + }, + { + "name": "ValidationMetadataExporter", + "description": "Adds active preset identifier and disabled rule IDs to validation output metadata for CLI headers, JSON exports, and session state.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3318, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..7659205c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/Summary_of_Work.md", + "n_spec": 3, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Wire preset selection flags through ISOInspectorCLI and propagate configuration summaries to CLI output.", + "source_line": null + }, + { + "type": "user_story", + "description": "Persist user-authored presets inside ISOInspectorApp with Application Support storage and settings UI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend validation export metadata (CLI, JSON, session state) to record the active preset identifier and disabled rule IDs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ValidationRuleIdentifier", + "description": "Represents a unique identifier for a validation rule within ISOInspectorKit.", + "source_line": null + }, + { + "name": "ValidationPreset", + "description": "Defines a set of pre-configured validation rules that can be applied together.", + "source_line": null + }, + { + "name": "ValidationConfiguration", + "description": "Encapsulates the configuration model for toggling validation rules, including preset selection and overrides.", + "source_line": null + }, + { + "name": "Bundled ValidationPresets.json", + "description": "Provides bundled presets such as \"All\u00a0Checks\u00a0Enabled\" and \"Structural\u00a0Focus\" for use in ISOInspectorKit.", + "source_line": null + }, + { + "name": "ISOInspectorCLI preset selection flags", + "description": "Allows the user to command\u2011line interface to set or modify the validation preset selection.", + "source_line": null + }, + { + "name": "Configuration summary output in CLI", + "description": "The\u00a0CLI\u00a0to\u00a0..\u00a0\u2026", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 950, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/next_tasks_metrics.json new file mode 100644 index 00000000..8f142296 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/145_B7_Validation_Rule_Preset_Configuration/next_tasks.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Recognize senc, saio, and saiz boxes during fragment parsing so the pipeline records their offsets/sizes and surfaces presence to CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Child boxes cannot exceed parent ranges and overlapping payloads are flagged for CLI/UI surfaces.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement configuration layer, CLI flags, and UI settings for validation rule preset controls with bundled preset manifests, Application Support storage for custom sets, global-vs-document persistence layers, export metadata marking disabled rules as skipped, and CLI alias flags tracked via workplan items B7, C19, D7.", + "source_line": null + }, + { + "type": "invariant", + "description": "Child boxes must not exceed parent ranges and cannot overlap within the same parent.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Recognizes senc, saio, and saiz boxes during fragment parsing, records their offsets/sizes, and surfaces presence to CLI/UI without attempting decryption.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes do not exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Validation Rule Preset Controls", + "description": "Provides configuration layer, CLI flags, UI settings, preset manifests, storage of custom sets, persistence layers, export metadata marking disabled rules as skipped, and tracks CLI alias flags.", + "source_line": null + }, + { + "name": "Real-World Assets Licensing Integration", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Codec Validation Coverage Expansion", + "description": "Expands coverage of codec validation within the system.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1676, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/C19_Validation_Preset_UI_Settings_Integration_metrics.json b/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/C19_Validation_Preset_UI_Settings_Integration_metrics.json new file mode 100644 index 00000000..d4928050 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/C19_Validation_Preset_UI_Settings_Integration_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/C19_Validation_Preset_UI_Settings_Integration.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "As an analyst, I want to select validation presets from a SwiftUI settings pane so that I can quickly apply a set of rule configurations.", + "source_line": null + }, + { + "type": "user_story", + "description": "As an analyst, I want to toggle individual validation rules in the settings UI so that I can override preset defaults for specific rules.", + "source_line": null + }, + { + "type": "user_story", + "description": "As an analyst, I want changes to be persisted to Application Support global defaults and optional workspace-specific overrides so that my configuration survives app restarts and is consistent across workspaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The settings pane lists all bundled presets with descriptions and updates the active configuration immediately after selection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Per\u2011rule toggles reflect the current preset, allow overrides, and show when the user diverges from preset defaults (e.g., \"Custom\" state).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Choices persist to Application Support global defaults and optional workspace\u2011specific overrides, including a \"Reset\u00a0to\u00a0Global\u201d affor\u00addance that clears\u00a0local\u00a0customizations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation badges, lists\u00a0and downstream\u00a0exports\u00a0reflect\u00a0the\u00a0active preset metadata\u00a0\u2013\u00a0\u2026\u00a0.", + "source_line": null + }, + { + "type": "invariant", + "description": "The UI must observe and re\u2011apply\u00a0the\u00a0current\u00a0..???", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse\u00a0the\u00a0..\u2026\u00a0..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Preset Selection Pane", + "description": "Displays all bundled validation presets with descriptions and allows the user to select one, immediately updating the active configuration.", + "source_line": null + }, + { + "name": "Per-Rule Toggle Controls", + "description": "Shows individual rule toggles reflecting the current preset, permits overrides, and indicates custom states when diverging from preset defaults.", + "source_line": null + }, + { + "name": "Reset to Global Button", + "description": "Provides an affordance to clear local workspace overrides and revert to global default settings.", + "source_line": null + }, + { + "name": "Persistence Layer Integration", + "description": "Saves user selections and overrides to Application Support global defaults and optional workspace-specific files, ensuring persistence across upgrades.", + "source_line": null + }, + { + "name": "Configuration Observer", + "description": "Observes changes in ValidationConfiguration/ValidationPreset APIs to provide live UI feedback when configuration updates occur.", + "source_line": null + }, + { + "name": "Badge & Export Sync", + "description": "Updates validation badges, lists, and downstream exports to reflect the active preset metadata so CLI/JSON outputs remain aligned.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4528, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f841d218 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Validation metadata must be present in ParseTree, JSON exports, and session snapshots to convey active preset and disabled rules.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Persist validation configuration defaults and workspace overrides; expose preset/rule operations via DocumentSessionController.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide a macOS ValidationSettingsView scene that allows users to switch scopes, select presets, toggle individual rules, and reset workspace overrides.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ValidationSettingsView must correctly switch scopes, allow preset selection, enable rule toggling, and support resetting workspace overrides.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Validation Metadata Support", + "description": "Adds validation metadata to ParseTree, JSON exports, and session snapshots so consumers can identify active preset and disabled rules.", + "source_line": null + }, + { + "name": "Persistence of Validation Configuration Defaults", + "description": "Stores default validation configuration settings and allows workspace overrides.", + "source_line": null + }, + { + "name": "DocumentSessionController Preset/Rule Operations", + "description": "Exposes operations for managing presets and rules through the DocumentSessionController API.", + "source_line": null + }, + { + "name": "macOS ValidationSettingsView Scene", + "description": "Provides a UI scene to switch scopes, select presets, toggle individual rules, and reset workspace overrides.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 782, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/next_tasks_metrics.json new file mode 100644 index 00000000..5b965f94 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/146_C19_Validation_Preset_UI_Settings_Integration/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Expose configuration controls via ISOInspectorCLI flags and exports by handing off to Task D7 \u2013 Validation Preset CLI Wiring.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture manual QA notes for the macOS Settings pane after UI review and update design documentation accordingly.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Task D7 \u2013 Validation Preset CLI Wiring", + "description": "Expose configuration controls via ISOInspectorCLI flags and exports", + "source_line": null + }, + { + "name": "Capture manual QA notes for macOS Settings pane", + "description": "Record QA observations after UI review and update design documentation", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 286, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..9bc9a40d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/Summary_of_Work_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/Summary_of_Work.md", + "n_spec": 5, + "n_func": 7, + "intent_atoms": [ + { + "type": "invariant", + "description": "The ParseTree and JSON exports must always include the active preset and disabled rule identifiers for downstream consumers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a file-backed validation configuration store to persist global defaults, workspace overrides, and propagate rule filters into ParseTreeStore snapshots.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide a macOS settings scene with ValidationSettingsView that allows users to select presets, toggle per-rule settings, switch scopes, and reset to global behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The macOS Settings pane must correctly display preset selection, custom override labeling, and reset behavior as verified by manual QA.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI wiring (Task D7) must surface the same configuration metadata for full E7 coverage.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Validation Preset UI Settings Integration", + "description": "Provides a macOS settings scene that allows users to select validation presets, toggle individual rules, switch scopes, and reset to global defaults.", + "source_line": null + }, + { + "name": "ParseTree Validation Metadata Plumbing", + "description": "Exposes active preset and disabled rule identifiers in ParseTree and JSON exports for downstream consumers.", + "source_line": null + }, + { + "name": "File-backed Validation Configuration Store", + "description": "Stores validation configuration data on disk, enabling loading and saving of global defaults, workspace overrides, and propagating rule filters into ParseTreeStore snapshots.", + "source_line": null + }, + { + "name": "DocumentSessionController Integration", + "description": "Loads and saves global defaults, manages workspace overrides, and propagates rule filters to ParseTreeStore snapshots.", + "source_line": null + }, + { + "name": "ValidationSettingsView UI Component", + "description": "UI component that presents preset selection, per-rule toggles, scope switching, and reset-to-global behavior backed by controller APIs.", + "source_line": null + }, + { + "name": "Workspace Session Snapshot Persistence", + "description": "Persists per-file validation overrides with bookmark metadata so overrides restore when documents are reopened.", + "source_line": null + }, + { + "name": "State Store Updates for Validation Filtering", + "description": "Updates state stores to support filtering, persistence, and export metadata flows across app and kit targets.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1238, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/next_tasks_metrics.json new file mode 100644 index 00000000..8676fc83 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/next_tasks_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/147_Summary_of_Work_2025-10-22_Validation_Preset_UI_Settings_Integration/next_tasks.md", + "n_spec": 5, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Recognize senc, saio, and saiz boxes during fragment parsing so the pipeline records their offsets/sizes and surfaces presence to CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Child boxes cannot exceed parent ranges and overlapping payloads are flagged for CLI/UI surfaces.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "CLI preset selection, alias flags, metadata propagation, and coverage notes wired into the validation pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI, JSON, and session state exports include the active preset identifier plus any disabled rule IDs.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets licensing must be secured before synthetic payloads can be replaced and regression baselines refreshed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Recognizes senc, saio, and saiz boxes during fragment parsing, records their offsets/sizes, and surfaces presence to CLI/UI without attempting decryption.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes do not exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Validation Preset CLI Wiring", + "description": "Provides CLI preset selection, alias flags, metadata propagation, and coverage notes for validation presets.", + "source_line": null + }, + { + "name": "Export Metadata Enhancements", + "description": "Extends CLI, JSON, and session state exports to include active preset identifier and any disabled rule IDs.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Codec Validation Coverage Expansion", + "description": "Expands validation coverage across additional codecs as documented in the integration coverage summary.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1933, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/D7_Validation_Preset_CLI_Wiring_metrics.json b/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/D7_Validation_Preset_CLI_Wiring_metrics.json new file mode 100644 index 00000000..b1e10d05 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/D7_Validation_Preset_CLI_Wiring_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/D7_Validation_Preset_CLI_Wiring.md", + "n_spec": 10, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "As an ISOInspectorCLI consumer, I want to select bundled validation presets or override individual rules via command-line flags so that I can configure the ValidationConfiguration pipeline without editing configuration files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The `isoinspector validate` and related commands accept a `--preset ` flag along with `--enable-rule` / `--disable-rule` flags, which populate a ValidationConfiguration sent to the inspection pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI help text enumerates available preset identifiers plus shorthand aliases (e.g., `--structural-only`) sourced from the bundled manifest so users can discover options without consulting documentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When presets or per-rule overrides are supplied, CLI output and JSON exports annotate the active preset and any disabled rule IDs, matching the configuration persistence semantics delivered in task B7.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New and updated tests cover flag parsing, preset alias resolution, and integration with the existing validation execution path to ensure regressions are caught by `swift test`.", + "source_line": null + }, + { + "type": "invariant", + "description": "The command context must thread a single effective ValidationConfiguration through all downstream commands (`inspect`, `validate`, `export`, `batch`).", + "source_line": null + }, + { + "type": "invariant", + "description": "Conflicting overrides (e.g., enabling and disabling the same rule) are prevented and produce friendly help text.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ISOInspectorCommand.GlobalOptions to declare new flags and surface preset metadata pulled from ValidationPresetRegistry or equivalent helpers introduced in task B7.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure command context (ISOInspectorCommandContext and ISOInspectorCommandContextStore) receives the effective ValidationConfiguration so downstream handlers reuse the same configuration regardless of entry point.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reconcile new flags with existing global options like logging/telemetry toggles to avoid conflicting short names and keep help formatting consistent with Swift ArgumentParser conventions.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspector validate command", + "description": "CLI command that runs validation using a ValidationConfiguration derived from preset or rule overrides", + "source_line": null + }, + { + "name": "Preset selection flag (--preset)", + "description": "Global CLI option to choose a bundled validation preset identifier", + "source_line": null + }, + { + "name": "Structural-only alias flag (--structural-only)", + "description": "Convenience flag that selects the structural\u2011only preset via an alias", + "source_line": null + }, + { + "name": "Enable rule flag (--enable-rule)", + "description": "Global CLI option to explicitly enable a specific validation rule, overriding a preset", + "source_line": null + }, + { + "name": "Disable rule flag (--disable-rule)", + "description": "Global CLI option to explicitly disable a specific validation rule, overriding a preset", + "source_line": null + }, + { + "name": "ValidationConfiguration propagation", + "description": "Mechanism that threads the effective ValidationConfiguration through command context so all sub\u2011commands (inspect, validate, export, batch) use the same configuration", + "source_line": null + }, + { + "name": "Preset summary output", + "description": "CLI and JSON export include an annotation of the active preset and any disabled rule IDs for the run", + "source_line": null + }, + { + "name": "Help text generation", + "description": "Automatic enumeration of available preset identifiers and aliases in CLI help based on bundled manifest", + "source_line": null + }, + { + "name": "JSON export metadata injection", + "description": "Embedding of validation preset and rule override information into exported JSON results", + "source_line": null + }, + { + "name": "CLI documentation update", + "description": "Manual documentation that reflects new flags, metadata behavior, and batch/export notes", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4905, + "line_count": 40 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/Summary_of_Work_metrics.json new file mode 100644 index 00000000..87fcefe3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/Summary_of_Work_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/Summary_of_Work.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide global CLI options for validation presets, including --preset, --structural-only, --enable-rule, and --disable-rule.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI must correctly parse preset flags and apply them to threaded validation configuration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Disabled rules should be filtered from output.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Preset details must be embedded in JSON exports and batch summaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Metadata printing for presets should be available via CLI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON annotations must include preset metadata.", + "source_line": null + }, + { + "type": "invariant", + "description": "Threaded validation configuration must always propagate preset settings through the CLI context.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Preset information is threaded through the CLI context and embedded in JSON exports.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Global CLI Flags for Validation Preset", + "description": "Provides global command-line options --preset, --structural-only, --enable-rule, and --disable-rule to configure validation behavior across the application.", + "source_line": null + }, + { + "name": "Threaded Validation Configuration via CLI Context", + "description": "Passes threaded validation settings and metadata through the CLI context to enable concurrent processing of validation tasks.", + "source_line": null + }, + { + "name": "Disabled Rule Output Filtering", + "description": "Filters out output for rules that have been disabled by user flags, ensuring only relevant results are shown.", + "source_line": null + }, + { + "name": "Preset Metadata in JSON Exports", + "description": "Embeds detailed preset information into JSON export files and batch summaries for traceability and reporting.", + "source_line": null + }, + { + "name": "CLI Test Coverage for Preset Parsing", + "description": "Automated tests validate correct parsing of presets, handling of conflicting overrides, metadata printing, and JSON annotations to catch regressions.", + "source_line": null + }, + { + "name": "Updated CLI Manual Documentation", + "description": "Documentation updates describe new global options, preset metadata output, JSON export annotations, and batch filtering behavior for end\u2011users.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1451, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/next_tasks_metrics.json new file mode 100644 index 00000000..e1b8b0a7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/148_D7_Validation_Preset_CLI_Wiring/next_tasks.md", + "n_spec": 4, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Recognize sample encryption placeholder boxes (senc, saio, saiz) during fragment parsing and record their offsets/sizes for CLI/UI consumers without attempting decryption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Child boxes must not exceed parent ranges; overlapping payloads are flagged for CLI/UI surfaces.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Global flags now surface validation presets, aliases, and per\u2011rule overrides across all commands with metadata printing and JSON embedding.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always enforce that child boxes cannot exceed parent ranges and overlapping payloads are detected.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Recognizes senc, saio, and saiz boxes during fragment parsing, records their offsets/sizes, and surfaces presence to CLI/UI without attempting decryption.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes do not exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Validation Preset CLI Wiring", + "description": "Provides global flags for presets, aliases, and per-rule overrides across all commands, with metadata printing and JSON embedding.", + "source_line": null + }, + { + "name": "Validation Export Metadata Enhancements", + "description": "CLI commands print preset metadata; JSON exports embed active preset and disabled rule IDs; batch summaries filter disabled rules.", + "source_line": null + }, + { + "name": "Real-World Assets Licensing Management", + "description": "Manages secure licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Codec Validation Coverage Expansion", + "description": "Expands end-to-end codec validation coverage as documented in the task archive.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2074, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Codec_Validation_Coverage_Expansion_metrics.json b/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Codec_Validation_Coverage_Expansion_metrics.json new file mode 100644 index 00000000..4c051ce3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Codec_Validation_Coverage_Expansion_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Codec_Validation_Coverage_Expansion.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend automated coverage so the CodecConfigurationValidationRule warnings introduced in Task E4 are exercised end to end across the streaming ParsePipeline, CLI output, and JSON export snapshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add or update ParsePipeline integration tests to assert codec validation warnings are emitted for fixtures containing malformed avcC/hvcC metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Refresh CLI validate command snapshot(s) so codec warnings appear with stable formatting and rule identifiers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update JSON export snapshot baselines (or add targeted fixtures) to include warnings entries showing codec validation diagnostics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document any new fixtures or fixture mutations so downstream teams understand how to exercise the warnings manually.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing malformed codec fixtures from Task E4 where possible; introduce additional fixture variants only if necessary to capture warning diversity (e.g., truncated SPS/PPS, invalid length size).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate updates with validation preset defaults so new warnings appear under standard configurations without requiring manual toggles.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Maintain deterministic ordering in snapshots to avoid flakey diffs\u2014normalize warning arrays if needed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline Integration Tests for Codec Validation", + "description": "Automated tests that run the streaming ParsePipeline and assert codec validation warnings are emitted for malformed avcC/hvcC metadata.", + "source_line": null + }, + { + "name": "CLI Validate Command Snapshot Updates", + "description": "Updates to the CLI 'validate' command snapshots so that codec validation warnings appear with stable formatting and rule identifiers.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Baselines for Codec Warnings", + "description": "Baseline JSON export snapshots updated or added to include warning entries showing codec validation diagnostics.", + "source_line": null + }, + { + "name": "Fixture Management for Malformed Codec Metadata", + "description": "Creation and documentation of test fixtures containing malformed avcC/hvcC metadata (e.g., truncated SPS/PPS, invalid length size) used to exercise warnings.", + "source_line": null + }, + { + "name": "Validation Preset Coordination", + "description": "Ensuring new codec warnings appear under standard validation presets without requiring manual toggles.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2582, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b9f1eb27 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/Summary_of_Work.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "CodecValidationCoverageTests", + "description": "Runs tests to exercise VR-018 diagnostics emitted by ParsePipeline.live() when parsing new codec fixture and asserts AVC and HEVC zero-length parameter set errors reach streaming events.", + "source_line": null + }, + { + "name": "JSONExportSnapshotTests", + "description": "Regenerates JSON export snapshots for the codec-invalid-configs fixture, ensuring VR-018 errors appear in the canonical tree output.", + "source_line": null + }, + { + "name": "ISOInspectorCommand validate command", + "description": "CLI validation coverage test that verifies isoinspect validate reports VR-018 errors and surfaces preset metadata when parsing the codec fixture.", + "source_line": null + }, + { + "name": "Fixture catalog metadata update", + "description": "Updates catalog.json with expectations for two VR-018 errors and records generation provenance.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1578, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/next_tasks_metrics.json new file mode 100644 index 00000000..376c54c3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/149_Codec_Validation_Coverage_Expansion/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 180, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/14_B5_VR006_Research_Logging_metrics.json b/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/14_B5_VR006_Research_Logging_metrics.json new file mode 100644 index 00000000..b9691c15 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/14_B5_VR006_Research_Logging_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/14_B5_VR006_Research_Logging/14_B5_VR006_Research_Logging.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement research logging for validation rule VR-006 so unknown or catalog-missing boxes encountered during streaming parses are persisted for follow-up analysis across CLI and UI workflows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unknown or catalog-missing boxes encountered by the parser append deduplicated entries (fourcc, path, offsets) to a persistent research log file accessible to subsequent CLI/UI runs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI surface: `validate`/`inspect` commands expose flags or default behavior to enable VR-006 logging and confirm log file location, with tests proving log entries are emitted.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI surface: metadata consumers receive VR-006 research entries alongside validation issues so warnings and info events remain visible in tree/detail panes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in TODO/PRD trackers updated to reflect VR-006 logging availability and guidance for analysts.", + "source_line": null + }, + { + "type": "invariant", + "description": "VR-006 events are recorded as info-level issues.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse or extend existing diagnostics logging infrastructure to capture VR-006 events without blocking streaming throughput; ensure async-safe writes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate storage location and format (e.g., JSONL or CSV) so CLI and UI share the same research log schema and dedupe strategy.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Logging preserves ordering context for downstream analysis by reviewing prior VR-004/VR-005 ordering work.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Research Log File Persistence", + "description": "Persist unknown or catalog-missing box entries (fourcc, path, offsets) to a deduplicated research log file accessible across CLI and UI runs.", + "source_line": null + }, + { + "name": "CLI Validation Logging Flags", + "description": "Expose flags or default behavior in validate/inspect commands to enable VR-006 logging and report the log file location.", + "source_line": null + }, + { + "name": "UI Metadata Consumer Integration", + "description": "Provide VR-006 research entries to UI metadata consumers so warnings and info events appear in tree/detail panes alongside other validation issues.", + "source_line": null + }, + { + "name": "Async-Safe Log Writing", + "description": "Write VR-006 events asynchronously without blocking streaming throughput, using existing diagnostics logging infrastructure.", + "source_line": null + }, + { + "name": "Unified Log Schema & Dedupe Strategy", + "description": "Coordinate storage format (JSONL or CSV) and deduplication strategy so CLI and UI share the same research log schema.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2365, + "line_count": 57 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e48a8188 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/14_B5_VR006_Research_Logging/Summary_of_Work.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Research logging must be persistent and deduplicated across CLI and UI consumers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce ResearchLogEntry/ResearchLogWriter infrastructure and extend ParsePipeline to record unknown boxes using contextual metadata.", + "source_line": null + }, + { + "type": "user_story", + "description": "CLI users can configure research log handling via the --research-log option and receive a default location announcement.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The CLI must surface the research log path before streaming events.", + "source_line": null + }, + { + "type": "invariant", + "description": "Research logging schema usage should be monitored as UI components evolve beyond current scaffold.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Persistent Research Log Storage", + "description": "Stores research log entries as deduplicated JSON files shared by CLI and UI consumers.", + "source_line": null + }, + { + "name": "CLI Research Log Configuration", + "description": "Provides a --research-log option to configure the path of the research log and announces default location.", + "source_line": null + }, + { + "name": "ResearchLogEntry/Writer Infrastructure", + "description": "Defines data structures and writer components for creating and recording research log entries.", + "source_line": null + }, + { + "name": "ParsePipeline Extension for Unknown Boxes", + "description": "Extends the parsing pipeline to record unknown boxes using contextual metadata into the research log.", + "source_line": null + }, + { + "name": "CLI Environment Provisioning of Log Writers", + "description": "Sets up research log writers in the CLI environment based on parsed flags and surfaces the log path before streaming events.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 905, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/next_tasks_metrics.json new file mode 100644 index 00000000..d0e99a09 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/14_B5_VR006_Research_Logging/next_tasks_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/14_B5_VR006_Research_Logging/next_tasks.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute VR-006 research logging alongside the CLI and UI metadata consumption work tracked in todo.md #3", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ensure ordering insights flow into downstream consumers", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 187, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/2025-10-22-sample-encryption-metadata-surfacing_metrics.json b/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/2025-10-22-sample-encryption-metadata-surfacing_metrics.json new file mode 100644 index 00000000..f58bc1da --- /dev/null +++ b/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/2025-10-22-sample-encryption-metadata-surfacing_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/2025-10-22-sample-encryption-metadata-surfacing.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expose placeholder metadata from senc/saio/saiz boxes across JSON exports, CLI streaming output, and SwiftUI detail panes so users can locate encrypted payload scaffolding without decoding bytes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON structured payload includes sample_encryption, sample_aux_info_offsets, sample_aux_info_sizes dictionaries with counts, sizes, and byte ranges.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI formatter emits short encryption summaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI detail view renders encryption rows with accessibility identifiers and labels.", + "source_line": null + }, + { + "type": "invariant", + "description": "Existing payload consumers continue to parse; new keys are additive.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Public Kit API added/changed: JSON structured payload now includes sample_encryption, sample_aux_info_offsets, sample_aux_info_sizes dictionaries.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSONParseTreeExporter sample_encryption metadata inclusion", + "description": "Exports structured JSON payloads that include sample encryption metadata such as counts, sizes, and byte ranges for senc/saio/saiz boxes.", + "source_line": null + }, + { + "name": "ParsedBoxPayload.Detail structured encoders for encryption metadata", + "description": "Encodes detailed parsed box payloads with added fields for sample encryption, auxiliary info offsets, and sizes.", + "source_line": null + }, + { + "name": "EventConsoleFormatter short encryption summaries", + "description": "CLI formatter outputs concise summary lines indicating presence of encryption data in event logs.", + "source_line": null + }, + { + "name": "ParseTreeDetailView encryption section rendering", + "description": "SwiftUI detail view displays an encryption section with rows for each box type and accessibility identifiers/labels.", + "source_line": null + }, + { + "name": "ParseTreeNodeDetail.accessibilitySummary updates", + "description": "Provides updated accessibility summaries that include encryption metadata information.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1574, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f60142c2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/Summary_of_Work_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/Summary_of_Work.md", + "n_spec": 5, + "n_func": 7, + "intent_atoms": [ + { + "type": "invariant", + "description": "VR-018 codec errors must propagate through the streaming pipeline and be reported by isoinspect validate command.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want sample encryption metadata (senc/saio/saiz) to be surfaced in JSON exports, CLI summaries, and SwiftUI detail views so that it is visible and accessible.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The JSONParseTreeExporter must include sample encryption metadata; EventConsoleFormatter must output CLI summaries containing these metadata; ParseTreeDetailView must render the metadata with refreshed accessibility summaries.", + "source_line": null + }, + { + "type": "invariant", + "description": "All placeholder metadata for sample encryption must be visible in the exported JSON and CLI outputs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a new fixture called 'codec-invalid-configs' to test coverage of VR-018 errors across ParsePipeline, CLI validate output, and JSON snapshot baseline.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Codec Validation Coverage Expansion", + "description": "Provides comprehensive codec diagnostics across ParsePipeline, CLI validate output, and JSON export snapshots using the `codec-invalid-configs` fixture.", + "source_line": null + }, + { + "name": "Surface Sample Encryption Metadata Propagation", + "description": "Propagates `senc`, `saio`, and `saiz` placeholder metadata into JSON exports, CLI summaries, and SwiftUI detail views with accessibility coverage.", + "source_line": null + }, + { + "name": "Sample Encryption Placeholder Validation", + "description": "Validates visibility of sample encryption placeholders using the `sample-encryption-placeholder` fixture across ParsePipeline, CLI/App regression, JSON snapshot baseline, and documentation.", + "source_line": null + }, + { + "name": "CLI Validate Command Codec Warning Reporting", + "description": "The `isoinspect validate` CLI command emits codec warnings (VR-018 errors) when running against fixtures.", + "source_line": null + }, + { + "name": "JSON Exporter Inclusion of Sample Encryption Metadata", + "description": "JSONParseTreeExporter includes sample encryption metadata in exported JSON snapshots.", + "source_line": null + }, + { + "name": "Event Console Formatter for CLI Summaries", + "description": "Formats and outputs CLI summaries, including sample encryption metadata, via EventConsoleFormatter.", + "source_line": null + }, + { + "name": "Parse Tree Detail View Rendering", + "description": "Renders encryption metadata inside ParseTreeDetailView SwiftUI component with accessibility summaries.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2187, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/next_tasks_metrics.json new file mode 100644 index 00000000..ef695eb4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/150_Summary_of_Work_2025-10-22_Sample_Encryption_Metadata/next_tasks.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement Sample Encryption Placeholder Parsing to verify encryption metadata end-to-end via regression fixtures and documentation updates.", + "source_line": null + }, + { + "type": "user_story", + "description": "Enforce Parent Containment and Non-Overlap validation so child boxes cannot exceed parent ranges and overlapping payloads are flagged in CLI/UI surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression fixtures for sample-encryption-placeholder must pass ParsePipeline/CLI/App coverage tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Structural validation must flag overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "type": "invariant", + "description": "Child boxes cannot exceed parent ranges.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ParsePipeline integration tests and CLI/JSON coverage to surface VR-018 codec diagnostics end-to-end.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Sample Encryption Placeholder Parsing", + "description": "Parses encryption metadata from sample-encryption-placeholder regression fixtures and verifies end-to-end coverage via ParsePipeline, CLI, and App.", + "source_line": null + }, + { + "name": "Enforce Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes are within parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Codec Validation Coverage Expansion", + "description": "Expands ParsePipeline integration tests and adds CLI/JSON coverage to surface VR\u2011018 codec diagnostics end-to-end.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1320, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/R5_Export_Schema_Standardization_metrics.json b/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/R5_Export_Schema_Standardization_metrics.json new file mode 100644 index 00000000..34d01144 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/R5_Export_Schema_Standardization_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/R5_Export_Schema_Standardization.md", + "n_spec": 7, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Define an export schema recommendation so ISOInspector's JSON and report outputs align with widely used MP4 inspection tools while preserving round-trip fidelity requirements.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document a comparative analysis of at least Bento4 mp4dump --format json, FFmpeg/ffprobe, and any other relevant schema, highlighting coverage gaps and incompatible structures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Recommend a canonical ISOInspector export schema (or adaptations) with explicit field mappings and conversion notes for existing exporters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Identify verification steps needed so future automated tests can validate exports against the chosen schema.", + "source_line": null + }, + { + "type": "invariant", + "description": "JSON and binary export capabilities must support re-import verification as mandated by FR-CORE-004.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add optional compatibility aliases (name, header_size, size) alongside fourcc, offsets, and sizes in node records to enable Bento4 consumers to map fields without transforming arrays.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce an optional top-level format section mirroring ffprobe\u2019s key metrics (filename, duration, bitrate, brands, encoder).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspector JSON Exporter", + "description": "Produces a top\u2011level object containing an array of node records that describe each MP4 box with fourcc, offsets, sizes, metadata, payload ranges and optional structured views.", + "source_line": null + }, + { + "name": "Compatibility Alias Layer for Bento4", + "description": "Adds optional fields (name, header_size, size) to ISOInspector node objects so Bento4 consumers can map directly without transforming arrays.", + "source_line": null + }, + { + "name": "Format Summary Block", + "description": "Introduces an optional top\u2011level format section mirroring ffprobe\u2019s key metrics (filename, duration, bitrate, brands, encoder) derived from ftyp/mvhd and stream headers.", + "source_line": null + }, + { + "name": "Schema Descriptor Manifest", + "description": "Publishes a machine\u2011readable schema version and compatibility list, plus per\u2011node type hints indicating raw, structured or validation data to aid adapters.", + "source_line": null + }, + { + "name": "Adapter Guides for Bento4 & ffprobe", + "description": "Documents deterministic mappings between ISOInspector fields and external tool schemas, enabling CLI/UI layers to export alternate views without re\u2011parsing.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Tests", + "description": "Unit tests that compare exported JSON against stored fixtures to verify compatibility aliases and format summary across assets.", + "source_line": null + }, + { + "name": "CLI Integration Tests for Export Compatibility", + "description": "Automated tests that run the command line exporter and compare its output with Bento4 and ffprobe exports to ensure byte\u2011for\u2011byte compatibility.", + "source_line": null + }, + { + "name": "Schema Version Bump Gate", + "description": "Bumps schema version in export payloads and gates changes behind a documented version so downstream tooling can negotiate compatibility before consuming new fields.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8417, + "line_count": 59 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f827c895 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/Summary_of_Work.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a canonical export schema for media metadata that can be used by both compatibility-focused and rich-detail consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The proposed schema must include all fields present in Bento4 mp4dump, ISOInspector, and FFmpeg ffprobe exports, with clear naming conventions and coverage gaps addressed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Adapters should be defined to allow future exporters to map their output to the canonical schema without breaking existing consumers.", + "source_line": null + }, + { + "type": "invariant", + "description": "The export schema must remain backward compatible with current ISOInspector output structure during analysis.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend JSONExportSnapshotTests and add new CLI integration checks to validate compatibility aliases and format summary block before modifying production schemas.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1477, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/next_tasks_metrics.json new file mode 100644 index 00000000..c79c6347 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/next_tasks_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/151_R5_Export_Schema_Standardization/next_tasks.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes must not exceed parent ranges and overlapping payloads are disallowed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Export schema standardization to provide canonical export recommendations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Comparative schema analysis completed, canonical export recommendations documented, and verification plan verified.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parent Containment and Non-Overlap Enforcement", + "description": "Validates that child boxes are within parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Schema Export Standardization", + "description": "Provides canonical export recommendations and verification plan for schema exports.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1085, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/F6_Export_Schema_Verification_Harness_metrics.json b/DOCS/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/F6_Export_Schema_Verification_Harness_metrics.json new file mode 100644 index 00000000..ccbb458d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/F6_Export_Schema_Verification_Harness_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/F6_Export_Schema_Verification_Harness.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automate coverage to lock down proposed JSON export compatibility aliases and format summary fields before production schema updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New or updated JSONExportSnapshotTests cover fixtures that include the compatibility alias fields and format summary metadata proposed by R5, failing if output diverges from the agreed schema.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI-level regression coverage compares exported JSON against stored Bento4 and ffprobe baselines, confirming adapters remain byte-for-byte compatible on representative assets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot regeneration workflow documentation stays accurate so future schema migrations follow the reviewed process.", + "source_line": null + }, + { + "type": "invariant", + "description": "Existing snapshot tests in JSONExportSnapshotTests protect current exporter structure and document the refresh workflow for intentional schema changes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse archived Bento4 and ffprobe fixture outputs captured during R5 analysis to seed comparison expectations for both unit and CLI integration tests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider environment variables (e.g., ISOINSPECTOR_REGENERATE_SNAPSHOTS) and targeted test filters when refreshing baselines to limit the surface area of schema diffs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure CLI checks run in CI-friendly time by scoping fixtures to small canonical assets already tracked in the repository.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSONExportSnapshotTests", + "description": "Unit tests that validate exported JSON against expected schema and compatibility alias fields", + "source_line": null + }, + { + "name": "CLI regression coverage for JSON export", + "description": "Command\u2011line integration test comparing exported JSON to Bento4/ffprobe baselines to ensure byte\u2011for\u2011byte compatibility", + "source_line": null + }, + { + "name": "Snapshot regeneration workflow documentation", + "description": "Documentation and tooling for regenerating snapshot tests when the schema changes", + "source_line": null + }, + { + "name": "Environment variable controlled snapshot refresh", + "description": "Mechanism using ISOINSPECTOR_REGENERATE_SNAPSHOTS to trigger selective baseline updates", + "source_line": null + }, + { + "name": "Fixture management for JSON export tests", + "description": "Repository of small canonical asset fixtures used for unit and CLI tests", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3129, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/Summary_of_Work_metrics.json new file mode 100644 index 00000000..97002750 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/152_F6_Export_Schema_Verification_Harness/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "JSON exports must include compatibility alias fields (name, header_size, size) and a top-level format summary for downstream tooling validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All snapshot tests in JSONExportSnapshotTests must assert alias parity and correct format summary values against the baseline fixture.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSONExportCompatibilityCLITests must replay archived Bento4 parse data through a stub pipeline to verify CLI exporter byte alignment with compatibility aliases and format summary expectations.", + "source_line": null + }, + { + "type": "invariant", + "description": "Future schema adjustments must regenerate snapshot fixtures using ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests and refresh CLI baselines if new Bento4 assets are introduced.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Export Schema Verification Harness", + "description": "Provides a compatibility alias fields and top-level format summary in JSON exports for schema stability validation against Bento4/ffprobe baselines.", + "source_line": null + }, + { + "name": "JSON Export Snapshot Tests", + "description": "Tests that assert alias parity and format summary values, regenerating snapshots to capture extended schema changes.", + "source_line": null + }, + { + "name": "JSON Export Compatibility CLI Tests", + "description": "Replays archived Bento4 parse data through a stub pipeline to verify the CLI exporter remains byte-aligned with compatibility aliases and format summary expectations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1556, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f93fa189 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 814, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/next_tasks_metrics.json new file mode 100644 index 00000000..6d402775 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/153_Summary_of_Work_Export_Schema_Verification_Harness/next_tasks.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes must not exceed parent ranges and cannot overlap payloads within the same parent.", + "source_line": null + }, + { + "type": "user_story", + "description": "Export schema verification harness should produce JSON exporter aliases and format summary coverage across kit snapshots and CLI regression tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The export schema verification harness must be completed and shipped with the specified features.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets licensing must be secured before replacing synthetic payloads and refreshing regression baselines.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parent Containment and Non-Overlap Validation", + "description": "Validates that child boxes are within parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Export Schema Verification Harness", + "description": "Provides a JSON exporter aliasing and format summary coverage across kit snapshots and CLI regression tests.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1018, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/G7_State_Management_ViewModels_metrics.json b/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/G7_State_Management_ViewModels_metrics.json new file mode 100644 index 00000000..3ba70719 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/G7_State_Management_ViewModels_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/154_G7_State_Management_ViewModels/G7_State_Management_ViewModels.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a DocumentViewModel layer that adapts parser output into tree, detail, and hex components for the ISOInspector UI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expose parsed tree, validation badges, and export affordances via a DocumentVM (or equivalent controller) with observable updates.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track selection, filters, and bookmarks in a NodeVM to keep outline and detail panes consistent.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide on-demand slice loading with highlight ranges aligned to selected nodes through a HexVM.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocumentVM exposes parsed tree, validation badges, and export affordances with observable updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NodeVM tracks selection, filters, and bookmarks, keeping outline and detail panes consistent.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "HexVM provides on-demand slice loading with highlight ranges aligned to selected nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and integration tests cover multi-pane synchronization (selection changes, filter toggles, exports).", + "source_line": null + }, + { + "type": "invariant", + "description": "View models coordinate with persistence layers without introducing race conditions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse established parse pipeline bridges and SwiftUI outline/detail components; formalize state orchestration above them.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Document ViewModel", + "description": "Exposes parsed tree, validation badges, and export affordances with observable updates for UI consumers.", + "source_line": null + }, + { + "name": "Node ViewModel", + "description": "Tracks selection, filters, and bookmarks, keeping outline and detail panes consistent.", + "source_line": null + }, + { + "name": "Hex ViewModel", + "description": "Provides on-demand slice loading with highlight ranges aligned to selected nodes.", + "source_line": null + }, + { + "name": "State Synchronization Engine", + "description": "Coordinates parse tree state across SwiftUI outline, detail, and export flows ensuring real-time updates.", + "source_line": null + }, + { + "name": "Export Hook Service", + "description": "Surfaces export hooks for full document and node-level JSON flows, mirroring CLI expectations.", + "source_line": null + }, + { + "name": "Persistence Coordinator", + "description": "Manages interaction with persistence layers (recents, annotations, bookmarks) without race conditions.", + "source_line": null + }, + { + "name": "Accessibility API Layer", + "description": "Exposes focus order and keyboard navigation APIs for accessibility affordances.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2173, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bd0f809e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/154_G7_State_Management_ViewModels/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The DocumentViewModel must orchestrate ParseTreeStore and track validation badge counts.", + "source_line": null + }, + { + "type": "invariant", + "description": "Export availability for outline/detail flows must be surfaced by DocumentViewModel.", + "source_line": null + }, + { + "type": "invariant", + "description": "NodeSelectionViewModel and HexViewModel must keep selection, annotations, and hex highlights synchronized as the streaming parser mutates the tree.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "SwiftUI explorer, app shell, and session controller depend on shared document view model to keep export affordances and toolbar actions in sync.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1129, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/next_tasks_metrics.json new file mode 100644 index 00000000..e96ed2a1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/154_G7_State_Management_ViewModels/next_tasks_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/154_G7_State_Management_ViewModels/next_tasks.md", + "n_spec": 3, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes must not exceed parent ranges and overlapping payloads are disallowed.", + "source_line": null + }, + { + "type": "user_story", + "description": "State management view models coordinate SwiftUI outline/detail panes and export affordances.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshots and CLI fixtures must be refreshed whenever schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parent Containment Validation", + "description": "Ensures child boxes cannot exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "State Management View Models", + "description": "Coordinates SwiftUI outline/detail panes and export affordances via document, node, and hex view models.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing", + "description": "Manages licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads.", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Refresh", + "description": "Refreshes snapshots and CLI fixtures when schema updates are intentional using environment variable and test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1230, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/G8_Accessibility_and_Keyboard_Shortcuts_metrics.json b/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/G8_Accessibility_and_Keyboard_Shortcuts_metrics.json new file mode 100644 index 00000000..46526d71 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/G8_Accessibility_and_Keyboard_Shortcuts_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/G8_Accessibility_and_Keyboard_Shortcuts.md", + "n_spec": 8, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide consistent hardware keyboard navigation and accessibility focus management across macOS and iPadOS so that the tree, detail, notes, and hex panes remain operable without pointer input.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hardware shortcuts (\u2318\u23251\u2013\u2318\u23254 on macOS; discoverable key commands on iPadOS) shift focus between outline, detail, notes, and hex panes and restore the prior selection where available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Arrow key and move-command handling in the outline, detail, and hex panes maintains focus scopes while VoiceOver announces the active element using descriptors from AccessibilitySupport.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard shortcuts and focus flows are documented in the Accessibility Guidelines and, where applicable, surfaced in user-facing help or menu command titles.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated coverage (e.g., ParseTreeAccessibilityIdentifierTests, ParseTreeAccessibilityFormatterTests) reflects any new identifiers or descriptors introduced during shortcut work.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add or refine key command registration so iPad hardware keyboards expose the same focus commands as macOS, using hidden Button.keyboardShortcut registrations or platform\u2011specific commands modifiers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update AccessibilitySupport helpers and related tests if new labels or hints are required for shortcut discoverability or VoiceOver announcements.", + "source_line": null + }, + { + "type": "invariant", + "description": "Existing focus routing relies on InspectorFocusTarget bindings inside ParseTreeOutlineView and ParseTreeDetailView to coordinate selection, keyboard shortcuts, and accessibility identifiers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Keyboard Shortcut Registration for Pane Focus", + "description": "Registers hardware keyboard shortcuts (\u2318\u23251\u20134 on macOS and equivalent on iPadOS) to shift focus between outline, detail, notes, and hex panes.", + "source_line": null + }, + { + "name": "Focus Routing Logic in Outline View", + "description": "Manages .focused bindings in ParseTreeOutlineView to update selection and maintain focus scope when pane switches occur.", + "source_line": null + }, + { + "name": "Focus Routing Logic in Detail View", + "description": "Handles .focused bindings in ParseTreeDetailView for consistent focus updates during pane changes.", + "source_line": null + }, + { + "name": "Accessibility Identifier Assignment", + "description": "Assigns unique accessibility identifiers to outline, detail, notes, and hex panes via AccessibilitySupport helpers.", + "source_line": null + }, + { + "name": "VoiceOver Announcement Handling", + "description": "Ensures arrow key navigation and move commands announce the active element using descriptors from AccessibilitySupport.", + "source_line": null + }, + { + "name": "Keyboard Command Discovery UI", + "description": "Provides discoverable key command listings in iPadOS hardware keyboard context menus or help menu items.", + "source_line": null + }, + { + "name": "Accessibility Documentation Update", + "description": "Documents shortcut map, focus behavior, and accessibility expectations in AccessibilityGuidelines.md and related release notes.", + "source_line": null + }, + { + "name": "Automated Accessibility Tests", + "description": "Runs ParseTreeAccessibilityIdentifierTests and ParseTreeAccessibilityFormatterTests to verify identifiers and descriptors after changes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3905, + "line_count": 36 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ab7e7db8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/Summary_of_Work.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide centralized focus shortcuts and a Focus command menu for macOS and iPadOS so that outline, detail, notes, and hex panes can be navigated using the same hardware commands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Focus shortcuts are exposed in InspectorFocusShortcutCatalog and bound to hidden keyboard accelerators and the new Focus command menu across platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The explorer view\u2019s focus binding is registered with the SwiftUI scene so that .focused scopes stay synchronized when commands fire.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility documentation reflects the updated keyboard navigation improvements.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Manual VoiceOver regression pass confirms discoverability strings and focus announcements match the updated commands on macOS and iPadOS.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "InspectorFocusShortcutCatalog", + "description": "Centralized focus shortcuts catalog exposing focus command menu for macOS and iPadOS", + "source_line": null + }, + { + "name": "ParseTreeExplorerView Focus Binding", + "description": "Wires ParseTreeExplorerView to share focus bindings so outline, detail, notes, and hex panes respond to the same hardware commands", + "source_line": null + }, + { + "name": "SwiftUI Scene Focus Synchronization", + "description": "Registers explorer view's focus binding with SwiftUI scene to keep .focused scopes synchronized when commands fire", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1264, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/next_tasks_metrics.json new file mode 100644 index 00000000..989d6ba8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/next_tasks_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/next_tasks.md", + "n_spec": 3, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes must not exceed parent ranges and overlapping payloads are disallowed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Hardware focus shortcuts should flow through a shared catalog and Focus command menu so macOS and iPadOS expose the same key bindings and restore focus targets without pointer input.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When schema updates are intentional, snapshots and CLI fixtures must be refreshed via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parent Containment Validation", + "description": "Ensures child boxes cannot exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Accessibility & Keyboard Shortcuts Integration", + "description": "Provides shared catalog of hardware focus shortcuts and Focus command menu to expose consistent key bindings across macOS and iPadOS, restoring focus targets without pointer input.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Manages licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Refresh", + "description": "Automates refreshing of snapshots and CLI fixtures when schema updates occur via environment variable and test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1308, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts_metrics.json b/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts_metrics.json new file mode 100644 index 00000000..817810fa --- /dev/null +++ b/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts.md", + "n_spec": 7, + "n_func": 12, + "intent_atoms": [ + { + "type": "user_story", + "description": "Validate VoiceOver behavior on macOS and iPadOS hardware for the refreshed Focus command menu and shared keyboard shortcuts from Task G8", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "On macOS, enabling VoiceOver and invoking each Focus command (\u2318\u23251 through \u2318\u23254) announces the pane name from InspectorFocusShortcutCatalog, shifts focus into the correct SwiftUI scope, and reselects the previous node when applicable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "On iPadOS with a hardware keyboard, the discoverability HUD and commands menu expose the same shortcuts, VoiceOver announces the menu titles, and focus switches among outline, detail, notes, and hex panes without pointer interaction.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Manual VoiceOver navigation within each pane (arrow keys in the outline, metadata traversal in the detail view, byte stepping in the hex view) retains accessibility identifiers and announcements that match the formatter expectations documented in the guidelines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "QA notes summarizing the macOS and iPadOS runs, including any issues or screenshots, are archived alongside Task\u00a0G8 once testing concludes.", + "source_line": null + }, + { + "type": "invariant", + "description": "The .focused bindings in ParseTreeOutlineView and ParseTreeDetailView must update as expected when the scene value changes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use the Focus menu or associated shortcuts to cycle panes while VoiceOver is active; confirm the .focused bindings in ParseTreeOutlineView and ParseTreeDetailView.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Focus Command Menu", + "description": "UI component that lists focus shortcuts for switching panes", + "source_line": null + }, + { + "name": "Keyboard Shortcuts (\u2318\u23251-4)", + "description": "Hardware keyboard bindings to invoke Focus commands on macOS", + "source_line": null + }, + { + "name": "VoiceOver Announcements for Pane Names", + "description": "Accessibility feature that announces the target pane when a shortcut is used", + "source_line": null + }, + { + "name": "Focus Transfer Logic", + "description": "Mechanism that moves VoiceOver focus into the correct SwiftUI scope and reselects previous node", + "source_line": null + }, + { + "name": "iPadOS Hardware Keyboard Support", + "description": "Exposes same shortcuts via discoverability HUD and commands menu on iPadOS", + "source_line": null + }, + { + "name": "Outline Pane Navigation", + "description": "Arrow key traversal within the outline view with proper accessibility identifiers", + "source_line": null + }, + { + "name": "Detail View Metadata Traversal", + "description": "Keyboard navigation through metadata in the detail pane with correct announcements", + "source_line": null + }, + { + "name": "Hex View Byte Stepping", + "description": "Byte-level stepping in hex pane with accurate formatter-based announcements", + "source_line": null + }, + { + "name": "Accessibility Identifiers Maintenance", + "description": "Ensures identifiers like NestedA11yIDs remain consistent for VoiceOver", + "source_line": null + }, + { + "name": "Accessibility Formatter Support", + "description": "Use of HexByteAccessibilityFormatter and other formatters to generate announcements", + "source_line": null + }, + { + "name": "Automated Test Coverage for Focus Shortcut Strings", + "description": "XCTest suite that verifies InspectorFocusShortcutCatalog strings are synchronized", + "source_line": null + }, + { + "name": "QA Reporting and Archiving", + "description": "Process of recording findings, screenshots, and QA notes in Task G8 archive", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3876, + "line_count": 41 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f1616eee --- /dev/null +++ b/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run the VoiceOver regression pass on macOS 14+ and iPadOS 17+ hardware to capture announcements for each Focus shortcut", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver regression pass must be executed on physical devices running macOS 14+ and iPadOS 17+ and all Focus shortcuts\u2019 announcements captured and archived under Task G8", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Any VoiceOver QA notes or screenshots must be attached to DOCS/TASK_ARCHIVE/155_G8_Accessibility_and_Keyboard_Shortcuts/ after physical testing is complete", + "source_line": null + }, + { + "type": "invariant", + "description": "Automated regression coverage must remain green when running swift test in the container environment", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 944, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/next_tasks_metrics.json new file mode 100644 index 00000000..69a7fc51 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts/next_tasks.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes must not exceed parent ranges and overlapping payloads are disallowed.", + "source_line": null + }, + { + "type": "user_story", + "description": "VoiceOver regression pass for accessibility shortcuts to ensure focus command menu announces controls and restores focus targets on macOS and iPadOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Manual VoiceOver verification confirms new focus command menu announces controls and restores focus targets as expected.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world asset licensing must be secured for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H before synthetic payloads can be replaced.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshots and CLI fixtures are refreshed only when schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parent Containment Validation", + "description": "Validates that child boxes are within parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Verification", + "description": "Manual VoiceOver verification on macOS and iPadOS to ensure focus command menu announces controls and restores focus targets.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot and CLI Fixture Refresh", + "description": "Refreshes snapshots and CLI fixtures when schema updates occur via a specific test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1399, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/J2_Persist_Security_Scoped_Bookmarks_metrics.json b/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/J2_Persist_Security_Scoped_Bookmarks_metrics.json new file mode 100644 index 00000000..519de5e3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/J2_Persist_Security_Scoped_Bookmarks_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/J2_Persist_Security_Scoped_Bookmarks.md", + "n_spec": 13, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Restore previously authorized files across sessions using FilesystemAccessKit bookmarks", + "source_line": null + }, + { + "type": "user_story", + "description": "Heal stale bookmark entries and prompt user for remediation", + "source_line": null + }, + { + "type": "user_story", + "description": "Align audit logging with zero-trust policies by recording hashed events for each lifecycle transition", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session restoration must reopen prior documents without manual re-authorization when files remain available", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Stale or invalid bookmarks trigger deterministic cleanup and user prompts, with remediation logged using hashed identifiers and covered by regression tests", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Recent-files lists and CLI automation guides document the refreshed workflow, including export/import of bookmark data for headless scenarios", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests confirm scopes are activated and revoked exactly once per access and that audit events mirror CLI coverage", + "source_line": null + }, + { + "type": "invariant", + "description": "Bookmark persistence records must map to the session controller without duplicating scope ownership", + "source_line": null + }, + { + "type": "invariant", + "description": "Legacy recents entries must reference bookmark IDs after migration", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use CoreData or JSON for BookmarkStore persistence, ensuring mapping to session controller", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement backfill scripts for legacy data lacking audit metadata", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend FilesystemAccessKit error handling to classify stale bookmark failures and emit structured diagnostics", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update documentation and cross\u2011reveal?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FilesystemAccessKit Bookmark Ledger", + "description": "Manages security-scoped URLs, persists consent, and records hashed audit events for every lifecycle transition", + "source_line": null + }, + { + "name": "Session Restoration via Bookmarks", + "description": "Restores previously authorized files across sessions using stored bookmarks without manual re-authorization", + "source_line": null + }, + { + "name": "Stale/Invalid Bookmark Cleanup", + "description": "Detects stale or invalid bookmarks, triggers deterministic cleanup, prompts user, logs remediation with hashed identifiers", + "source_line": null + }, + { + "name": "Bookmark Migration and Backfill", + "description": "Migrates legacy recent-file entries to reference bookmark IDs and backfills missing audit metadata", + "source_line": null + }, + { + "name": "Error Handling for Bookmark Resolution", + "description": "Classifies stale bookmark resolution failures, surfaces actionable recovery in UI, emits structured diagnostics", + "source_line": null + }, + { + "name": "Bookmark Rotation & Revocation Workflow", + "description": "Provides UI and CLI guidance for rotating and revoking bookmarks, including headless authorization flows", + "source_line": null + }, + { + "name": "Audit Logging of Access Events", + "description": "Logs hashed identifiers for each access event, ensuring audit events mirror CLI coverage", + "source_line": null + }, + { + "name": "Automated Test Suites", + "description": "Unit, UI, and integration tests confirming scope activation/revocation, ledger edge cases, and hashed logging output", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2810, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/Summary_of_Work_metrics.json new file mode 100644 index 00000000..0411ee67 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/Summary_of_Work.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "Persisted bookmark identifiers must be annotated in audit events and failures must still redact paths while retaining ledger context.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Document session restoration passes bookmark identifiers into FilesystemAccessKit, refreshes stale records with new data, and removes failed ledger entries to keep recents accurate across launches.", + "source_line": null + }, + { + "type": "user_story", + "description": "Operators can correlate bookmark_id output with stored credentials via ledger-aware audit logging in the CLI sandbox guide.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Persist Security-Scoped Bookmarks", + "description": "Handles persistence of security-scoped bookmarks, annotating audit events with bookmark identifiers and ensuring failures redact paths while retaining ledger context.", + "source_line": null + }, + { + "name": "Document Session Restoration via Bookmark Identifiers", + "description": "Restores document sessions by passing bookmark identifiers into FilesystemAccessKit, refreshing stale records with new data, and removing failed ledger entries to keep recents accurate across launches.", + "source_line": null + }, + { + "name": "Bookmark Recovery Documentation", + "description": "Provides app manual guidance on bookmark recovery behavior and CLI sandbox guide updates for ledger-aware audit logging, enabling operators to correlate bookmark_id output with stored credentials.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1201, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/next_tasks_metrics.json new file mode 100644 index 00000000..6d9037a1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/157_J2_Persist_Security_Scoped_Bookmarks/next_tasks.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes cannot exceed parent ranges and overlapping payloads must be flagged during structural validation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "FilesystemAccessKit logs bookmark identifiers, refreshes stale ledger entries, and removes invalid recents to persist security\u2011scoped bookmarks.", + "source_line": null + }, + { + "type": "user_story", + "description": "VoiceOver regression pass for accessibility shortcuts: verify that new focus command menu announces controls and restores focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets (Dolby Vision, AV1, VP9 etc.) must be licensed before synthetic payloads can be replaced and regression baselines refreshed.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshot & CLI fixture maintenance is triggered by setting ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 and running swift test --filter JSONExportSnapshotTests when schema updates are intentional.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Enforce Parent Containment and Non-Overlap", + "description": "Validates that child boxes are within parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Persist Security-Scoped Bookmarks", + "description": "Logs bookmark identifiers, refreshes stale ledger entries, and removes invalid recent items in FilesystemAccessKit.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Manual VoiceOver verification on macOS/iPadOS to ensure focus command menu announces controls and restores focus targets.", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Refreshes snapshots and CLI fixtures when schema updates occur via ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1640, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/B2_Define_BoxNode_metrics.json b/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/B2_Define_BoxNode_metrics.json new file mode 100644 index 00000000..9b313542 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/B2_Define_BoxNode_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/158_B2_Define_BoxNode/B2_Define_BoxNode.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Define a canonical BoxNode domain model that captures parsed header metadata, optional payload details, validation issues, and child relationships for use in ISOInspector's UI, CLI, and export layers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A BoxNode type (or equivalent renamed domain struct) exists in ISOInspectorKit with properties for BoxHeader, optional catalog metadata, optional parsed payload, validation issues, and child nodes, all marked Sendable for concurrency safety.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming parse events can be accumulated into a deterministic BoxNode tree that UI stores, CLI formatters, and JSON exporters can consume without losing validation warnings or metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and developer guides reference the new node aggregate so future tasks understand how to traverse or extend the tree representation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression checks (unit tests or snapshot exports) demonstrate that building a tree from representative fixtures preserves header offsets, payload annotations, and validation results.", + "source_line": null + }, + { + "type": "invariant", + "description": "Metadata from BoxCatalog, parsed payload structures, and validation issues must attach to the node before it is emitted so downstream presentation layers stay synchronized.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Build on the existing ParsePipeline event stream by introducing or updating a builder that accumulates events into mutable nodes before snapshotting them as BoxNode instances.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Align naming and API surface with existing consumers (ParseTreeBuilder, UI tree stores, CLI exporters) to avoid parallel representations; migrate call sites to the canonical type where necessary.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxNode Domain Model", + "description": "Defines a canonical data structure representing a parsed box header, optional payload metadata, validation issues, and child nodes, marked Sendable for concurrency.", + "source_line": null + }, + { + "name": "ParseTreeBuilder Integration", + "description": "A builder that consumes ParsePipeline events to accumulate mutable nodes and snapshot them as BoxNode instances.", + "source_line": null + }, + { + "name": "UI Tree Store Compatibility", + "description": "Ensures the UI tree module operates on BoxNode representations for view models and exporters across ISOInspector targets.", + "source_line": null + }, + { + "name": "CLI Formatter Support", + "description": "Allows CLI formatters to consume deterministic BoxNode trees, preserving validation warnings and metadata.", + "source_line": null + }, + { + "name": "JSON Exporter Integration", + "description": "Enables JSON exporters to serialize BoxNode trees while maintaining header offsets, payload annotations, and validation results.", + "source_line": null + }, + { + "name": "Documentation & Developer Guides Update", + "description": "References the new node aggregate in docs so future tasks can traverse or extend the tree representation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2952, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/Summary_of_Work_metrics.json new file mode 100644 index 00000000..4ef7bfab --- /dev/null +++ b/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/158_B2_Define_BoxNode/Summary_of_Work.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "The BoxNode aggregate must be a sendable struct that captures headers, optional catalog metadata, parsed payload details, validation issues, and child nodes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "ParseTree now stores an array of BoxNode instead of ParseTreeNode; a public typealias preserves existing ParseTreeNode references to maintain backward compatibility.", + "source_line": null + }, + { + "type": "invariant", + "description": "The shared BoxNode aggregate is used by UI, CLI, and export layers, ensuring consistent tree representation across components.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxNode Aggregate", + "description": "Defines the canonical BoxNode domain type used across ISOInspectorKit for representing parsed data nodes with headers, optional catalog metadata, payload details, validation issues, and child nodes.", + "source_line": null + }, + { + "name": "ParseTree Structure", + "description": "Stores an array of BoxNode instances and provides a public typealias to preserve existing ParseTreeNode references.", + "source_line": null + }, + { + "name": "Tree Builder Responsibilities", + "description": "Defines responsibilities for building the shared tree model used by UI, CLI, and export layers.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 815, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/next_tasks_metrics.json new file mode 100644 index 00000000..573d4ad4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/158_B2_Define_BoxNode/next_tasks_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/158_B2_Define_BoxNode/next_tasks.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Define BoxNode Aggregate to formalize parse tree node model bridging streaming events to UI/CLI/export consumers.", + "source_line": null + }, + { + "type": "invariant", + "description": "Child boxes cannot exceed parent ranges and must not overlap payloads.", + "source_line": null + }, + { + "type": "user_story", + "description": "Persist Security-Scoped Bookmarks: log bookmark identifiers, refresh stale ledger entries, remove invalid recents.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver regression pass for accessibility shortcuts: manual verification on macOS and iPadOS hardware to confirm focus command menu announces controls and restores focus targets as expected.", + "source_line": null + }, + { + "type": "invariant", + "description": "Secure licensing for Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H fixtures before replacing synthetic payloads and refreshing regression baselines.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshot & CLI fixture maintenance: refresh snapshots and CLI fixtures whenever schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxNode Aggregate Definition", + "description": "Defines the parse tree node model that bridges streaming events to UI/CLI/export consumers.", + "source_line": null + }, + { + "name": "Parent Containment and Non-Overlap Enforcement", + "description": "Validates structural integrity ensuring child boxes stay within parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "Persist Security-Scoped Bookmarks", + "description": "Logs bookmark identifiers, refreshes stale ledger entries, and removes invalid recent items in the filesystem access layer.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Manual VoiceOver verification on macOS/iPadOS to confirm focus command menu announcements and focus target restoration.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Automated regeneration of snapshots and CLI fixtures when schema updates occur via a specific environment variable and test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1921, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/E1_Enforce_Parent_Containment_and_Non_Overlap_metrics.json b/DOCS/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/E1_Enforce_Parent_Containment_and_Non_Overlap_metrics.json new file mode 100644 index 00000000..5b95f7a9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/E1_Enforce_Parent_Containment_and_Non_Overlap_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/E1_Enforce_Parent_Containment_and_Non_Overlap.md", + "n_spec": 11, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure ISOInspector emits structural validation errors whenever a child box extends beyond its parent's byte range or overlaps neighbouring payload spans, keeping CLI and UI surfaces trustworthy for nested container layouts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation layer flags any child node whose computed end offset exceeds its parent's declared range or collides with sibling spans, emitting deterministic .error results.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI reports and SwiftUI issue lists surface the new containment failures with actionable messaging while keeping parse sessions stable after detection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression coverage exercises positive (well-formed) and negative (overflowing/overlapping) fixtures across parser, validation, CLI, and UI layers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation sources reflect the task's progress and completion status once shipped.", + "source_line": null + }, + { + "type": "invariant", + "description": "Container iteration must respect declared sizes as per VR-001/VR-002.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit existing BoxValidator/ValidationRuleContext metadata to confirm start/end offsets are available per node; extend tracking to retain sibling cursor state for overlap detection.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement containment accounting that accumulates consumed payload bytes per parent and compares each child header against both the parent's declared end and the running sibling boundary.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce targeted fixtures or synthesize ones that reproduce child overflow and overlap scenarios, wiring them into ISOInspectorKit tests and CLI snapshot assertions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Propagate new validation IDs through CLI formatting, JSON export annotations, and SwiftUI issue presenters so surfaces explain the error and highlight the offending node.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with validation preset defaults to ensure the new structural rule ships enabled and can be toggled consistently across app, CLI, and export pipelines.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Child Containment Validation", + "description": "Checks that each child box\u2019s end offset does not exceed its parent\u2019s declared byte range.", + "source_line": null + }, + { + "name": "Sibling Overlap Detection", + "description": "Detects when a child box overlaps the payload span of an adjacent sibling within the same parent.", + "source_line": null + }, + { + "name": "Error Reporting in CLI", + "description": "Outputs deterministic .error results for containment and overlap violations to the command\u2011line interface.", + "source_line": null + }, + { + "name": "SwiftUI Issue Presentation", + "description": "Displays containment failures as actionable issue lists in the SwiftUI UI, highlighting offending nodes.", + "source_line": null + }, + { + "name": "JSON Export Annotation", + "description": "Includes validation IDs and error details in JSON exports of parsing results.", + "source_line": null + }, + { + "name": "Fixture Generation for Validation Tests", + "description": "Creates positive and negative test fixtures that trigger child overflow and overlap scenarios for unit testing.", + "source_line": null + }, + { + "name": "Validation Rule Context Extension", + "description": "Extends BoxValidator metadata to track start/end offsets and sibling cursor state for accurate validation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3400, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/Summary_of_Work_metrics.json new file mode 100644 index 00000000..595dc30a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/159_E1_Enforce_Parent_Containment_and_Non_Overlap/Summary_of_Work.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure VR-002 surfaces deterministic errors whenever a child box extends past its parent's payload range or overlaps previously parsed siblings so downstream CLI/UI surfaces remain trustworthy.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Augmented ContainerBoundaryRule with explicit start/end comparisons, producing dedicated overlap and parent-range overflow diagnostics while keeping container stack recovery logic intact.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hardened stack accounting to preserve the furthest consumed offset, preventing later children from resetting parent boundaries after overlap detection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Added negative regression tests in BoxValidatorTests covering oversized children and overlapping siblings; verified the broader suite to guard against regressions in existing structural checks.", + "source_line": null + }, + { + "type": "invariant", + "description": "Container stack recovery logic must remain intact when detecting overlaps or parent-range overflows.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use explicit start/end comparisons in ContainerBoundaryRule for overlap and parent-range overflow diagnostics.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ContainerBoundaryRule", + "description": "Validates that child boxes stay within parent payload range and do not overlap siblings, producing diagnostics for overflow and overlap.", + "source_line": null + }, + { + "name": "BoxValidatorTests", + "description": "Test suite verifying container boundary rules, including oversized children and overlapping siblings.", + "source_line": null + }, + { + "name": "swift test --filter BoxValidatorTests", + "description": "Command to run the BoxValidatorTests test suite.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1228, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/15_Monitor_VR006_Research_Log_Adoption_metrics.json b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/15_Monitor_VR006_Research_Log_Adoption_metrics.json new file mode 100644 index 00000000..6407fc00 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/15_Monitor_VR006_Research_Log_Adoption_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/15_Monitor_VR006_Research_Log_Adoption.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure VR-006 research log entries are available and consistent across CLI and UI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Schema usage audit confirms CLI output, persisted research log files, and any UI viewer prototypes all read identical fields and severity semantics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Monitoring checklist created for upcoming UI milestones covering VR-006 event binding, log locations, and analyst workflows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updates proposed (or merged) to flag any schema adjustments required by UI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No regression in existing VR-006 tests or CLI behaviors after any follow-up changes.", + "source_line": null + }, + { + "type": "invariant", + "description": "CLI and UI clients share the same canonical field list during inspection runs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce ResearchLogMonitor.audit(logURL:) to validate stored entries and signal schema drift for downstream automation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Inspect Command", + "description": "Provides VR-006 research log streaming and schema banner via the inspect command in the CLI.", + "source_line": null + }, + { + "name": "ResearchLogSchema Exposure", + "description": "Defines the canonical field list for VR-006 logs shared between CLI and UI consumers.", + "source_line": null + }, + { + "name": "ResearchLogMonitor.audit(logURL:)", + "description": "Validates stored VR-006 entries against the schema and signals drift for downstream automation.", + "source_line": null + }, + { + "name": "VR006 Monitoring Checklist", + "description": "Tracks UI integration checkpoints, log locations, and analyst workflows related to VR-006.", + "source_line": null + }, + { + "name": "Automated Smoke Tests for VR-006", + "description": "Ensures research log writers and viewers remain aligned after UI integrations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2937, + "line_count": 66 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/Summary_of_Work_metrics.json new file mode 100644 index 00000000..daf468bc --- /dev/null +++ b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/Summary_of_Work.md", + "n_spec": 2, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a CLI schema banner that displays VR-006 research log fields for both CLI and UI consumers", + "source_line": null + }, + { + "type": "user_story", + "description": "Enable programmatic audit of stored research log files to verify conformance to the supported schema via ResearchLogMonitor.audit(logURL:)", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Schema Banner", + "description": "Displays a banner in the CLI that shows the VR-006 research log schema fields sourced from ResearchLogSchema", + "source_line": null + }, + { + "name": "ResearchLogMonitor.audit(logURL:)", + "description": "Programmatic checkpoint that verifies stored research log files conform to the supported VR-006 schema", + "source_line": null + }, + { + "name": "UI Integration of Audit Helper via ResearchLogPreviewProvider", + "description": "Integrates the audit helper into SwiftUI previews for visual inspection", + "source_line": null + }, + { + "name": "UI Smoke Telemetry Test (ResearchLogTelemetrySmokeTests)", + "description": "Watches UI for missing VR-006 entries during smoke testing", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 905, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/VR006_Monitoring_Checklist_metrics.json b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/VR006_Monitoring_Checklist_metrics.json new file mode 100644 index 00000000..5ffec837 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/VR006_Monitoring_Checklist_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/VR006_Monitoring_Checklist.md", + "n_spec": 6, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "CLI emits VR-006 schema version and field list for analysts to verify downstream tooling compatibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide a programmatic audit that UI prototypes can run to confirm log compatibility before binding to streaming events.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Audit helper validates persisted logs contain only supported fields and surfaces mismatches.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI output must capture schema metadata for quick regression detection.", + "source_line": null + }, + { + "type": "invariant", + "description": "Schema version v1.0 enumerates boxType, filePath, startOffset, endOffset; any additions require a coordinated schema bump.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit helper throws descriptive error when unexpected keys appear, to be surfaced in developer tooling and CI.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Schema Banner", + "description": "Outputs VR-006 schema version and field list during isoinspect inspect command for regression detection", + "source_line": null + }, + { + "name": "Schema Audit Helper", + "description": "Validates persisted logs against supported fields and surfaces mismatches; throws descriptive errors on unexpected keys", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1264, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/next_tasks_metrics.json new file mode 100644 index 00000000..e30695ef --- /dev/null +++ b/DOCS/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/15_Monitor_VR006_Research_Log_Adoption/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must consistently surface insights from the VR-006 research log schema to both CLI and UI consumers as UI components evolve.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 160, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/Summary_of_Work_metrics.json new file mode 100644 index 00000000..8c8927e5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/Summary_of_Work_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/Summary_of_Work.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes cannot extend beyond their parent's payload range or overlap previously parsed siblings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ContainerBoundaryRule must emit VR-002 errors for overlaps and parent-range overflows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxValidatorTests exercise overflowing and overlapping child fixtures to surface actionable diagnostics for each violation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ContainerBoundaryRule Stack Accounting", + "description": "Validates child box offsets against parent payload range and sibling boundaries to enforce containment and prevent overlap, emitting VR-002 errors for violations.", + "source_line": null + }, + { + "name": "BoxValidatorTests Suite", + "description": "Automated tests that exercise overflowing and overlapping child fixtures to ensure proper diagnostics are surfaced during validation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1212, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/next_tasks_metrics.json new file mode 100644 index 00000000..24f33ef8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/160_Summary_of_Work_2025-10-23/next_tasks.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Child boxes cannot exceed parent ranges and overlapping payloads must be flagged during structural validation.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run manual VoiceOver verification on macOS and iPadOS hardware to confirm the new focus command menu announces controls and restores focus targets as expected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver regression pass for accessibility shortcuts must be achieved before completion.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets (Dolby Vision, AV1 etc.) must be licensed before synthetic payloads can be replaced and regression baselines refreshed.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshots and CLI fixtures are regenerated via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests when schema updates are intentional.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parent Containment Validation", + "description": "Ensures child boxes cannot exceed parent ranges and flags overlapping payloads for CLI/UI surfaces.", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Verification", + "description": "Manual VoiceOver verification on macOS and iPadOS to confirm focus command menu announcements and focus target restoration.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Securing licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot and CLI Fixture Refresh", + "description": "Automated regeneration of snapshots and CLI fixtures when schema updates occur via ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1399, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/R7_CLI_Distribution_Strategy_metrics.json b/DOCS/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/R7_CLI_Distribution_Strategy_metrics.json new file mode 100644 index 00000000..500cf889 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/R7_CLI_Distribution_Strategy_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/R7_CLI_Distribution_Strategy.md", + "n_spec": 6, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a signed distribution plan for the isoinspect CLI that aligns with app release cadence and includes notarized macOS binaries, Homebrew-style tap publication, and Linux artifact delivery.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Decision record must outline macOS notarized ZIP/DMG, Homebrew tap, and Linux packaging recommendations with signing implications.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Updated release checklist tasks and automation hooks necessary to ship CLI artifacts alongside app releases, including storage locations and checksum policies.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Risk assessment for each distribution channel (licensing, tooling prerequisites, update cadence) with mitigation steps and owner hand-offs captured in the research output.", + "source_line": null + }, + { + "type": "invariant", + "description": "CLI build and notarization steps must be audited and recorded to determine reuse or adjustments for standalone distribution.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define artifact naming, storage layout, and checksum publication rules so QA and release engineering can confirm binary provenance during go/no-go reviews.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Build Automation", + "description": "Automates building the ISOInspectorCLI product using swift build in release configuration", + "source_line": null + }, + { + "name": "Notarization Script", + "description": "Runs scripts/notarize_app.sh to notarize macOS CLI binaries and packages", + "source_line": null + }, + { + "name": "Artifact Packaging", + "description": "Creates signed ZIP or DMG distributions for macOS CLI", + "source_line": null + }, + { + "name": "Homebrew Tap Publication", + "description": "Publishes a Homebrew formula for the macOS CLI into a tap repository", + "source_line": null + }, + { + "name": "Linux Packaging Pipeline", + "description": "Builds and packages the CLI for Linux, supporting static/dynamic builds and package manager releases", + "source_line": null + }, + { + "name": "Checksum Generation", + "description": "Generates checksums for all released artifacts to verify integrity", + "source_line": null + }, + { + "name": "Release Checklist Integration", + "description": "Adds tasks and automation hooks to the release checklist for CLI artifact shipping", + "source_line": null + }, + { + "name": "Distribution Decision Record", + "description": "Documents recommended distribution channels, signing, and packaging choices", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3584, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ed9228c1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/Summary_of_Work_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/161_R7_CLI_Distribution_Strategy/Summary_of_Work.md", + "n_spec": 7, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a documented CLI distribution strategy for notarized macOS releases, Homebrew tap workflow, Linux packaging, automation hooks, and risk mitigations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation includes notarized macOS distribution steps, Homebrew tap workflow, Linux packaging details, automation hooks, and risk mitigations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Release readiness runbook incorporates CLI packaging checks into pre-release validation, reuses the new script helper, and enumerates artifact naming for macOS and Linux deliverables.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add scripts/package_cli.sh to orchestrate building, signing, zipping, checksum generation, and notarization submission for CLI releases.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI must invoke scripts/package_cli.sh --skip-notarize on tagged builds and publish artifacts as GitHub Release assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish and maintain the private isoinspector/homebrew-tap repository referenced by the strategy.", + "source_line": null + }, + { + "type": "invariant", + "description": "The script helper must always generate checksum files for each artifact.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Release Packaging Script", + "description": "Automates building, signing, zipping, checksum generation, and notarization submission for isoinspect CLI releases via scripts/package_cli.sh", + "source_line": null + }, + { + "name": "Homebrew Tap Workflow Documentation", + "description": "Guides the process of publishing the isoinspect CLI to a private Homebrew tap repository", + "source_line": null + }, + { + "name": "Linux Packaging Process", + "description": "Details how the isoinspect CLI is packaged for Linux distributions", + "source_line": null + }, + { + "name": "macOS Distribution with Notarization", + "description": "Specifies notarized macOS distribution steps and artifact naming conventions", + "source_line": null + }, + { + "name": "Pre-Release Validation Integration", + "description": "Integrates CLI packaging checks into the release readiness runbook for pre-release validation", + "source_line": null + }, + { + "name": "GitHub Release Asset Publishing", + "description": "CI extension to publish packaged artifacts as GitHub Release assets on tagged builds", + "source_line": null + }, + { + "name": "Checksum Verification Workflow", + "description": "Documentation of checksum verification steps for QA during first release", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1479, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/Summary_of_Work_metrics.json new file mode 100644 index 00000000..fc5108d6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/Summary_of_Work_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/Summary_of_Work.md", + "n_spec": 0, + "n_func": 6, + "intent_atoms": [], + "functional_units": [ + { + "name": "CLI Distribution Strategy Decision Record", + "description": "Published decision record outlining the strategy for distributing CLI binaries across platforms", + "source_line": null + }, + { + "name": "Release Checklist Update", + "description": "Updated release checklist to include notarized macOS binaries, Homebrew tap updates, and Linux tarball delivery steps", + "source_line": null + }, + { + "name": "Automation Helper for Release Process", + "description": "Helper tool that automates parts of the CI pipeline for CLI distribution", + "source_line": null + }, + { + "name": "Notarized macOS Binary Distribution", + "description": "Process for delivering notarized macOS binaries as part of release engineering", + "source_line": null + }, + { + "name": "Homebrew Tap Update Mechanism", + "description": "Procedure to publish and update Homebrew tap repository with new CLI releases", + "source_line": null + }, + { + "name": "Linux Tarball Delivery Pipeline", + "description": "Pipeline that delivers Linux tarballs for the CI/CD workflow", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 735, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/next_tasks_metrics.json new file mode 100644 index 00000000..ae126fce --- /dev/null +++ b/DOCS/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/next_tasks_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/162_Summary_of_Work_2025-10-23_CLI_Distribution_Follow_Up/next_tasks.md", + "n_spec": 0, + "n_func": 3, + "intent_atoms": [], + "functional_units": [ + { + "name": "VoiceOver Accessibility Shortcut Verification", + "description": "Manual VoiceOver verification on macOS and iPadOS hardware to confirm focus command menu announces controls and restores focus targets.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Secure licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot and CLI Fixture Refresh", + "description": "Refresh snapshots and CLI fixtures when schema updates occur using ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable and swift test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 989, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/E2_Detect_Progress_Loops_metrics.json b/DOCS/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/E2_Detect_Progress_Loops_metrics.json new file mode 100644 index 00000000..2e4425d2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/E2_Detect_Progress_Loops_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/E2_Detect_Progress_Loops.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure the streaming parser always makes forward progress by detecting zero- or negative-advance iterations and enforcing a safe maximum nesting depth so malformed media cannot hang parsing or exhaust resources.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing any fixture or fuzzed input must either complete or emit a structured validation error without entering an infinite loop or exceeding the configured depth budget.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New unit and regression tests cover zero/negative-size boxes, malicious largesize combinations, and degenerate container nesting, failing if progress guards or depth caps are bypassed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI, UI, and JSON export smoke tests continue to succeed, demonstrating that the added guards do not regress legitimate deep hierarchies.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Logging or diagnostics clearly communicate when progress limits are triggered so follow-up fixture triage can occur quickly.", + "source_line": null + }, + { + "type": "invariant", + "description": "The streaming parser must always advance monotonically in offset before reading the next header.", + "source_line": null + }, + { + "type": "invariant", + "description": "A centralized maximum-depth constant is shared by kit, CLI, and UI targets to keep guard rails consistent across entry points.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the streaming parser loop (within BoxParser and any iterator helpers) to track the previous offset and assert monotonic advancement before reading the next header.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Surface guard failures through existing validation error plumbing, aligning with VR-001/VR-002 behavior while avoiding noisy duplication for already-covered bounds checks.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Streaming Parser Progress Guard", + "description": "Ensures the streaming parser makes forward progress by detecting zero- or negative-advance iterations and enforcing a safe maximum nesting depth to prevent hangs or resource exhaustion.", + "source_line": null + }, + { + "name": "Maximum Depth Constant", + "description": "Centralized constant shared across kit, CLI, and UI targets that defines the allowed maximum nesting depth for parsing boxes.", + "source_line": null + }, + { + "name": "Guard Failure Validation Error", + "description": "Surface guard failures through existing validation error plumbing, emitting structured errors when progress limits are triggered.", + "source_line": null + }, + { + "name": "Progress Tracking in Parser Loop", + "description": "Extend the BoxParser loop and iterator helpers to track previous offset and assert monotonic advancement before reading the next header.", + "source_line": null + }, + { + "name": "Regression Test Suite for Progress Guards", + "description": "Unit and regression tests covering zero/negative-size boxes, malicious largesize combinations, and degenerate container nesting to ensure guard rails trip during automated testing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2928, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/next_tasks_metrics.json new file mode 100644 index 00000000..2a6fdf27 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/163_E2_Detect_Progress_Loops/next_tasks.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Detect Zero/Negative Progress Loops in the streaming parser to prevent non-progressing iterations and cap nesting depth.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The streaming parser must detect non-progressing iterations and enforce a maximum nesting depth as defined in E2_Detect_Progress_Loops.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run manual VoiceOver verification on macOS and iPadOS hardware to confirm focus command menu announces controls and restores focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver must announce all controls in the focus command menu and restore focus targets correctly after interaction, as verified by manual testing.", + "source_line": null + }, + { + "type": "invariant", + "description": "Licensing for Dolby Vision, AV1 etc. must be secured before synthetic payloads can be replaced or regression baselines refreshed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Refresh snapshots and CLI fixtures whenever the schema updates are intentional.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Streaming Parser Progress Loop Detection", + "description": "Detects non-progressing iterations in the streaming parser and caps nesting depth to prevent infinite loops.", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Shortcut Verification", + "description": "Runs manual VoiceOver verification on macOS and iPadOS hardware to confirm focus command menu announcements and focus target restoration.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot and CLI Fixture Refresh", + "description": "Refreshes snapshots and CLI fixtures when schema updates occur using a regeneration flag and test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1225, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b992cc23 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/Summary_of_Work_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/Summary_of_Work.md", + "n_spec": 3, + "n_func": 1, + "intent_atoms": [ + { + "type": "invariant", + "description": "The ParseIssue model must be tolerant and not halt traversal when corruption events occur.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "ParseIssue is implemented as a validation model conforming to Codable, Equatable, Sendable for use across app, CLI, and export layers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover initializer behavior and JSON round-tripping of ParseIssue.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssue Model", + "description": "A tolerant parsing issue model capturing severity, code, message, byte range, and node reference for corruption events without halting traversal.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 825, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/next_tasks_metrics.json new file mode 100644 index 00000000..f9d0adc9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/next_tasks_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/164_Summary_of_Work_ParseIssue_Model/next_tasks.md", + "n_spec": 7, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "No active research tasks beyond the items listed below.", + "source_line": null + }, + { + "type": "user_story", + "description": "Define ParseIssue Model to underpin tolerant parsing mode.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssue model implemented and documented in Summary_of_Work.md and planning resources in DOCS/AI/Tolerance_Parsing/README.md.", + "source_line": null + }, + { + "type": "invariant", + "description": "VoiceOver Regression Pass for Accessibility Shortcuts is blocked without hardware.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run manual VoiceOver verification on macOS and iPadOS to confirm new focus command menu announces controls and restores focus targets as expected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tracking details live in DOCS/TASK_ARCHIVE/...md.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real-World Assets task is blocked awaiting external licensing approvals.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssue Model Definition", + "description": "Defines the structured corruption event model ParseIssue to support tolerant parsing mode.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Manual VoiceOver verification on macOS and iPadOS hardware to confirm focus command menu announcements and focus target restoration.", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Securing licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads and refresh regression baselines.", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Refreshing snapshots and CLI fixtures when schema updates occur using ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable and swift test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1317, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/Summary_of_Work_metrics.json new file mode 100644 index 00000000..5209ad16 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/Summary_of_Work_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/Summary_of_Work.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "ParseTreeNode.issues and status fields must be present and default to maintain source compatibility", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseTreeNode with Issues and Status Fields to support tolerant parsing metadata", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 815, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/T1_2_Extend_ParseTreeNode_Status_and_Issues_metrics.json b/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/T1_2_Extend_ParseTreeNode_Status_and_Issues_metrics.json new file mode 100644 index 00000000..1774b3ee --- /dev/null +++ b/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/T1_2_Extend_ParseTreeNode_Status_and_Issues_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/T1_2_Extend_ParseTreeNode_Status_and_Issues.md", + "n_spec": 10, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Enable tolerant parsing by extending ParseTreeNode to include issues metadata and status enum so that corrupted media can be surfaced without halting traversal.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeNode exposes an issues array of ParseIssue objects and a status enum capturing valid, partial, corrupt, or skipped states, defaulting to valid for untouched nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON export and any mirrored CLI serialization include the new status and issue array so tolerance diagnostics persist in saved artifacts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tree stores, document view models, and other in-memory aggregates remain source-compatible while gaining accessors for corruption metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and snapshot tests covering healthy and corrupt fixture scenarios validate serialization, ensure backward compatibility for strict mode, and demonstrate how tolerant mode will consume the new fields.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseTreeNode must always expose a status enum and an issues collection; default status is valid when no issues are present.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with T1.1 ParseIssue model to reuse severity codes and byte-range metadata when populating node issues.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit BoxNode/ParseTreeNode initializers and builders to accept optional issue lists without breaking streaming parse performance.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update export encoders and any bridging structures (Combine stores, CLI summaries) to forward status and issues, guarding strict-mode paths that expect empty collections.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Prepare migration notes for downstream tasks so they can rely on the enriched node model without additional refactors.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeNode Issues and Status Exposure", + "description": "Adds an `issues` array of ParseIssue objects and a status enum to each ParseTreeNode for tolerant parsing.", + "source_line": null + }, + { + "name": "JSON Export Augmentation", + "description": "Extends the JSON export (and CLI serialization) to include node status and issues so diagnostics persist in artifacts.", + "source_line": null + }, + { + "name": "In-Memory Store Compatibility Layer", + "description": "Ensures tree stores, document view models, and aggregates remain source-compatible while providing accessors for corruption metadata.", + "source_line": null + }, + { + "name": "Unit and Snapshot Testing for Tolerant Parsing", + "description": "Provides tests covering healthy and corrupt fixtures to validate serialization and backward compatibility with strict mode.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2479, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/next_tasks_metrics.json new file mode 100644 index 00000000..4ff9c315 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/next_tasks_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/165_T1_2_Extend_ParseTreeNode_Status_and_Issues/next_tasks.md", + "n_spec": 9, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "No active research tasks beyond the items listed below.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend ParseTreeNode with Issues and Status Fields to emit tolerant parsing metadata, expose status and issues in JSON exports, and surface status indicator in app detail views.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parse tree nodes must emit tolerant parsing metadata; JSON exports must include status and issues fields; app detail views must display the status indicator.", + "source_line": null + }, + { + "type": "invariant", + "description": "VoiceOver Regression Pass for Accessibility Shortcuts is blocked without hardware.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track manual VoiceOver verification on macOS and iPadOS hardware to confirm focus command menu announces controls and restores focus targets as expected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Manual VoiceOver verification must confirm that focus command menu announces controls and restores focus targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real-World Assets task is blocked awaiting external licensing approvals.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure Dolby Vision, AV1.. etc. to shift regression baselines from synthetic payloads once approvals land.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals must be obtained for Dolby Vision\u2026.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeNode Metadata Extension", + "description": "Adds issues and status fields to parse tree nodes, exposing tolerant parsing metadata in JSON exports and UI detail views.", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Verification", + "description": "Manually tracks VoiceOver focus command menu announcements and focus restoration on macOS and iPadOS hardware.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing", + "description": "Secures external licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to enable realistic regression baselines.", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Refresh", + "description": "Automates refreshing of snapshots and CLI fixtures when schema updates occur via a regeneration flag and test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1199, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/Summary_of_Work_metrics.json new file mode 100644 index 00000000..350b9570 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/Summary_of_Work.md", + "n_spec": 5, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "ParsePipeline must store default options and resolve them per context", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "ParsePipeline.Options includes abortOnStructuralError, maxCorruptionEvents, payloadValidationLevel settings with .strict/.tolerant presets", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Contexts inherit pipeline defaults unless explicitly overridden", + "source_line": null + }, + { + "type": "user_story", + "description": "Runtime clients should pick strict or tolerant mode without extra configuration via ISOInspectorCLIEnvironment and DocumentSessionController", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests cover strict/tolerant defaults and dependency injection", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline Options", + "description": "Configurable parsing options with strict/tolerant presets and default propagation to CLI and app entry points.", + "source_line": null + }, + { + "name": "ParsePipeline.Options Settings", + "description": "Settings include abortOnStructuralError, maxCorruptionEvents, payloadValidationLevel, and .strict/.tolerant presets.", + "source_line": null + }, + { + "name": "Context Default Inheritance", + "description": "Contexts inherit pipeline defaults unless explicitly overridden.", + "source_line": null + }, + { + "name": "Configuration Exposure Tests", + "description": "Tests covering strict/tolerant defaults and dependency injection for ParsePipeline configuration.", + "source_line": null + }, + { + "name": "ISOInspectorCLIEnvironment Configuration", + "description": "Wires strict defaults through ISOInspectorCLIEnvironment for runtime clients.", + "source_line": null + }, + { + "name": "DocumentSessionController Configuration", + "description": "Wires tolerant defaults through DocumentSessionController for runtime clients.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1135, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/T1_3_ParsePipeline_Options_metrics.json b/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/T1_3_ParsePipeline_Options_metrics.json new file mode 100644 index 00000000..28cf89c1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/T1_3_ParsePipeline_Options_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/T1_3_ParsePipeline_Options.md", + "n_spec": 11, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Define a configurable ParsePipeline.Options structure that lets the parser toggle between strict and tolerant execution modes while exposing limits for corruption reporting and payload validation depth.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline.Options type exists in ISOInspectorKit with documented properties: abortOnStructuralError, maxCorruptionEvents, and payloadValidationLevel (enum covering strict vs. limited payload parsing).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Default options selected for each client: CLI defaults to strict (abortOnStructuralError == true), app/SDK defaults to tolerant (false) with sensible corruption/event caps.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover serialization or initialization defaults and verify that pipeline components receive the options via dependency injection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Public API documentation updated where necessary so downstream callers understand new configuration entry points.", + "source_line": null + }, + { + "type": "invariant", + "description": "Current pipeline behavior aborts on structural errors; introducing options is prerequisite for continuing after corrupt headers and recording ParseIssue metadata.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit ParsePipeline initialization and thread the new options through constructors or builder methods.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider namespacing payloadValidationLevel via a dedicated enum (e.g., .full, .structureOnly) with room for expansion highlighted in the tolerance PRD.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update CLI/app wiring to pass explicit options; stubs may live near ISOInspectorKit+Configuration.swift and ISOInspectorApp document controllers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with upcoming T1.4 refactors so options plumbing does not conflict with the Result-based decoder work.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Capture decision notes on maximum corruption events (initial recommendation: 500 before halting) and document rationale for future tuning.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline.Options Structure", + "description": "Defines configurable options for the parser including strict/tolerant modes and limits for corruption reporting and payload validation depth.", + "source_line": null + }, + { + "name": "abortOnStructuralError Property", + "description": "Boolean flag to abort parsing on structural errors; true in CLI, false in app/SDK defaults.", + "source_line": null + }, + { + "name": "maxCorruptionEvents Property", + "description": "Limit on number of corruption events before halting the parser (default 500).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2660, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/next_tasks_metrics.json new file mode 100644 index 00000000..8231a358 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/166_T1_3_ParsePipeline_Options/next_tasks.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Track manual VoiceOver verification on macOS and iPadOS hardware to confirm the focus command menu announces controls and restores focus targets as expected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver focus command menu must announce all controls and restore focus targets correctly after interaction.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always maintain correct focus target restoration when VoiceOver is active.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG\u2011H fixtures for regression baselines to shift from synthetic payloads once approvals are available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All requested fixtures must be obtained and integrated into regression tests before proceeding.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refresh snapshots and CLI fixtures whenever schema updates are intentional via the specified command.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Accessibility Shortcut Verification", + "description": "Manual tracking and verification of VoiceOver focus command menu announcements and focus restoration on macOS and iPadOS hardware.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Process to secure licensing for Dolby Vision, AV1, VP9, Dolby AC\u20114, and MPEG\u2011H fixtures to enable regression baselines with real-world media.", + "source_line": null + }, + { + "name": "Snapshot and CLI Fixture Refresh", + "description": "Automated or manual regeneration of JSON export snapshots and command-line interface fixtures when schema changes occur using a specific test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 842, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bce5367f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Summary_of_Work.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "BoxHeaderDecoder.readHeader must return a Result instead of throwing errors.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The decoder internals are refactored into a shared implementation that populates Result values rather than throwing.", + "source_line": null + }, + { + "type": "user_story", + "description": "Legacy callers can still use the deprecated strict convenience wrapper for BoxHeaderDecoder.readHeader.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "StreamingBoxWalker and unit tests must adopt the new API surface, propagating failures explicitly and validating both success and failure scenarios across existing coverage.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxHeaderDecoder.readHeader API", + "description": "Provides a result-based method to read and parse box headers, returning either a BoxHeader or a BoxHeaderDecodingError", + "source_line": null + }, + { + "name": "Deprecated strict convenience wrapper for BoxHeaderDecoder.readHeader", + "description": "Legacy synchronous API that throws errors instead of returning Result", + "source_line": null + }, + { + "name": "Shared decoder implementation", + "description": "Internal logic used by both strict and tolerant parsing flows to populate Result values", + "source_line": null + }, + { + "name": "StreamingBoxWalker integration", + "description": "Component that consumes the BoxHeaderDecoder API, propagating failures explicitly and continuing traversal in tolerant mode", + "source_line": null + }, + { + "name": "Unit tests for header decoding", + "description": "Test suite validating success and failure scenarios of the new result-based API", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1043, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Task_Brief_metrics.json b/DOCS/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Task_Brief_metrics.json new file mode 100644 index 00000000..96c3f933 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Task_Brief_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/Task_Brief.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Enable tolerant parsing flows to capture malformed header diagnostics without halting iteration by refactoring BoxHeaderDecoder to return Result values instead of throwing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxHeaderDecoder exposes a non-throwing API that conveys malformed header conditions via a typed error and preserves successful decoding semantics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Call sites capture failure cases, attach ParseIssue metadata with appropriate severity and byte ranges, and continue iterating within the parent box boundaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression test coverage demonstrates tolerant mode continues after malformed headers while strict mode behavior remains unchanged.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation or inline guidance clarifies how the new API participates in the broader tolerance parsing pipeline and future tasks (T1.5+).", + "source_line": null + }, + { + "type": "invariant", + "description": "Preserve ABI/API stability for strict-mode callers by offering convenience wrappers if necessary, but prefer internal adoption of the Result-based API to avoid double handling.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit decoder entry points across ISOInspectorKit to ensure each path handles the new Result contract.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with upcoming tasks (T1.5\u2013T1.7) so error propagation, boundary clamps, and progress guards share consistent error typing and issue reporting.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend or introduce focused unit tests simulating truncated or oversize headers to verify tolerant parsing emits issues and advances to the next sibling box.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxHeaderDecoder Result API", + "description": "Refactored decoder that returns Result instead of throwing errors", + "source_line": null + }, + { + "name": "Tolerant Parsing Integration", + "description": "Mechanism for downstream callers to translate decoding errors into ParseIssue records and continue iteration within parent box boundaries", + "source_line": null + }, + { + "name": "Strict Mode Compatibility Wrapper", + "description": "Convenience wrapper preserving ABI/API stability for strict-mode callers while internally using the Result-based API", + "source_line": null + }, + { + "name": "Error Propagation Consistency", + "description": "Unified error typing and issue reporting across decoder, boundary clamps, and progress guards to support tolerant parsing pipeline", + "source_line": null + }, + { + "name": "Unit Test Suite for Malformed Headers", + "description": "Focused tests simulating truncated or oversize headers to verify tolerant parsing emits issues and advances to next sibling box", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2529, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/Summary_of_Work_metrics.json new file mode 100644 index 00000000..2b568573 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/Summary_of_Work_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/Summary_of_Work.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Decoder now returns Result values instead of throwing errors; all call sites/tests consume the non-throwing API.", + "source_line": null + }, + { + "type": "user_story", + "description": "Propagate decoder failures into tolerant parsing issue reporting and allow traversal to continue (T1.5).", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 732, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/next_tasks_metrics.json new file mode 100644 index 00000000..98af752d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/next_tasks_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/168_Summary_of_Work_2025-10-24/next_tasks.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Decoder must return Result values so tolerant parsing can record malformed header diagnostics.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track manual VoiceOver verification on macOS and iPadOS hardware to confirm the focus command menu announces controls and restores focus targets as expected.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real-World Assets task is blocked until external licensing approvals are obtained for Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG-H fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refresh snapshots and CLI fixtures whenever schema updates are intentional via ISOINSPECTION_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxHeaderDecoder Result Refactor", + "description": "Refactors the BoxHeaderDecoder to return Result values for tolerant parsing and diagnostic recording", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Tracks manual VoiceOver verification on macOS/iPadOS hardware to confirm focus command menu announcements and focus restoration", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secures Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H fixtures for regression baselines after licensing approvals", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Refreshes snapshots and CLI fixtures when schema updates occur using ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1092, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ffc7e9f6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Streaming walker must not abort on decoder failures; instead it should convert failures into ParseIssue records and advance within parent boundaries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "ParsePipeline.live propagates tolerant options, tracks per-node issues, and emits them with parse events for tree builders and captures.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseEvent/ParseTreeBuilder/capture payload must carry parse issues end-to-end.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression coverage must include tolerant recovery and parse tree aggregation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Walker", + "description": "Inspects BoxHeaderDecoder results with tolerant options, converts failures into ParseIssue records, and advances within parent boundaries instead of aborting.", + "source_line": null + }, + { + "name": "ParsePipeline Live Propagation", + "description": "Propagates tolerant options, tracks per-node issues, and emits them with parse events for tree builders and captures.", + "source_line": null + }, + { + "name": "ParseEvent Payload Extension", + "description": "Carries parse issues end-to-end through ParseEvent/ParseTreeBuilder/capture payload.", + "source_line": null + }, + { + "name": "ParseIssue Aggregation API", + "description": "Aggregates parse issues across nodes and provides them to downstream consumers such as CLI/app summaries.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 879, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing_metrics.json b/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing_metrics.json new file mode 100644 index 00000000..9a2235fd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing.md", + "n_spec": 9, + "n_func": 1, + "intent_atoms": [ + { + "type": "user_story", + "description": "Enable the streaming container walker to treat BoxHeaderDecoder failures as recoverable events by emitting ParseIssue records on the active node and resuming iteration without aborting tolerant parses.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Decoder failures encountered during container iteration attach a ParseIssue to the current node with reason code, byte range, and severity, matching the acceptance test bullets in DOCS/AI/Tolerance_Parsing/TODO.md (T1.5).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After logging the issue, iteration advances to the next sibling using the parent boundary without infinite loops or duplicate traversal.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing strict parsing flows remain unchanged; unit and integration tests for strict mode continue to pass.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New regression coverage demonstrates tolerant continuation for at least one malformed header fixture (e.g., truncated size, exceedsParent).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update the streaming walker (StreamingBoxWalker.walk and related helpers) to switch on the Result returned by BoxHeaderDecoder and translate failures into ParseIssue instances via the tolerant parsing options.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure parent-range arithmetic leverages the existing forward-progress guard from Task B3 so tolerant mode cannot re-read the same offsets when a header is rejected.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend tolerant parsing tests to cover skipped headers and placeholder nodes, referencing corrupt fixture notes in DOCS/TASK_ARCHIVE/167_T1_4_BoxHeaderDecoder_Result_API/ and follow-ups captured in DOCS/AI/Tolerance_Parsing/ResearchSummary.md.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Confirm CLI/app integrations that depend on header iteration continue to surface nodes in order, updating snapshots only when intentional.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "StreamingBoxWalker.walk", + "description": "Iterates over container boxes, handling header decoding and node traversal", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2790, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/next_tasks_metrics.json new file mode 100644 index 00000000..b0ffe21a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/next_tasks_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/169_T1_5_Propagate_Decoder_Failures_Through_Tolerant_Parsing/next_tasks.md", + "n_spec": 7, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Propagate Decoder Failures Through Tolerant Parsing: Update streaming iteration to capture BoxHeaderDecoder failures, attach diagnostics to the current node, and continue traversal.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Continue traversal per the acceptance criteria tracked in DOCS/AI/Tolerance_Parsing/TODO.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "VoiceOver Regression Pass for Accessibility Shortcuts: Schedule macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Hardware verification must be scheduled only after confirming availability of required macOS and iPadOS devices.", + "source_line": null + }, + { + "type": "user_story", + "description": "Real-World Assets: Secure Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG\u2011H fixtures to shift regression baselines from synthetic payloads once approvals land.", + "source_line": null + }, + { + "type": "invariant", + "description": "Licensing approvals must be obtained before assets can be secured.", + "source_line": null + }, + { + "type": "user_story", + "description": "Snapshot & CLI Fixture Maintenance: Refresh snapshots and CLI fixtures whenever schema updates are an intentional change, using ISOINSPECTT...", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Propagate Decoder Failures Through Tolerant Parsing", + "description": "Update streaming iteration to capture BoxHeaderDecoder failures, attach diagnostics to the current node, and continue traversal per acceptance criteria", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Schedule macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secure Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures so regression baselines can shift from synthetic payloads", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Refresh snapshots and CLI fixtures whenever schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1175, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/04_Integrate_ResearchLogMonitor_SwiftUI_Previews_metrics.json b/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/04_Integrate_ResearchLogMonitor_SwiftUI_Previews_metrics.json new file mode 100644 index 00000000..7fb2fc81 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/04_Integrate_ResearchLogMonitor_SwiftUI_Previews_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/04_Integrate_ResearchLogMonitor_SwiftUI_Previews.md", + "n_spec": 7, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create SwiftUI preview scaffolding that runs ResearchLogMonitor.audit(logURL:) against representative VR-006 research log samples so UI components can validate schema alignment before binding live parse events.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI previews load a deterministic VR-006 research log fixture, invoke ResearchLogMonitor.audit, and render the results (schema version, field names, entry counts) without runtime errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Preview failure cases (missing file, schema mismatch) surface developer-facing diagnostics that mirror CLI expectations, preventing silent drift between surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and inline preview guidance point to the shared schema source so UI engineers can update fixtures alongside schema changes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests or preview assertions prevent regressions by ensuring the audit call stays wired into the preview pipeline during future UI work.", + "source_line": null + }, + { + "type": "invariant", + "description": "Previews must exercise ResearchLogMonitor.audit without diverging from the shared schema definition exposed by ResearchLogMonitor.swift.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide preview-only adapters (e.g., PreviewResearchLogProvider) that locate or synthesize the log file, allowing multiple UI previews to share the same audit result while remaining deterministic.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogMonitor.audit(logURL:)", + "description": "Runs audit on a research log file and returns schema validation results", + "source_line": null + }, + { + "name": "SwiftUI preview scaffolding for ResearchLogMonitor", + "description": "Loads deterministic VR-006 fixture, invokes audit, and renders schema version, field names, entry counts in SwiftUI previews", + "source_line": null + }, + { + "name": "PreviewResearchLogProvider", + "description": "Adapter that locates or synthesizes a log file for use by multiple UI previews", + "source_line": null + }, + { + "name": "CLI fixtures integration", + "description": "Reuses existing CLI JSON samples as deterministic test data for the preview audit", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3963, + "line_count": 56 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1e6fd585 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/Summary_of_Work.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Integrated ResearchLogMonitor.audit(logURL:) into SwiftUI previews through the new preview provider and diagnostics view scaffolding.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add deterministic VR-006 fixtures so previews reuse the same schema metadata that powers the CLI audit helper.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Create ResearchLogPreviewProviderTests to guard success, missing fixture, and schema mismatch scenarios and keep the preview pipeline wired into ResearchLogMonitor.", + "source_line": null + }, + { + "type": "user_story", + "description": "Introduce ResearchLogAuditPreview SwiftUI view plus preview scenarios that visualize schema alignment, drift, and missing fixture diagnostics for VR-006.", + "source_line": null + }, + { + "type": "invariant", + "description": "Mark todo item #4 and the matching next-task checklist entry as complete.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogMonitor.audit(logURL:)", + "description": "Audits a research log file at the specified URL and integrates results into SwiftUI previews", + "source_line": null + }, + { + "name": "ResearchLogPreviewProvider", + "description": "Provides deterministic VR-006 fixtures for SwiftUI previews, reusing schema metadata from CLI audit helper", + "source_line": null + }, + { + "name": "ResearchLogAuditPreview", + "description": "SwiftUI view that visualizes schema alignment, drift, and missing fixture diagnostics for VR-006 in preview scenarios", + "source_line": null + }, + { + "name": "ResearchLogPreviewProviderTests", + "description": "Unit tests ensuring preview pipeline success, handling of missing fixtures, and schema mismatch scenarios", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 945, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/next_tasks_metrics.json new file mode 100644 index 00000000..ba36cf67 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/16_Integrate_ResearchLogMonitor_SwiftUI_Previews/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Integrate ResearchLogMonitor.audit(logURL:) with SwiftUI previews to keep UI bindings aligned with the VR-006 research log schema.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend telemetry once UI smoke tests exist to monitor for missing VR-006 research log entries across CLI and UI consumers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogMonitor.audit(logURL:) integration", + "description": "Integrates the audit function into SwiftUI previews to keep UI bindings aligned with the VR-006 research log schema.", + "source_line": null + }, + { + "name": "Telemetry extension for missing VR-006 entries", + "description": "Extends telemetry to monitor and detect missing VR-006 research log entries across CLI and UI consumers using ResearchLogTelemetryProbe and UI smoke tests.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 357, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/Summary_of_Work_metrics.json new file mode 100644 index 00000000..85e97b2b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 598, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/T1_6_Implement_Binary_Reader_Guards_metrics.json b/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/T1_6_Implement_Binary_Reader_Guards_metrics.json new file mode 100644 index 00000000..32c1f661 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/T1_6_Implement_Binary_Reader_Guards_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/T1_6_Implement_Binary_Reader_Guards.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement binary reader guards to clamp reads within parent range and record truncation issues for tolerant parsing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reader never seeks or reads beyond a node\u2019s declared parent range while tolerant parsing is enabled.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssue entries with a truncatedPayload code are emitted whenever payload bytes run short, capturing the offending byte range.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict mode behavior remains unchanged: reader throws on overflow while tolerant mode records issues and continues traversal.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update StreamingBoxWalker (and helper readers) to track currentOffset/parentRange.upperBound and clamp skips to parent end when decoder failures occur in tolerant mode.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Emit ParseIssue payloads using existing construction pattern that records severity, byte ranges, and reason codes when a box declares more bytes than remain.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "StreamingBoxWalker Parent Range Guard", + "description": "Ensures the streaming reader never seeks or reads beyond a node\u2019s declared parent range while tolerant parsing is enabled.", + "source_line": null + }, + { + "name": "TruncatedPayload ParseIssue Emission", + "description": "Records and emits ParseIssue entries with truncatedPayload codes when payload bytes run short, capturing offending byte ranges for downstream consumers.", + "source_line": null + }, + { + "name": "Tolerant Mode Continuation Logic", + "description": "Allows the parser to continue traversal after recording truncation issues in tolerant mode while maintaining strict mode behavior of throwing on overflow.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2541, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/next_tasks_metrics.json new file mode 100644 index 00000000..ef236290 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/170_T1_6_Implement_Binary_Reader_Guards/next_tasks.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Streaming walker must clamp traversal to parent ranges and emit payload.truncated issues when payload bytes run short.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Decoder failure issues will be wired into CLI/app summaries once issue aggregation APIs land.", + "source_line": null + }, + { + "type": "user_story", + "description": "VoiceOver regression pass for accessibility shortcuts requires macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets such as Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures must be secured before regression baselines can shift from synthetic payloads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshots and CLI fixtures should refresh whenever schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Binary Reader Guards", + "description": "Clamps traversal to parent ranges and emits payload.truncated issues when payload bytes run short during streaming walk", + "source_line": null + }, + { + "name": "Decoder Failure Aggregation API Integration", + "description": "Wires archived decoder failure issues into CLI/app summaries once issue aggregation APIs are available", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Verification", + "description": "Verifies that focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + }, + { + "name": "Real-World Asset Licensing", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to shift regression baselines from synthetic payloads", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Refresh", + "description": "Refreshes snapshots and CLI fixtures when schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1508, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/Summary_of_Work_metrics.json new file mode 100644 index 00000000..2a013480 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/Summary_of_Work_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/Summary_of_Work.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement traversal guard logic and fixtures per the new specification before enabling tolerant parsing in downstream aggregators.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Traversal guard logic must adhere to forward-progress budgets, zero-length retry limits, recursion depth caps, and issue burst ceilings as defined in Traversal_Guard_Requirements.md.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 771, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/T1_7_Finalize_Traversal_Guard_Requirements_metrics.json b/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/T1_7_Finalize_Traversal_Guard_Requirements_metrics.json new file mode 100644 index 00000000..0f3983e0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/T1_7_Finalize_Traversal_Guard_Requirements_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/T1_7_Finalize_Traversal_Guard_Requirements.md", + "n_spec": 6, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement traversal guard requirements for tolerant parsing to prevent hangs and resource exhaustion while still emitting actionable ParseIssue diagnostics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Guard catalogue defines minimum progress budgets, zero-length retry limits, recursion caps, and per-frame issue ceilings with rationale linked to fixture behaviour and fuzzing goals.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Acceptance plan enumerates fixtures, fuzz harnesses, and regression tests that must pass once guards are implemented, preventing hangs while preserving valid traversal output.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "API notes specify new ParseIssue codes and ParsePipeline.Options knobs so downstream consumers can present guard violations consistently.", + "source_line": null + }, + { + "type": "invariant", + "description": "Traversal never hangs or explodes resource usage while still emitting actionable ParseIssue diagnostics.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "New ParseIssue codes and ParsePipeline.Options knobs are added to expose guard metadata to UI/CLI consumers.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2552, + "line_count": 35 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/next_tasks_metrics.json new file mode 100644 index 00000000..994cdcf7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/next_tasks_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/171_T1_7_Finalize_Traversal_Guard_Requirements/next_tasks.md", + "n_spec": 11, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement traversal guard enforcement inside StreamingBoxWalker to honor budgets defined in Traversal_Guard_Requirements.md and maintain strict mode behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Traversal guard enforcement must correctly enforce budgets as specified in Traversal_Guard_Requirements.md.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict mode behavior remains unchanged after adding traversal guard enforcement.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add corrupt fixtures (zero-size-loop.mp4, nested uuid stack, overlapping children) to the fixture catalog and integrate them into unit, integration, and fuzz harnesses.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Corrupt fixtures are added to the fixture catalog.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit, integration, and fuzz harnesses use the new corrupt fixtures.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update CLI/UI issue presenters to localize new guard.* codes and display guard counts in integrity summaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI/UI issue presenters localize all new guard.* codes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity summaries include guard counts.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture guard activation metrics in tolerant parsing dashboards to allow QA track hit rates across fuzz campaigns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Guard activation metrics are captured and displayed in the dashboard.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Traversal Guard Enforcement", + "description": "Enforces traversal guard budgets within StreamingBoxWalker according to defined requirements and maintains strict mode behavior", + "source_line": null + }, + { + "name": "Corrupt Fixture Catalog Extension", + "description": "Adds corrupt media fixtures (zero-size-loop.mp4, nested uuid stack, overlapping children) to the catalog for testing harnesses", + "source_line": null + }, + { + "name": "CLI/UI Issue Presenter Localization", + "description": "Localizes new guard.* error codes in CLI/UI presenters and displays guard counts in integrity summaries", + "source_line": null + }, + { + "name": "Guard Activation Metrics Capture", + "description": "Collects and reports guard activation metrics in tolerant parsing dashboards for QA tracking", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 609, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/Summary_of_Work_metrics.json new file mode 100644 index 00000000..6e8f5cdc --- /dev/null +++ b/DOCS/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 494, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/next_tasks_metrics.json new file mode 100644 index 00000000..9540267e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/172_Summary_of_Work_2025-10-26/next_tasks.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Implement traversal guard logic, fixtures, and telemetry as defined in the specified documentation.", + "source_line": null + }, + { + "type": "user_story", + "description": "Wire decoder failure issues into CLI/app summaries once aggregation APIs land.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Schedule macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets for VoiceOver regression pass.", + "source_line": null + }, + { + "type": "invariant", + "description": "Secure Dolby Vision, AV1 etc fixtures so regression baselines can shift from synthetic payloads once approvals land.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refresh snapshots and CLI fixtures whenever schema updates are intentional via ISOINSPECTER_REGENERATE_SNAPSHOT...", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Traversal Guard Implementation", + "description": "Implements guard logic, fixtures, and telemetry for traversal guard as per specified documentation.", + "source_line": null + }, + { + "name": "Tolerant Parsing \u2013 Surface Issues in Downstream Consumers", + "description": "Wires decoder failure issues into CLI/app summaries once aggregation APIs are available, tracking roadmap context.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Schedules macOS/iPadOS hardware verification to ensure focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Secures Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures for regression baselines after licensing approvals.", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Refreshes snapshots and CLI fixtures when schema updates occur using specified test command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1406, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bb4f0f74 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Summary_of_Work_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Summary_of_Work.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement traversal guard thresholds in ParsePipeline.Options to control parsing behavior.", + "source_line": null + }, + { + "type": "user_story", + "description": "Enforce traversal guards in StreamingBoxWalker and emit scoped ParseIssue diagnostics for each guard.", + "source_line": null + }, + { + "type": "user_story", + "description": "Mark affected nodes as .partial when guard issues occur, keeping parse-tree snapshots aligned with corruption reports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Traversal guard thresholds must include maxTraversalDepth, maxStalledIterationsPerFrame, maxZeroLengthBoxesPerParent, and maxIssuesPerFrame.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "StreamingBoxWalker must enforce forward-progress, zero-length flood, recursion depth, cursor regression, and per-node issue budget.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Guard issues should emit scoped ParseIssue diagnostics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tolerant mode should skip corrupt structures without regressing strict behavior.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parsing results must remain consistent with the updated ParseTreeBuilder partial marking.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParsePipeline.Options and re\u2011use\u00a0the\u00a0..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "StreamingBoxWalker Traversal Guard Enforcement", + "description": "Enforces forward-progress, zero-length flood prevention, recursion depth limits, cursor regression checks, and per-node issue budgets during streaming box traversal.", + "source_line": null + }, + { + "name": "ParsePipeline Options Extension for Traversal Guards", + "description": "Provides configuration options (maxTraversalDepth, maxStalledIterationsPerFrame, maxZeroLengthBoxesPerParent, maxIssuesPerFrame) to control guard thresholds and preset modes.", + "source_line": null + }, + { + "name": "Scoped ParseIssue Diagnostics Emission", + "description": "Generates scoped ParseIssue diagnostics for each traversal guard violation during parsing.", + "source_line": null + }, + { + "name": "ParseTreeBuilder Partial Node Marking", + "description": "Automatically marks affected nodes as .partial when guard issues occur, keeping parse-tree snapshots aligned with corruption reports.", + "source_line": null + }, + { + "name": "Tolerant Parsing Mode Behavior", + "description": "Skips corrupt structures in tolerant mode while preserving strict behavior for non-tolerant parsing.", + "source_line": null + }, + { + "name": "Zero-Length Flood Handling Tests", + "description": "Regression tests validating correct handling of zero-length box floods during traversal.", + "source_line": null + }, + { + "name": "Recursion Depth Cap Tests", + "description": "Regression tests ensuring recursion depth limits are respected.", + "source_line": null + }, + { + "name": "Traversal Guard Option Defaults Tests", + "description": "Regression tests verifying default values for guard options.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1423, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Traversal_Guard_Implementation_metrics.json b/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Traversal_Guard_Implementation_metrics.json new file mode 100644 index 00000000..cc7c315d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Traversal_Guard_Implementation_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/Traversal_Guard_Implementation.md", + "n_spec": 8, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement tolerant parsing traversal guard logic in StreamingBoxWalker to enforce forward progress, depth limits, and corruption budgets while maintaining strict-mode behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Guard implementation emits documented ParseIssue codes (guard.no_progress, guard.zero_size_loop, etc.) with correct metadata when thresholds trigger.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Lenient traversal never loops indefinitely on corrupt fixtures; strict mode continues to abort on the first structural error.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New corrupt fixtures (e.g., zero-size flood, overlapping boxes) are added and referenced by regression tests covering guard activation paths.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI/app surfaces reflect guard issues in summaries or telemetry hooks without duplicate reporting.", + "source_line": null + }, + { + "type": "invariant", + "description": "Guard-triggered nodes adjust ParseTreeNode.status to .partial and integrate with existing logging/telemetry categories.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParsePipeline.Options with guard configuration parameters and propagate them through tolerant parsing entry points.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update StreamingBoxWalker (and related iterators) to enforce minimum cursor advances, zero-length limits, recursion depth caps, cursor regression fences, and per-frame issue budgets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline Options Guard Configuration", + "description": "Extends the parsing pipeline options to include guard configuration parameters for tolerant parsing.", + "source_line": null + }, + { + "name": "StreamingBoxWalker Forward Progress Enforcement", + "description": "Ensures that the streaming box walker advances its cursor forward and does not regress, enforcing minimum cursor advancement.", + "source_line": null + }, + { + "name": "Zero-Size Loop Detection", + "description": "Detects and prevents loops caused by zero-length boxes during traversal.", + "source_line": null + }, + { + "name": "Recursion Depth Cap", + "description": "Limits the depth of recursive parsing to prevent stack overflows or infinite recursion.", + "source_line": null + }, + { + "name": "Cursor Regression Fence", + "description": "Prevents the parser cursor from moving backwards, acting as a fence against regression.", + "source_line": null + }, + { + "name": "Per-Frame Issue Budgeting", + "description": "Implements a budget for the number of parse issues per frame to limit corruption handling.", + "source_line": null + }, + { + "name": "ParseIssue Emission", + "description": "Generates documented ParseIssue codes such as guard.no_progress, guard.zero_size_loop etc., with correct metadata when thresholds are triggered.", + "source_line": null + }, + { + "name": "Partial Node Status Update", + "description": "Adjusts ParseTreeNode.status to partial for nodes affected by guard triggers.", + "source_line": null + }, + { + "name": "Logging and Telemetry Integration", + "description": "Integrates guard-triggered node status changes and issues with existing logging/telemetry categories.", + "source_line": null + }, + { + "name": "CLI/APP Summary Reporting", + "description": "Displays guard issues in summaries or telemetry hooks within the CLI/app without duplicate reporting.", + "source_line": null + }, + { + "name": "Regression Test Fixtures for Guard Paths", + "description": "Adds or refreshes test fixtures (zero\u2011size flood, etc..) and tests that cover guard activation paths.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2366, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/next_tasks_metrics.json new file mode 100644 index 00000000..f1c6489b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/173_T1_8_Traversal_Guard_Implementation/next_tasks.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Traversal Guard logic must be implemented according to DOCS/AI/Tolerance_Parsing/Traversal_Guard_Requirements.md and verified via DOCS/INPROGRESS/Summary_of_Work.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Wire decoder failure issues into CLI/app summaries once aggregation APIs land, following T1.5.", + "source_line": null + }, + { + "type": "invariant", + "description": "VoiceOver regression pass must confirm focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real-World Assets (Dolby Vision etc.) must be secured before regression baselines can shift from synthetic payloads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshot & CLI fixtures should be refreshed whenever schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Traversal Guard API", + "description": "Provides guard logic for traversal operations, including telemetry hooks and fixture support as per Traversal Guard requirements.", + "source_line": null + }, + { + "name": "Tolerant Parsing Decoder Failure Propagation", + "description": "Exposes an aggregation API that surfaces decoder failure issues into CLI/app summaries during tolerant parsing.", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Shortcut Verification", + "description": "Offers a verification workflow to ensure VoiceOver focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Manages licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG-H fixtures used in regression baselines.", + "source_line": null + }, + { + "name": "Snapshot and CLI Fixture Refresh Tool", + "description": "Automates refreshing of JSON export snapshots and CLI fixtures when schema updates occur via a regeneration command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1407, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..4e31c206 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/Summary_of_Work_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/Summary_of_Work.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a shared ParseIssueStore aggregate that records tolerant parsing issues and exposes metrics to downstream observers", + "source_line": null + }, + { + "type": "user_story", + "description": "Allow node and byte range queries on stored parsing issues", + "source_line": null + }, + { + "type": "user_story", + "description": "Make the ParseIssueStore available through ISOInspectorCLIEnvironment and ParseTreeStore for CLI and SwiftUI clients", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssueStore must publish issue collections via @Published", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Metrics tracking must be implemented and exposed", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Main\u2011thread coordination is required to ensure safe reuse across Combine and CLI workflows", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "StreamingBoxWalker must supply depth values for each issue", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The\u00a0ParsePipeline.Context\u00a0must\u00a0be\u00a0the\u00a0one\u00a0..??", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore Aggregate", + "description": "Records tolerant parsing issues, supports node/byte range queries, and publishes real-time metrics for downstream observers.", + "source_line": null + }, + { + "name": "StreamingBoxWalker Depth-aware Issue Emission", + "description": "Supplies depth values when emitting issues to enable store to calculate deepest affected depth without re-traversal.", + "source_line": null + }, + { + "name": "ParsePipeline Context Integration", + "description": "Propagates an optional ParseIssueStore, resets it before runs and records issues as they stream in.", + "source_line": null + }, + { + "name": "ISOInspectorCLIEnvironment Exposure", + "description": "Exposes the ParseIssueStore through CLI environment for commands to access shared metrics.", + "source_line": null + }, + { + "name": "ParseTreeStore Exposure", + "description": "Provides SwiftUI state with access to shared metrics via ParseTreeStore.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1520, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/T2_1_ParseIssueStore_Aggregation_metrics.json b/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/T2_1_ParseIssueStore_Aggregation_metrics.json new file mode 100644 index 00000000..fcdc9532 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/T2_1_ParseIssueStore_Aggregation_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/T2_1_ParseIssueStore_Aggregation.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create a shared ParseIssueStore aggregate that captures tolerant parsing issues during streaming runs and exposes them to CLI and SwiftUI consumers with real-time metrics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssueStore records issues emitted by tolerant parsing pipelines, supports queries by node identifier and byte range, and publishes metrics summarizing severity counts and deepest affected depth.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming parse workflows pass a store instance through ValidationContext, ensuring CLI summaries and SwiftUI observers receive issue updates without additional bookkeeping.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and integration tests cover recording, querying, and metric computation paths, including concurrent issue emissions that drive UI refreshes.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseIssueStore must be an ObservableObject with @Published issue collections and IssueMetrics struct for summary ribbons.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Thread the store through ParsePipeline and ValidationContext so validators and traversal hooks register issues centrally instead of mutating ParseTreeNode arrays directly.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update the Combine bridge (ParseTreeStore, CLI capture utilities) to observe the new store and react to @Published metrics, preparing downstream tasks without implementing them yet.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore aggregate", + "description": "Observable object that records tolerant parsing issues by node and byte range, publishes issue collections and metrics for UI and CLI", + "source_line": null + }, + { + "name": "IssueMetrics struct", + "description": "Lightweight summary of severity counts and deepest affected depth exposed by ParseIssueStore", + "source_line": null + }, + { + "name": "Query helpers", + "description": "Functions to retrieve issues from ParseIssueStore filtered by node identifier or byte range", + "source_line": null + }, + { + "name": "Combine bridge integration", + "description": "Connects ParseIssueStore to ValidationContext, ParsePipeline, CLI capture utilities and SwiftUI observers via @Published properties", + "source_line": null + }, + { + "name": "Unit and integration tests for store", + "description": "Tests covering recording, querying, metric computation, concurrent emissions and ordering", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3236, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/next_tasks_metrics.json new file mode 100644 index 00000000..376c6f66 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/174_T2_1_ParseIssueStore_Aggregation/next_tasks.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The shared aggregation store, metrics, and tests must be consistent across ISOInspectorKit, CLI, and SwiftUI scaffolding.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend the tolerant parsing event stream to include severity, offset, and reason metadata for downstream UI and CLI surfacing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The extended event stream must provide severity, offset, and reason metadata that unblocks downstream UI and CLI work.", + "source_line": null + }, + { + "type": "invariant", + "description": "VoiceOver regression tests must confirm focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule and perform macOS and i\u2011pad\u00a0iOS hardware verification for VoiceOver regression pass.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hardware verification should be completed with reference to the documented task archive.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore Aggregation", + "description": "Aggregates shared issue store data, metrics, and tests across ISOInspectorKit, CLI, and SwiftUI scaffolding.", + "source_line": null + }, + { + "name": "Issue Metrics Presentation", + "description": "Extends tolerant parsing event stream with severity, offset, and reason metadata for UI and CLI surfacing.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verifies VoiceOver focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "name": "Real-World Assets Integration", + "description": "Secures Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to shift regression baselines from synthetic payloads.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1026, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..9181c984 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/Summary_of_Work.md", + "n_spec": 3, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "ParseIssueStore aggregate must record tolerant parsing events and expose query helpers for downstream consumers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Thread ParseIssueStore through ParsePipeline, CLI environment, and ParseTreeStore to propagate tolerant parsing issues.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specs are finalized.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore aggregate", + "description": "Records tolerant parsing events and provides query helpers for accessing stored issues", + "source_line": null + }, + { + "name": "Metrics publishing for ParseIssueStore", + "description": "Publishes metrics related to tolerant parsing events", + "source_line": null + }, + { + "name": "Threaded ParseIssueStore through ParsePipeline", + "description": "Propagates tolerant parsing issues to downstream consumers via the parse pipeline", + "source_line": null + }, + { + "name": "Integration with CLI environment", + "description": "Makes ParseIssueStore available in command-line interface operations", + "source_line": null + }, + { + "name": "Integration with ParseTreeStore state", + "description": "Stores and exposes parsed tree issues within application state", + "source_line": null + }, + { + "name": "Unit tests for ParseIssueStore behavior", + "description": "Provides automated test coverage for store functionality", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 927, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/next_tasks_metrics.json new file mode 100644 index 00000000..613211a7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/175_Summary_of_Work_2025-10-26_ParseIssueStore_Aggregation/next_tasks.md", + "n_spec": 2, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must always maintain consistent snapshot and CLI fixture data when schema updates are intentional.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshot and CLI fixtures will be refreshed using the ISOINSPECTOR_REGENERATE_SNAPSHOT environment variable and swift test command.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Surface Issue Aggregation", + "description": "Provides shared aggregation and metrics for tolerant parsing flows via the ParseIssueStore component.", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Shortcut Regression Pass", + "description": "Verifies macOS and iPadOS hardware focus command menus announce controls and restore focus targets for VoiceOver accessibility shortcuts.", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Integration", + "description": "Secures Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to enable regression baselines using real-world media assets.", + "source_line": null + }, + { + "name": "Snapshot and CLI Fixture Maintenance Tool", + "description": "Refreshes snapshots and CLI fixtures automatically when schema updates occur, triggered by ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1015, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/B2_Plus_AsyncSequence_Event_Stream_metrics.json b/DOCS/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/B2_Plus_AsyncSequence_Event_Stream_metrics.json new file mode 100644 index 00000000..be599c32 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/B2_Plus_AsyncSequence_Event_Stream_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/B2_Plus_AsyncSequence_Event_Stream.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement the production AsyncSequence interface for ParsePipeline so streaming parse events feed CLI and SwiftUI consumers without blocking while preserving tolerant parsing metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline.live() constructs an AsyncThrowingStream powered by StreamingBoxWalker, yielding ordered box lifecycle events with validation, research logging, and issue tracking wired for downstream consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI and SwiftUI entry points consume the stream directly with async/await, matching the architecture\u2019s distribution guidance without additional bridging layers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression coverage exercises ordered delivery and error propagation through the finalized stream so downstream integrations inherit the guarantees captured during evaluation.", + "source_line": null + }, + { + "type": "invariant", + "description": "The live event stream must preserve sub-200\u202fms event latency for UI consumers as committed in the PRD.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the existing AsyncThrowingStream builder to host the real StreamingBoxWalker, ensuring metadata/environment coordinators remain connected to validators, research logging, and random-access tracking when yielding events.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit CLI and SwiftUI consumers against the finalized stream contract, adjusting adapters or documentation only if required to keep within the PRD\u2019s latency expectations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the existing interface tests (and add integration coverage if necessary) so ordered emission and failure propagation remain enforced once the live walker powers the stream.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "AsyncThrowingStream-based ParsePipeline.live()", + "description": "Provides an async throwing stream of ordered box lifecycle events from StreamingBoxWalker for consumers", + "source_line": null + }, + { + "name": "CLI event consumer", + "description": "Command-line interface that subscribes to the ParsePipeline live stream using async/await and processes events", + "source_line": null + }, + { + "name": "SwiftUI event consumer", + "description": "SwiftUI UI layer that consumes the ParsePipeline live stream asynchronously to update views", + "source_line": null + }, + { + "name": "StreamingBoxWalker integration", + "description": "Internal walker that yields parsing events, validation, research logging, and issue tracking into the stream", + "source_line": null + }, + { + "name": "Metadata/environment coordinator wiring", + "description": "Connects validators, research logging, and random-access tracking to the stream during event emission", + "source_line": null + }, + { + "name": "Ordered delivery enforcement", + "description": "Guarantees that events are emitted in order and errors propagate correctly through the stream", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3238, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b1533225 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/176_B2_Plus_AsyncSequence_Event_Stream/Summary_of_Work.md", + "n_spec": 3, + "n_func": 4, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Replaced the SwiftUI bridge with direct AsyncSequence consumption so ParseTreeStore drives updates from ParsePipeline.events(for:context:) without Combine intermediaries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Removed the obsolete ParsePipelineEventBridge implementation and refreshed iOS, iPadOS, and macOS build targets to drop the source file.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extended app tests and performance benchmarks to exercise the new streaming path, and refactored CLI/app fixtures to rely on the unified stream.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "AsyncSequence Consumption of ParsePipeline Events", + "description": "Directly consumes AsyncSequence from ParsePipeline.events(for:context:) to drive updates in ParseTreeStore without Combine", + "source_line": null + }, + { + "name": "ParseTreeStore Update Mechanism", + "description": "Provides observable updates based on parsed events and drives UI or other consumers", + "source_line": null + }, + { + "name": "Removed Combine Bridge (ParsePipelineEventBridge)", + "description": "Eliminates obsolete bridge that previously translated Combine publishers into AsyncSequence", + "source_line": null + }, + { + "name": "Unified Stream for CLI/App Fixtures", + "description": "CLI and app fixtures rely on a single unified event stream for testing and performance benchmarks", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 725, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/Summary_of_Work_metrics.json new file mode 100644 index 00000000..830daec7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/Summary_of_Work_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/Summary_of_Work.md", + "n_spec": 3, + "n_func": 0, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Rewired ParseTreeStore to iterate ParsePipeline.events(for:context:) directly with Swift concurrency.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Removed the Combine-only ParsePipelineEventBridge and updated Xcode project sources.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "swift test verifies async streaming without the bridge.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 630, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/next_tasks_metrics.json new file mode 100644 index 00000000..ab8291ef --- /dev/null +++ b/DOCS/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/177_Summary_of_Work_2025-10-24/next_tasks.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "VoiceOver regression pass for accessibility shortcuts must confirm focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Schedule macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets (Dolby Vision, AV1, VP9, Dolby AC\u20114, MPEG\u2011H) must be secured so regression baselines can shift from synthetic payloads once approvals land.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Secure Dolby Vision, AV1\u2026 etc. awaiting licensing approvals.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Snapshot and CLI fixtures should refresh whenever schema updates are intentional via ISOINSPECTOR_REGENERATE_SNAPSH?.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify that focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secure licensing approvals for Dolby Vision, AV1, VP9, Dolby AC\u20114, and MPEG\u2011H fixtures to enable regression baselines with real-world media", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Refresh JSON export snapshots and command\u2011line interface fixtures when schema updates occur using the ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable", + "source_line": null + }, + { + "name": "Tolerant Parsing Metrics UI in SwiftUI", + "description": "Display ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specifications are finalized", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1062, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/178_Snapshot_and_CLI_Fixture_Maintenance_metrics.json b/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/178_Snapshot_and_CLI_Fixture_Maintenance_metrics.json new file mode 100644 index 00000000..a9caf79d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/178_Snapshot_and_CLI_Fixture_Maintenance_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/178_Snapshot_and_CLI_Fixture_Maintenance.md", + "n_spec": 11, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Maintain accurate JSON export snapshots and CLI fixtures after intentional schema or presentation updates to keep app, library, and tooling outputs in sync.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All snapshot fixtures are regenerated using ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests when schema changes require it, followed by clean test runs without regeneration notices.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI fixture expectations are audited and updated alongside snapshot refreshes to match intentional schema or formatting adjustments.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "PRD backlog and TODO sources reflect the maintenance status and reference this in-progress document.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Issue metrics emitted by tolerant parsing export paths appear in JSON snapshots and CLI assertions so downstream clients observe severity counts and depth summaries.", + "source_line": null + }, + { + "type": "invariant", + "description": "Snapshot baselines validated by JSONExportSnapshotTests guard exported structure, derived metadata, and compatibility aliases across representative fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use the regeneration environment variable before committing schema changes to capture updated baselines emitted by JSONExportSnapshotTests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "After regenerating baselines, rerun the snapshot test target without the environment variable to confirm deterministic output and avoid accidental regressions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Validate CLI regressions with existing integration tests and manually inspect fixture diffs for readability and alignment with documented schema fields.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with tolerant parsing consumers to ensure new issue fields or format summaries continue to render as documented across app and CLI surfaces.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Export updates now include issue_metrics counts; refresh CLI coverage when severity totals change.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSON Export Snapshot Tests", + "description": "Runs tests to validate exported JSON structure, metadata, and compatibility aliases against baseline snapshots.", + "source_line": null + }, + { + "name": "Snapshot Regeneration Process", + "description": "Regenerates snapshot fixtures using the ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable during schema changes.", + "source_line": null + }, + { + "name": "CLI Fixture Validation", + "description": "Validates expected formatter output for CLI regressions when schema fields or presentation change.", + "source_line": null + }, + { + "name": "Issue Metrics Export", + "description": "Includes issue severity counts and depth summaries in JSON snapshots and CLI assertions for downstream clients.", + "source_line": null + }, + { + "name": "Tolerant Parsing Integration", + "description": "Ensures new issue fields or format summaries render correctly across app and CLI surfaces.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2412, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/Summary_of_Work_metrics.json new file mode 100644 index 00000000..a836a878 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Export parse issue metrics in JSONParseTreeExporter so downstream clients can surface severity counts and deepest affected depth", + "source_line": null + }, + { + "type": "user_story", + "description": "Update CLI compatibility coverage to assert new metrics alongside refreshed Bento4-derived fixtures", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON export snapshots must be regenerated across representative fixtures to capture the issue metrics field", + "source_line": null + }, + { + "type": "invariant", + "description": "Snapshots should reflect current schema changes when ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 is set", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSONParseTreeExporter", + "description": "Exports parse issue metrics as JSON payloads exposing severity counts and deepest affected depth for downstream clients", + "source_line": null + }, + { + "name": "CLI Compatibility Coverage Test", + "description": "Asserts new metrics alongside refreshed Bento4-derived fixtures to ensure CLI compatibility", + "source_line": null + }, + { + "name": "JSON Export Snapshot Regeneration", + "description": "Regenerates JSON export snapshots across representative fixtures to capture the issue metrics field", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 765, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/next_tasks_metrics.json new file mode 100644 index 00000000..a8dd5124 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/178_Snapshot_and_CLI_Fixture_Maintenance/next_tasks.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "VoiceOver regression pass must confirm focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Real-World Assets task requires securing Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG-H fixtures before regression baselines can shift from synthetic payloads.", + "source_line": null + }, + { + "type": "invariant", + "description": "Snapshot & CLI Fixture Maintenance must export metrics alongside parse trees with refreshed JSON snapshots and maintain CLI fixture assertions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Future schema updates will use ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests to regenerate snapshots.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specs are finalized.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify that focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secure licensing approvals for Dolby Vision, AV1, VP9, Dolby AC\u20114, and MPEG\u2011H fixtures to enable regression baselines with real-world media", + "source_line": null + }, + { + "name": "Snapshot & CLI Fixture Maintenance", + "description": "Export metrics alongside parse trees in refreshed JSON snapshots and maintain CLI fixture assertions using ISOINSPECTOR_REGENERATE_SNAPSHOTS environment variable", + "source_line": null + }, + { + "name": "Tolerant Parsing Metrics UI", + "description": "Display ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specifications are finalized", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1161, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/G6_Export_JSON_Actions_metrics.json b/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/G6_Export_JSON_Actions_metrics.json new file mode 100644 index 00000000..6e4fda81 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/G6_Export_JSON_Actions_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/G6_Export_JSON_Actions.md", + "n_spec": 9, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "As an ISOInspector user, I want to export the entire parse tree or the currently selected node as JSON directly from SwiftUI controls so that I can save and share data easily.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Toolbar buttons and command menu entries for Export JSON\u2026 and Export Selection\u2026 are present and active only when their flows are valid (selection-aware for subtree export).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Invoking an export writes JSON files that match the CLI exporter output for the same scope, reusing shared encoder configuration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI tests or snapshot coverage confirm button/menu availability and verify that export completion updates user feedback (e.g., confirmation alerts or recent documents list) without regressions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility affordances exist for VoiceOver and keyboard navigation, matching the shortcuts documented in the manuals.", + "source_line": null + }, + { + "type": "invariant", + "description": "Exported file destinations must respect sandbox constraints by delegating to FilesystemAccessKit helpers already integrated with recents/session persistence.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse JSONParseTreeExporter from ISOInspectorKit and wire it through existing document session controllers for file save coordination.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Hook toolbar actions in AppShellView and outline context menu to the same export pipeline, ensuring command menu entries share the handler.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Align telemetry or logging hooks with zero-trust logging guidelines so exports are captured without leaking absolute file paths.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Export Entire Parse Tree to JSON", + "description": "Allows users to export the full parse tree of a document as a JSON file via toolbar button, menu bar entry, or context menu.", + "source_line": null + }, + { + "name": "Export Selected Node to JSON", + "description": "Enables exporting only the currently selected node (subtree) from the outline view as a JSON file through UI controls.", + "source_line": null + }, + { + "name": "Toolbar Export Commands", + "description": "Provides toolbar buttons for 'Export JSON\u2026' and 'Export Selection\u2026', enabled only when export is valid.", + "source_line": null + }, + { + "name": "Context Menu Export Commands", + "description": "Adds context menu items for exporting entire parse tree or selected node, sharing the same handler as toolbar and command menu.", + "source_line": null + }, + { + "name": "Command Menu Export Entries", + "description": "Includes menu bar entries for export actions that mirror CLI functionality and are selection\u2011aware.", + "source_line": null + }, + { + "name": "File Save Coordination", + "description": "Uses document session controllers to coordinate file save dialogs and ensure sandboxed destinations via FilesystemAccessKit.", + "source_line": null + }, + { + "name": "Shared JSON Encoder Configuration", + "description": "Reuses ISOInspectorKit's JSONParseTreeExporter encoder settings so exported files match CLI output.", + "source_line": null + }, + { + "name": "Accessibility Support", + "description": "Provides VoiceOver and keyboard navigation support for export controls, including documented shortcuts.", + "source_line": null + }, + { + "name": "Telemetry Logging for Exports", + "description": "Captures export events in logs without exposing absolute file paths, following zero\u2011trust guidelines.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2349, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bddeb403 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/Summary_of_Work_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/Summary_of_Work.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The user-facing alerts and diagnostics must always stay in sync with exporter outcomes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests for missing selections and save dialog failures are added to the SwiftUI export pipeline.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 770, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/next_tasks_metrics.json new file mode 100644 index 00000000..5a6ffbf5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/next_tasks_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/179_Summary_of_Work_2025-10-27_G6_Export_JSON_Actions/next_tasks.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "VoiceOver Regression Pass for Accessibility Shortcuts must be completed before hardware verification is scheduled.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Focus command menus on macOS and iPadOS must announce controls and restore focus targets after hardware verification.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real-World Assets cannot be used until licensing approvals are obtained.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure Dolby Vision, AV1, VP9, Dolby AC\u20114..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify that focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secure licensing approvals and fixtures for Dolby Vision, AV1, VP9, Dolby AC\u20114, and MPEG\u2011H to enable regression baselines with real-world media", + "source_line": null + }, + { + "name": "Tolerant Parsing Metrics UI in SwiftUI", + "description": "Display ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specifications are finalized", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 835, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/17_Extend_VR006_Telemetry_UI_Smoke_Tests_metrics.json b/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/17_Extend_VR006_Telemetry_UI_Smoke_Tests_metrics.json new file mode 100644 index 00000000..d2b12625 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/17_Extend_VR006_Telemetry_UI_Smoke_Tests_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/17_Extend_VR006_Telemetry_UI_Smoke_Tests.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add VR-006 research log telemetry to UI smoke tests so that automated runs surface missing or malformed research log entries for both CLI and SwiftUI consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI smoke tests execute at least one end-to-end parse scenario that writes VR-006 research log entries and emits telemetry events or assertions when entries are missing, empty, or schema-incompatible.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI telemetry hooks (e.g., log writers or diagnostics) are exercised in the same smoke suite so both surfaces emit consistent VR-006 coverage data.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test failures clearly identify whether the research log was absent, empty, or schema drifted, mirroring ResearchLogMonitor.Error.schemaMismatch messaging.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation or inline comments link the smoke test telemetry to todo.md #5 and the VR-006 monitoring checklist so future contributors maintain the instrumentation.", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLogPreviewProvider snapshots must be deterministic and reused across tests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Telemetry should be surfaced via DiagnosticsLogger, os_signpost, or explicit XCTest assertions to fail fast when VR-006 events are missing.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Smoke tests will cover both CLI (isoinspect inspect) and SwiftUI pathways by sharing a helper that inspects the persisted research log and emits telemetry counts.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogTelemetryProbe", + "description": "Translates research log audit results into telemetry diagnostics for CLI and SwiftUI smoke tests", + "source_line": null + }, + { + "name": "ResearchLogTelemetrySnapshot", + "description": "Captures a snapshot of telemetry data from research log audits", + "source_line": null + }, + { + "name": "ResearchLogTelemetrySmokeTests", + "description": "XCTest suite that runs end-to-end parse scenarios, emits telemetry events or assertions for missing/empty/schema-mismatched VR-006 research logs", + "source_line": null + }, + { + "name": "ResearchLogPreviewProvider", + "description": "Provides deterministic fixtures and audit helpers for SwiftUI previews and smoke tests", + "source_line": null + }, + { + "name": "ParsePipeline.live", + "description": "Live parsing pipeline used in smoke tests to generate VR-006 research log entries", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3794, + "line_count": 82 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/Summary_of_Work_metrics.json new file mode 100644 index 00000000..df95ed14 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add telemetry diagnostics for ResearchLogMonitor audits via CLI/SwiftUI to support VR-006 telemetry coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ResearchLogTelemetryProbe and ResearchLogTelemetrySnapshot convert ResearchLogMonitor audits into telemetry diagnostics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ResearchLogTelemetrySmokeTests exercise ParsePipeline-driven success, missing log, empty log, and schema mismatch scenarios to verify VR-006 telemetry across app and CLI entry points.", + "source_line": null + }, + { + "type": "invariant", + "description": "Telemetry backlog item #5 is marked complete and documented in project tracking artifacts.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogTelemetryProbe", + "description": "Converts ResearchLogMonitor audits into CLI/SwiftUI telemetry diagnostics for smoke coverage", + "source_line": null + }, + { + "name": "ResearchLogTelemetrySnapshot", + "description": "Captures snapshots of ResearchLogMonitor audits for telemetry diagnostics", + "source_line": null + }, + { + "name": "ResearchLogTelemetrySmokeTests", + "description": "Automated tests exercising ParsePipeline-driven success, missing log, empty log, and schema mismatch scenarios to verify VR-006 telemetry across app and CLI entry points", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 807, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/next_tasks_metrics.json new file mode 100644 index 00000000..126bca8b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/17_Extend_VR006_Telemetry_UI_Smoke_Tests/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 111, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/Summary_of_Work_metrics.json new file mode 100644 index 00000000..8636ab97 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/Summary_of_Work.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Emit parse events with severity metadata so tolerant parsing consumers receive corruption diagnostics immediately.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline.live() streams ParseIssue severity, offsets, and reason codes with every matching event.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ISOInspectorCommand.filteredEvent preserves streamed ParseIssue collections so CLI formatting retains tolerant metadata even when validation rules are filtered.", + "source_line": null + }, + { + "type": "invariant", + "description": "Regression coverage via ParsePipelineLiveTests.testLivePipelineStreamsParseIssueMetadata and ISOInspectorCommandTests.testFilteredEventPreservesParseIssueMetadata ensures correctness of the new behavior.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Proceed to T2.3 to aggregate per-severity metrics from ParseIssueStore for UI ribbons and CLI summaries once design handoff completes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline.live() event stream", + "description": "Streams parse events enriched with severity metadata, offsets, and reason codes for tolerant parsing consumers", + "source_line": null + }, + { + "name": "ISOInspectorCommand.filteredEvent formatting", + "description": "CLI command that preserves streamed ParseIssue collections, maintaining tolerant metadata even when validation rules are filtered", + "source_line": null + }, + { + "name": "ParsePipelineLiveTests.testLivePipelineStreamsParseIssueMetadata test", + "description": "Unit test ensuring live pipeline streams parse issue metadata correctly", + "source_line": null + }, + { + "name": "ISOInspectorCommandTests.testFilteredEventPreservesParseIssueMetadata test", + "description": "Unit test verifying CLI formatting retains parse issue metadata after filtering", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 957, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/T2_2_Emit_Parse_Events_metrics.json b/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/T2_2_Emit_Parse_Events_metrics.json new file mode 100644 index 00000000..6e49b468 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/T2_2_Emit_Parse_Events_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/T2_2_Emit_Parse_Events.md", + "n_spec": 8, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver enriched tolerant parsing stream events that include severity, offset, and reason code metadata so UI and CLI consumers can react to corruption diagnostics without waiting for the full parse to complete.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming parse events carry structured severity, offsets, and reason code fields aligned with ParseIssue records.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStore observes the enriched events and updates UI state without regressing strict-mode behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI streaming consumers receive the new metadata without breaking existing log formats; regression tests updated as needed.", + "source_line": null + }, + { + "type": "invariant", + "description": "Feature is guarded by existing tolerant parsing configuration options with documentation updates queued for downstream tasks.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the existing ParsePipeline event payload to embed issue metadata, leveraging the aggregation capabilities introduced in T2.1.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit ParseTreeStore Combine bindings to ensure issue metrics remain synchronized with live events; coordinate with the pending SwiftUI metrics surfacing task noted in backlog.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Validate CLI streaming output paths and JSON export hooks to keep schema compatibility, using fixture-driven tests where available.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseEventEnrichment", + "description": "Emit parse events that include severity, offset, and reason code metadata for tolerant parsing", + "source_line": null + }, + { + "name": "ParseTreeStoreSync", + "description": "Update ParseTreeStore UI state in real time based on enriched parse events without affecting strict-mode behavior", + "source_line": null + }, + { + "name": "CLIStreamingConsumerSupport", + "description": "Provide CLI consumers with streaming parse event metadata while maintaining existing log format compatibility", + "source_line": null + }, + { + "name": "EventPayloadExtension", + "description": "Extend ParsePipeline event payload to embed issue metadata leveraging aggregation store", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2442, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/next_tasks_metrics.json new file mode 100644 index 00000000..70d59930 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/next_tasks_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/180_T2_2_Emit_Parse_Events/next_tasks.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "VoiceOver must announce focus command menus and restore focus targets on macOS and iPadOS hardware verification.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure Dolby Vision, AV1, VP9, Dolby AC-4 and MPEG-H real\u2011world assets for regression baselines.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Surface ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specs are finalized.", + "source_line": null + }, + { + "type": "invariant", + "description": "Streaming parse events must propagate ParseIssue severity, offsets, and reason codes to UI/CLI consumers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify macOS and iPadOS hardware focus command menus announce controls and restore focus targets for VoiceOver accessibility shortcuts.", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secure licensing approvals and fixtures for Dolby Vision, AV1, VP9, Dolby AC\u20114, and MPEG\u2011H to enable regression baselines using real-world media assets.", + "source_line": null + }, + { + "name": "Tolerant Parsing Surface Metrics in SwiftUI", + "description": "Display ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specifications are finalized.", + "source_line": null + }, + { + "name": "Emit Parse Events with Severity Metadata", + "description": "Stream parse events that include severity, offsets, and reason codes to UI and CLI consumers.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1062, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/181_FilesystemAccess_Sendable_Closures/181_FilesystemAccess_Sendable_Closures_metrics.json b/DOCS/TASK_ARCHIVE/181_FilesystemAccess_Sendable_Closures/181_FilesystemAccess_Sendable_Closures_metrics.json new file mode 100644 index 00000000..49a8d8aa --- /dev/null +++ b/DOCS/TASK_ARCHIVE/181_FilesystemAccess_Sendable_Closures/181_FilesystemAccess_Sendable_Closures_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/181_FilesystemAccess_Sendable_Closures/181_FilesystemAccess_Sendable_Closures.md", + "n_spec": 8, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Eliminate Swift concurrency warnings triggered when FilesystemAccess captured non-Sendable bookmark helpers so the app builds cleanly under strict Sendable checking on both macOS and iOS targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build succeeds without any Swift concurrency warnings related to non\u2011Sendable function values in FilesystemAccess, its live factory, unit tests, and CLI factory when compiled with SWIFT_STRICT_CONCURRENCY enabled.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All bookmark manager method calls used by FilesystemAccess are wrapped in inline Sendable closures that immediately invoke the underlying manager.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FilesystemAccess initializers in unit tests mirror the production closure pattern for bookmark helpers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FilesystemAccessLogger receives an explicit clock closure (makeDate) from callers, avoiding capture of implicit defaults.", + "source_line": null + }, + { + "type": "invariant", + "description": "FilesystemsAccess dialog handlers must be @Sendable function typealiases.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wrap non\u2011Sendable bookmark manager methods in inline closures to satisfy Sendable contract without changing behavior.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Require callers to pass an explicit clock closure to FilesystemAccessLogger to avoid implicit default capture.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FilesystemAccess Live Factory", + "description": "Creates a FilesystemAccess instance configured for production, wrapping bookmark manager methods in Sendable closures.", + "source_line": null + }, + { + "name": "FilesystemAccess Logger", + "description": "Logs filesystem access events, requiring an explicit clock closure to avoid implicit defaults and maintain Sendable compliance.", + "source_line": null + }, + { + "name": "CLI Factory", + "description": "Provides command-line interface configuration, including a disabled singleton and integration with FilesystemAccessLogger.", + "source_line": null + }, + { + "name": "FilesystemAccess Unit Tests", + "description": "Test harnesses that initialize FilesystemAccess with Sendable closures mirroring production behavior.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2089, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/182_BoxParserRegistry_Sendable_metrics.json b/DOCS/TASK_ARCHIVE/182_BoxParserRegistry_Sendable_metrics.json new file mode 100644 index 00000000..40b96610 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/182_BoxParserRegistry_Sendable_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/182_BoxParserRegistry_Sendable.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "BoxParserRegistry", + "description": "Registers and manages parsers for data boxes, ensuring they are @Sendable compliant.", + "source_line": null + }, + { + "name": "parseChunkOffsets helper", + "description": "Utility function to parse chunk offsets in data streams, marked as @Sendable.", + "source_line": null + }, + { + "name": "DocumentSessionController", + "description": "Manages document sessions, handling concurrency and related warnings.", + "source_line": null + }, + { + "name": "CoreDataAnnotationBookmarkStore", + "description": "Stores annotation bookmarks using Core Data, with concurrency considerations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1394, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/Summary_of_Work_metrics.json new file mode 100644 index 00000000..afcfddd8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/Summary_of_Work.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "Validation rules VR-001\u2026VR-015 must generate ParseIssue diagnostics when tolerant parsing is enabled while preserving strict-mode behavior.", + "source_line": null + }, + { + "type": "user_story", + "description": "Convert validation diagnostics into ParseIssue records inside ParsePipeline and surface them on streamed events.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipelineLiveTests must cover tolerant mode behavior, ensuring parse issues and the shared issue store capture VR-003 warnings alongside existing structural diagnostics.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline Live Mode Validation Diagnostics", + "description": "Generates ParseIssue diagnostics for validation rules VR-001\u2026VR-015 when tolerant parsing is enabled while preserving strict-mode behavior.", + "source_line": null + }, + { + "name": "ParseIssue Store Recording", + "description": "Records ParseIssue diagnostics in ParseIssueStore and surfaces them on streamed events.", + "source_line": null + }, + { + "name": "ParsePipelineLiveTests Tolerant Mode Coverage", + "description": "Unit tests covering tolerant mode behavior, ensuring parse issues and shared issue store capture VR-003 warnings alongside structural diagnostics.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1167, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/T2_4_Validation_Rule_Dual_Mode_Support_metrics.json b/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/T2_4_Validation_Rule_Dual_Mode_Support_metrics.json new file mode 100644 index 00000000..db4e5fae --- /dev/null +++ b/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/T2_4_Validation_Rule_Dual_Mode_Support_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/T2_4_Validation_Rule_Dual_Mode_Support.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Enable validation rules VR-001 through VR-015 to emit ParseIssue diagnostics when tolerant parsing is enabled while maintaining strict-mode exception behavior for regression parity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict mode continues to throw existing validation errors, while tolerant mode records equivalent ParseIssue entries without halting traversal.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and integration tests demonstrate both behaviors across the full rule suite, ensuring downstream UI, CLI, and export flows receive issues through the shared store.", + "source_line": null + }, + { + "type": "invariant", + "description": "ValidationContext.handleIssue(_:) must centralize tolerance-mode branching so that each rule respects tolerance options and records issues via the shared store.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a shared ValidationContext.handleIssue(_:) helper to centralize tolerance-mode branching, updating each VR-001\u2026VR-015 implementation to call it before throwing or recording issues.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore", + "description": "Central repository for recording validation diagnostics in tolerant mode", + "source_line": null + }, + { + "name": "ValidationContext.handleIssue(_:)", + "description": "Helper method to branch between strict and tolerant behavior when a rule encounters an issue", + "source_line": null + }, + { + "name": "VR-001 through VR-015 rules", + "description": "Individual validation rules that emit ParseIssue diagnostics or throw errors based on parsing mode", + "source_line": null + }, + { + "name": "Unit and integration tests for dual-mode behavior", + "description": "Test suites verifying both strict exception throwing and tolerant issue recording across all rules", + "source_line": null + }, + { + "name": "Shared metrics alignment", + "description": "Mechanism ensuring emitted issues carry severity codes compatible with ParseIssueStore.metrics()", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3034, + "line_count": 33 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/next_tasks_metrics.json new file mode 100644 index 00000000..5ea7ec17 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/183_T2_4_Validation_Rule_Dual_Mode_Support/next_tasks.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Validation rules VR-001\u2026VR-015 must emit ParseIssue records when tolerant parsing is enabled while preserving strict-mode behavior.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend ParseIssueStore aggregation to expose per-severity counts for tolerant parsing dashboards and streaming summaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline converts validation diagnostics into issues, records them in ParseIssueStore, and existing tests cover the new tolerant flow.", + "source_line": null + }, + { + "type": "invariant", + "description": "VoiceOver regression pass must confirm focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures so regression baselines can shift from synthetic payloads once approvals land.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Surface ParseIssueStore metrics in SwiftUI ribbons once tolerant parsing UI specs are finalized.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore", + "description": "Stores and aggregates ParseIssue records emitted by validation rules during tolerant parsing", + "source_line": null + }, + { + "name": "ParsePipeline", + "description": "Converts validation diagnostics into ParseIssue records and records them in ParseIssueStore", + "source_line": null + }, + { + "name": "Tolerant Parsing UI Ribbons", + "description": "SwiftUI components that display per-severity ParseIssue metrics for tolerant parsing dashboards and streaming summaries", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Shortcuts Verification", + "description": "Hardware verification process to ensure VoiceOver focus command menus announce controls and restore focus targets on macOS and iPadOS devices", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1661, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/Summary_of_Work_metrics.json new file mode 100644 index 00000000..dd9ebfef --- /dev/null +++ b/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/Summary_of_Work_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/Summary_of_Work.md", + "n_spec": 6, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "ParseIssueStore must provide metricsSnapshot() and makeIssueSummary() to allow SwiftUI ribbons and CLI flows to fetch per-severity counts, totals, and deepest affected depth without recomputing the store.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a user of the SwiftUI UI or CLI ribbon, I want to see aggregated parse issue metrics so that I can quickly assess severity distribution and overall health.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The system must expose metricsSnapshot() and makeIssueSummary() APIs in ParseIssueStore; these APIs should return per-severity counts, total counts, and deepest affected depth. The UI and CLI ribbons must be able to consume these values without recomputing the store.", + "source_line": null + }, + { + "type": "invariant", + "description": "Documentation for tolerant parsing must reference the new aggregation APIs (DOCS/AI/Tolerance_Parsing/TODO.md, IntegrationSummary.md).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssueStoreTests must cover severity dictionaries, background snapshots, and summary DTOs to validate correct behavior.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The ParseIssueStore will be extended with metricsSnapshot() and makeIssueSummary() methods; these are added as part of the store's public API for aggregation purposes.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 858, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons_metrics.json b/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons_metrics.json new file mode 100644 index 00000000..64cede6b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide shared tolerant parsing analytics that expose per-severity issue counts, deepest affected hierarchy depth, and streaming-ready snapshots so SwiftUI ribbons and CLI summaries can surface corruption health at a glance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssueStore (and any related fa\u00e7ade) exposes computed properties returning counts grouped by severity and flags the deepest node depth affected during the current parse session.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Metrics update incrementally during streaming parses so UI ribbons can reflect live progress without recomputing the entire store.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI consumers can request a lightweight summary struct or DTO to print aggregated counts once parsing completes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit or integration coverage documents the aggregation math, including edge cases with zero issues, mixed severities, and deeply nested corruption.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in todo.md and tolerance parsing guides points to these aggregation APIs for downstream UI/CLI wiring.", + "source_line": null + }, + { + "type": "invariant", + "description": "Aggregation APIs must be concurrency\u2011safe for the existing streaming pipeline (Combine publishers driving ParseTreeStore).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseIssueStore (or companion types) with cached aggregations keyed by severity enum and track maximum depth as issues register.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide SwiftUI-friendly bindings (e.g., ParseMetrics\u00a0\u2026\u00a0..\u00a0...", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore.metricsSnapshot", + "description": "Returns a snapshot of issue counts grouped by severity, total count, and deepest affected depth for the current parse session.", + "source_line": null + }, + { + "name": "ParseIssueStore.IssueSummary DTO", + "description": "Lightweight data transfer object containing aggregated counts and depth information for CLI consumption.", + "source_line": null + }, + { + "name": "Incremental aggregation during streaming parses", + "description": "Updates metrics incrementally as new issues are parsed so UI ribbons can reflect live progress without full recomputation.", + "source_line": null + }, + { + "name": "Concurrency-safe aggregation APIs", + "description": "Ensures thread\u2011safe access to metrics while Combine publishers drive the parsing pipeline.", + "source_line": null + }, + { + "name": "SwiftUI-friendly bindings (ParseIssueMetrics struct)", + "description": "Provides a struct that SwiftUI ribbons can bind to for real\u2011time display of issue severity counts and depth.", + "source_line": null + }, + { + "name": "CLI summary formatting interface", + "description": "Exposes formatting\u2011ready data for CLI consumers to print aggregated counts after parsing completes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3107, + "line_count": 32 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/next_tasks_metrics.json new file mode 100644 index 00000000..c3acbd5a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/next_tasks_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/184_T2_3_Aggregate_Parse_Issue_Metrics_for_UI_and_CLI_Ribbons/next_tasks.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Aggregate per-severity ParseIssueStore metrics for UI and CLI ribbons to support tolerant parsing dashboards and streaming summaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssueStore aggregation must expose per-severity counts for tolerant parsing dashboards and streaming summaries.", + "source_line": null + }, + { + "type": "invariant", + "description": "Design deliverables in DOCS/AI/ISOInspector_Execution_Guide/04_TODO_Workplan.md must confirm ribbon layout requirements before downstream UI wiring proceeds.", + "source_line": null + }, + { + "type": "user_story", + "description": "VoiceOver regression pass for accessibility shortcuts on macOS and iPadOS hardware to ensure focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hardware verification on macOS and iPadOS must confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "VoiceOver regression pass is blocked until required hardware is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure Dolby Vision, AV1 etc. real\u2011world asset fixtures to shift regression baselines from synthetic payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision\u2026\u00a0?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssueStore Aggregation API", + "description": "Provides per-severity issue counts for tolerant parsing dashboards and streaming summaries", + "source_line": null + }, + { + "name": "UI Ribbon Integration for Parse Issue Metrics", + "description": "Exposes parsed issue metrics in SwiftUI ribbons according to design specifications", + "source_line": null + }, + { + "name": "CLI Ribbon Integration for Parse Issue Metrics", + "description": "Displays parsed issue metrics in command-line interface ribbons", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Verification Workflow", + "description": "Hardware verification process ensuring focus commands announce controls and restore focus targets on macOS and iPadOS", + "source_line": null + }, + { + "name": "Real-World Asset Licensing Management", + "description": "Process to secure licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures for regression baselines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1263, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/Summary_of_Work_metrics.json new file mode 100644 index 00000000..79f4c971 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a visual warning ribbon in the SwiftUI interface that alerts users to tolerant parsing issues detected by ParseTreeStore.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The CorruptionWarningRibbon component must display persisted dismissal state and accessible copy, and it should be layered above the navigation split view in AppShellView.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ribbon should animate its presentation and reset the dismissal flag when no issues remain.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStore must publish tolerant parsing metrics and reset them with document lifecycle events so that SwiftUI overlays can react without polling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocumentSessionController.focusIntegrityDiagnostics() should hook into the ribbon to provide diagnostics information.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system always re\u2011value\u00a0?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Warning Ribbon", + "description": "Displays a warning ribbon overlay when tolerant parsing detects issues, persisting dismissal state and integrating with document lifecycle events", + "source_line": null + }, + { + "name": "CorruptionWarningRibbon component", + "description": "UI component that shows corruption warnings, supports persisted dismissal, accessible copy, and hooks into focus integrity diagnostics", + "source_line": null + }, + { + "name": "AppShellView layering of ribbon", + "description": "Layers the warning ribbon above navigation split view, animates presentation, resets dismissal flag when no issues remain", + "source_line": null + }, + { + "name": "ParseTreeStore metrics publishing", + "description": "Publishes tolerant parsing metrics from ParseTreeStore for external observers", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 917, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/T3_1_Tolerant_Parsing_Warning_Ribbon_metrics.json b/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/T3_1_Tolerant_Parsing_Warning_Ribbon_metrics.json new file mode 100644 index 00000000..8256f29e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/T3_1_Tolerant_Parsing_Warning_Ribbon_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/T3_1_Tolerant_Parsing_Warning_Ribbon.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a non-modal corruption warning ribbon in the SwiftUI app shell that displays tolerant parsing issue metrics immediately after a parse completes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ribbon is displayed whenever ParseIssueStore.metricsSnapshot().totalCount > 0, summarizing error and warning counts plus deepest affected depth.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tapping the ribbon focuses the forthcoming \"Integrity\" tab or equivalent diagnostics destination.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver announces the ribbon with severity and action affordances, matching accessibility notes in the tolerance parsing PRD.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing document loading and layout flows remain regression-free (no overlap with navigation bars, supports light/dark mode).", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseTreeStore publishes ribbon-ready metrics via @Published var issueMetrics: IssueMetrics so the view updates live during streaming parses.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a dedicated SwiftUI component (e.g., CorruptionWarningRibbon) that accepts IssueMetrics snapshots supplied by ParseTreeStore.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide dismissal persistence using UserDefaults/AppStorage as outlined in integration summary to respect user preference.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CorruptionWarningRibbon", + "description": "Non\u2011modal SwiftUI component that displays a warning ribbon when parsing issues are detected", + "source_line": null + }, + { + "name": "ParseTreeStore.issueMetrics Publisher", + "description": "Publishes IssueMetrics snapshots to drive the ribbon\u2019s visibility and content", + "source_line": null + }, + { + "name": "UserDefaults/AppStorage dismissal persistence", + "description": "Stores user preference to hide the ribbon after acknowledgement", + "source_line": null + }, + { + "name": "Ribbon tap action", + "description": "Navigates focus to the Integrity tab or diagnostics destination when the ribbon is tapped", + "source_line": null + }, + { + "name": "VoiceOver announcement", + "description": "Announces the ribbon with severity and action affordances for accessibility", + "source_line": null + }, + { + "name": "UI styling integration", + "description": "Applies color tokens, iconography, and text consistent with UI guidelines", + "source_line": null + }, + { + "name": "SwiftUI previews for mocked metrics", + "description": "Provides design review previews of the ribbon with sample IssueMetrics", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2679, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/next_tasks_metrics.json new file mode 100644 index 00000000..d6af9be3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/185_T3_1_Tolerant_Parsing_Warning_Ribbon/next_tasks.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Connect DocumentSessionController.focusIntegrityDiagnostics() to the forthcoming Integrity tab once UI scaffolding lands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Integrity tab navigation wiring must be connected to DocumentSessionController.focusIntegrityDiagnostics() after UI scaffolding is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add targeted snapshot/UI tests that exercise ribbon dismissal persistence and Integrity hand-off when additional tooling is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot/UI tests must cover ribbon dismissal persistence and Integrity hand-off with new tooling.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Tab Navigation Wiring", + "description": "Connects DocumentSessionController.focusIntegrityDiagnostics() to the Integrity tab for navigation", + "source_line": null + }, + { + "name": "Snapshot & UI Automation Expansion", + "description": "Adds targeted snapshot and UI tests covering ribbon dismissal persistence and integrity hand-off functionality", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 432, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b960e446 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a tolerant parsing warning ribbon that informs users of parsing issues and allows them to dismiss it.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Bind ParseTreeStore to the tolerant parsing issue metrics stream and reset counters during lifecycle events.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add CorruptionWarningRibbon SwiftUI component with persisted dismissal state and accessibility copy.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update AppShellView and DocumentSessionController to present the ribbon, animate transitions, and focus first affected node when tapped.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ribbon must present in the app shell view and show the warning message.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The user should only..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Warning Ribbon", + "description": "A SwiftUI component that displays a warning ribbon when tolerant parsing issues are detected, persists dismissal state, and provides accessibility copy.", + "source_line": null + }, + { + "name": "ParseTreeStore Integration", + "description": "Binds ParseTreeStore to the tolerant parsing issue metrics stream and resets counters during lifecycle events.", + "source_line": null + }, + { + "name": "AppShellView Update", + "description": "Updates AppShellView to present the warning ribbon, animate transitions, and focus the first affected node when tapped.", + "source_line": null + }, + { + "name": "DocumentSessionController Update", + "description": "Adds functionality to DocumentSessionController to handle presentation of the warning ribbon, navigation to first affected node, and integration with integrity diagnostics.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 831, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/next_tasks_metrics.json new file mode 100644 index 00000000..20dea612 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/next_tasks_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/186_Summary_of_Work_2025-10-25/next_tasks.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "VoiceOver regression tests must pass for accessibility shortcuts on macOS and iPadOS devices.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule hardware verification to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hardware verification confirms that focus command menus announce controls and restore focus. The reference DOCS/TASK_ARCHIVE/156_G8_VoiceOver...", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify that VoiceOver focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + }, + { + "name": "Real-World Assets Licensing and Integration", + "description": "Secure licensing approvals and integrate Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads in regression baselines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 554, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b8f6dfee --- /dev/null +++ b/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/Summary_of_Work.md", + "n_spec": 3, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "ParseIssue data must be propagated into ParseTreeStore snapshots so that outline rows receive per-node corruption context.", + "source_line": null + }, + { + "type": "user_story", + "description": "Render accessible badges with tooltip and VoiceOver support for corruption summaries in the parse tree outline view.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline filters and accessibility helpers must factor in tolerant parsing issues while keeping previews representative.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseIssue Data Propagation", + "description": "Propagates ParseIssue data into ParseTreeStore snapshots so outline rows receive per-node corruption context.", + "source_line": null + }, + { + "name": "Corruption Summary Model in Outline Row", + "description": "Extends ParseTreeOutlineRow with a CorruptionSummary model and renders accessible badges with tooltip and VoiceOver support.", + "source_line": null + }, + { + "name": "Updated SwiftUI List Rendering", + "description": "Updates the SwiftUI list to render accessible badges for corruption nodes.", + "source_line": null + }, + { + "name": "Outline Filters Updated for Tolerant Parsing", + "description": "Modifies outline filters and accessibility helpers to factor in tolerant parsing issues while keeping previews representative.", + "source_line": null + }, + { + "name": "Accessibility Support Enhancements", + "description": "Adds VoiceOver support and tooltip for badges.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1127, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/T3_2_Corruption_Badges_for_Tree_View_metrics.json b/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/T3_2_Corruption_Badges_for_Tree_View_metrics.json new file mode 100644 index 00000000..2f731331 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/T3_2_Corruption_Badges_for_Tree_View_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/T3_2_Corruption_Badges_for_Tree_View.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Highlight corrupt or degraded structures directly inside the outline tree so operators can triage tolerant parsing results without leaving their navigation workflow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Every TreeNodeView entry with one or more ParseIssue records renders a corruption badge with severity color consistent with the warning ribbon palette.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver announces the badge state (e.g., \"Corrupted, 2 issues\") and the badge is keyboard focusable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hover tooltips (macOS) and secondary detail affordances (iPadOS) show a short issue summary sourced from ParseIssueStore.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit/UI preview coverage demonstrates badges for at least error, warning, and info severities without regressing healthy nodes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Severity styling must remain consistent with tolerant parsing ribbon color tokens.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse ParseIssueStore.metricsSnapshot() and extend the outline item view model to expose aggregated issue counts so SwiftUI views stay declarative.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "TreeNodeView Corruption Badge Rendering", + "description": "Displays a corruption badge on each TreeNodeView that has one or more ParseIssue records, styled with severity color from the warning ribbon palette.", + "source_line": null + }, + { + "name": "Accessibility VoiceOver Support for Badges", + "description": "VoiceOver announces the badge state (e.g., \"Corrupted, 2 issues\") and makes the badge keyboard focusable.", + "source_line": null + }, + { + "name": "Hover Tooltip / Secondary Detail Summary", + "description": "Shows a short issue summary on macOS hover tooltips or iPadOS secondary detail affordances sourced from ParseIssueStore.", + "source_line": null + }, + { + "name": "Outline Item View Model Aggregation", + "description": "Extends the outline item view model to expose aggregated issue counts for declarative SwiftUI views.", + "source_line": null + }, + { + "name": "Badge Layout Coordination", + "description": "Coordinates badge layout with existing selection, disclosure, and icon affordances to avoid clipping on compact width (iPad split view).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2311, + "line_count": 36 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/next_tasks_metrics.json new file mode 100644 index 00000000..52a6e8c4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/next_tasks_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/next_tasks.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Surface tolerant parsing issue badges in the outline so operators can immediately spot corrupt structures.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always display corruption badges for tree view nodes when a tolerant parsing issue is detected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Badges appear correctly in the outline and are visible to operators.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implementation notes are documented in DOCS/TASK_ARCHIVE/187_T3_2_Corruption_Badges_for_Tree_View_Nodes/Summary_of_Work.md.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Corruption Badges for Tree View Nodes", + "description": "Displays surface\u2011tolerant parsing issue badges in the outline view to allow operators to spot corrupt structures immediately.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verifies that focus command menus announce controls and restore focus targets on macOS and iPadOS hardware, ensuring VoiceOver accessibility shortcuts work correctly.", + "source_line": null + }, + { + "name": "Real\u2011World Asset Licensing and Integration", + "description": "Secures licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures to replace synthetic payloads in regression baselines with real-world assets.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 849, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/Summary_of_Work_metrics.json new file mode 100644 index 00000000..8347c16c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/Summary_of_Work_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/Summary_of_Work.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add a dedicated Corruption section to the SwiftUI detail inspector that displays tolerant parsing issues with severity iconography, copy-friendly metadata, and VoiceOver-ready labels.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement ParseTreeDetailViewModel.focusIssue(on:) to jump the hex viewer to corruption ranges and update hex slice windowing to center on requested offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Corruption section must display severity iconography, copy-friendly metadata, and VoiceOver-ready labels for tolerant parsing issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hex viewer navigation via focusIssue(on:) must correctly jump to corruption ranges and center the hex slice window on requested offsets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility summaries must report corruption counts.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always maintain a consistent state when accessing or updating the Corruption section.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with T3.4 placeholder nodes to allow future linkages between the user\u2011tolerant parsing error\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Corruption Section in SwiftUI Detail Inspector", + "description": "Displays corruption information with severity icons, copy-friendly metadata, and VoiceOver-ready labels when tolerant parsing issues occur.", + "source_line": null + }, + { + "name": "ParseTreeDetailViewModel.focusIssue(on:) Method", + "description": "Jumps the hex viewer to specified corruption ranges and centers the view on requested offsets.", + "source_line": null + }, + { + "name": "Hex Viewer Slice Windowing", + "description": "Adjusts the hex slice window size and centers it around requested offsets for navigation.", + "source_line": null + }, + { + "name": "Accessibility Summaries for Corruption Counts", + "description": "Provides accessibility summaries that report the number of corruption instances in the inspector.", + "source_line": null + }, + { + "name": "Hex Navigation Workflow", + "description": "Workflow enabling users to navigate through hex data, including jumping to specific corruption ranges.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 910, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/T3_3_Integrity_Detail_Pane_metrics.json b/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/T3_3_Integrity_Detail_Pane_metrics.json new file mode 100644 index 00000000..6c81b1b3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/T3_3_Integrity_Detail_Pane_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/T3_3_Integrity_Detail_Pane.md", + "n_spec": 7, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add a dedicated \"Corruption\" section to the inspector detail pane so investigators can review tolerant parsing diagnostics for the selected node without leaving the primary workflow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting a node with ParseIssue entries reveals a \"Corruption\" section summarizing each issue (severity icon, error code, message, byte range).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Byte offsets, lengths, and reason codes are copyable via standard text selection or explicit copy actions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Issue rows expose affordances to jump to the associated hex range or open follow-up actions when available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver announces the section heading and each issue row with severity context and actionable hints, matching accessibility guidance from prior tolerant parsing tasks.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a dedicated CorruptionIssueSection component used by DetailView when node issues non\u2011empty.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse CorruptionIssueRow presentation patterns established in the badge work, ensuring severity color tokens and iconography\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Corruption Section in Inspector Detail Pane", + "description": "Displays a list of parsing issues for the selected node, including severity icon, error code, message, and byte range.", + "source_line": null + }, + { + "name": "Copyable Byte Offsets and Lengths", + "description": "Allows users to copy byte offsets, lengths, and reason codes via text selection or explicit copy actions.", + "source_line": null + }, + { + "name": "Jump to Hex Range Action", + "description": "Provides a button or link in each issue row that navigates the user to the corresponding hex range using the existing hex jump mechanism.", + "source_line": null + }, + { + "name": "Follow-up Actions for Issues", + "description": "Exposes additional actions when available for a given parsing issue, such as opening related workflows.", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Support", + "description": "Announces section heading and each issue row with severity context and actionable hints to aid screen reader users.", + "source_line": null + }, + { + "name": "CorruptionIssueSection Component", + "description": "A reusable SwiftUI view that renders the corruption issues list within DetailView when node.issues is not empty.", + "source_line": null + }, + { + "name": "CorruptionIssueRow Presentation", + "description": "Reuses existing badge patterns for severity color tokens and iconography in each issue row.", + "source_line": null + }, + { + "name": "Integration with DocumentVM/NodeVM Hex Jump", + "description": "Wires callbacks so tapping \"View in Hex\" forwards to the hex jump mechanism without breaking strict mode behavior.", + "source_line": null + }, + { + "name": "Selectable Text Views on macOS/iPadOS", + "description": "Ensures Text views are selectable/copyable and provide context menu actions for copy functionality.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2644, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/next_tasks_metrics.json new file mode 100644 index 00000000..d90eff9e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/188_T3_3_Integrity_Detail_Pane/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Coordinate with T3.4 placeholder node work so corruption diagnostics can link into placeholder actions when expected children are missing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Expand tolerant parsing fixtures with deep-offset corruption cases to validate the adaptive hex window logic introduced for issue jumps.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Coordinate Placeholder Node Work", + "description": "Integrate corruption diagnostics with placeholder actions for missing expected children", + "source_line": null + }, + { + "name": "Expand Tolerant Parsing Fixtures", + "description": "Add deep-offset corruption cases to test adaptive hex window logic for issue jumps", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 304, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/Summary_of_Work_metrics.json new file mode 100644 index 00000000..abf42afe --- /dev/null +++ b/DOCS/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/Summary_of_Work.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The corruption diagnostics section must be added to the detail inspector.", + "source_line": null + }, + { + "type": "invariant", + "description": "Adaptive hex navigation must correctly handle issue ranges.", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility updates must be applied to the detail inspector.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track T3.4 placeholder node integration so that corruption diagnostics can link into placeholder affordances.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Expand tolerant parsing fixtures with deeper corruption offsets to stress test the new hex window logic.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 572, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/next_tasks_metrics.json new file mode 100644 index 00000000..3d7d9fea --- /dev/null +++ b/DOCS/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/189_Summary_of_Work_2025-10-25_Integrity_Follow_Ups/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement placeholder nodes for missing children to guide operators toward absent structures and maintain contextual hex jumps.", + "source_line": null + }, + { + "type": "user_story", + "description": "Perform VoiceOver regression pass for accessibility shortcuts on macOS and iPadOS hardware to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure real\u2011world media assets (Dolby Vision, AV1, VP9, Dolby AC-4, MPEG\u2011H) for regression baselines once licensing approvals are obtained.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Placeholder Nodes for Missing Children", + "description": "Provide placeholder affordances to guide operators toward absent structures and maintain contextual hex jumps during tolerant parsing.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify macOS and iPadOS hardware focus command menus announce controls and restore focus targets for VoiceOver accessibility shortcuts.", + "source_line": null + }, + { + "name": "Real-World Assets Licensing", + "description": "Secure licensing for Dolby Vision, AV1, VP9, Dolby AC\u20114, and MPEG\u2011H fixtures to enable regression baselines with real-world media payloads.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 816, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/18_C1_Combine_Bridge_and_State_Stores_metrics.json b/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/18_C1_Combine_Bridge_and_State_Stores_metrics.json new file mode 100644 index 00000000..d59a240f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/18_C1_Combine_Bridge_and_State_Stores_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/18_C1_Combine_Bridge_and_State_Stores.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish Combine-powered state stores that subscribe to the streaming parse pipeline so SwiftUI surfaces (tree, detail, hex) receive timely updates without data races.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provide a Combine publisher (or publisher-adapter) that emits ParseEvent updates from the core async stream and backs SwiftUI-facing state stores.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Maintain thread-safe state transitions so snapshot updates occur deterministically and without race conditions while parsing large files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Supply focused unit and/or integration coverage demonstrating that representative parse fixtures update the stores and propagate validation metadata for UI consumption.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce dedicated store types (e.g., tree/detail/hex) that collect events, maintain derived state, and expose observable properties for SwiftUI. Ensure they are @MainActor or otherwise synchronized for view updates.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing core models (ParseEvent, BoxDescriptor, validation issues) and ensure the stores can map catalog-backed metadata and research flags into UI-friendly structures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider cancellation, replay, and completion semantics so the UI can reset or switch files without leaking tasks. Capture any future hooks required by subsequent UI tasks (tree rendering, detail pane) in TODOs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseEvent Publisher", + "description": "Combine publisher that emits ParseEvent updates from the core async stream to UI subscribers", + "source_line": null + }, + { + "name": "TreeStateStore", + "description": "@MainActor store collecting parse events and maintaining derived state for tree view", + "source_line": null + }, + { + "name": "DetailStateStore", + "description": "@MainActor store collecting parse events and maintaining derived state for detail pane", + "source_line": null + }, + { + "name": "HexStateStore", + "description": "@MainActor store collecting parse events and maintaining derived state for hex view", + "source_line": null + }, + { + "name": "Publisher Adapter", + "description": "Adapter that bridges async stream to Combine publisher with cancellation, replay, completion semantics", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2597, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/Summary_of_Work_metrics.json new file mode 100644 index 00000000..502cc4e5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/Summary_of_Work.md", + "n_spec": 7, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a Combine-backed bridge that fan\u2011outs ParseEvent streams to multiple subscribers and provide a @MainActor parse tree store aggregating validation issues for SwiftUI consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ParsePipelineEventBridge must convert AsyncThrowingStream pipelines into shareable Combine publishers with deterministic cancellation semantics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStore must maintain hierarchical box trees and accumulated validation issues while staying main\u2011actor isolated for SwiftUI updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests in ParseTreeStoreTests must cover bridge fan\u2011out, tree aggregation, and failure propagation.", + "source_line": null + }, + { + "type": "invariant", + "description": "The Combine-backed bridge must always provide deterministic cancellation semantics for subscribers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a Combine-backed bridge (ParsePipelineEventBridge) to convert AsyncThrowingStream pipelines into shareable publishers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Store parse tree and validation issues in a @MainActor isolated ParseTreeStore for SwiftUI updates.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipelineEventBridge", + "description": "Converts AsyncThrowingStream pipelines into shareable Combine publishers with deterministic cancellation semantics and fan\u2011outs ParseEvent streams to multiple subscribers.", + "source_line": null + }, + { + "name": "ParseTreeStore", + "description": "MainActor isolated store that aggregates hierarchical parse tree snapshots and accumulated validation issues for SwiftUI consumers.", + "source_line": null + }, + { + "name": "Snapshot Models for ParseTreeStore", + "description": "Data structures representing hierarchical box trees and validation issue collections used by ParseTreeStore.", + "source_line": null + }, + { + "name": "SwiftUI Bridge Integration", + "description": "Exposes the Combine-backed bridge to SwiftUI components, enabling real\u2011time updates of parse tree data and validation issues.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1514, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/next_tasks_metrics.json new file mode 100644 index 00000000..0db1c5ca --- /dev/null +++ b/DOCS/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/18_C1_Combine_Bridge_and_State_Stores/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Kick off C2 \u2013 Tree view rendering using the new ParseTreeStore snapshots (outline UI, search, filters).", + "source_line": null + }, + { + "type": "user_story", + "description": "Draft C3 detail/hex stores that subscribe to the Combine bridge for payload slices and metadata panels.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tree View Rendering", + "description": "Render a tree view UI using ParseTreeStore snapshots, including outline display, search functionality, and filters.", + "source_line": null + }, + { + "name": "Detail/Hex Stores Subscription", + "description": "Create detail and hex data stores that subscribe to the Combine bridge for payload slices and provide metadata panels.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 246, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Phase3.2_SurfaceStyleKey_metrics.json b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Phase3.2_SurfaceStyleKey_metrics.json new file mode 100644 index 00000000..e6ab9f23 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Phase3.2_SurfaceStyleKey_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Phase3.2_SurfaceStyleKey.md", + "n_spec": 10, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a SwiftUI EnvironmentKey for Material backgrounds to enable environment-based surface styling throughout the FoundationUI component hierarchy.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests written and passing", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SurfaceStyleKey EnvironmentKey implemented", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "EnvironmentValues extension created", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Default value set to .regular", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "View extension for environment modifier", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI Preview included", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocC documentation complete", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero magic numbers (use Material enum values)", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Platform support verified (iOS/macOS/iPadOS)", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SurfaceStyleKey EnvironmentKey", + "description": "Provides a SwiftUI environment key for Material background styling with default .regular value.", + "source_line": null + }, + { + "name": "EnvironmentValues.surfaceStyle property", + "description": "Extension to access and modify the surfaceStyle environment value.", + "source_line": null + }, + { + "name": "View.surfaceStyle(_:) modifier", + "description": "Convenience view modifier that sets the surfaceStyle environment value for a view and its children.", + "source_line": null + }, + { + "name": "Unit tests for SurfaceStyleKey", + "description": "Tests verifying default value, environment read/write, and support for all Material variants.", + "source_line": null + }, + { + "name": "SwiftUI Previews for SurfaceStyleKey", + "description": "Previews demonstrating hierarchy propagation, environment reading, and dark mode behavior.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9683, + "line_count": 344 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d31f28c6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add placeholder synthesis to parse tree builders so missing required children surface as .corrupt synthetic nodes with structure.missing_child issues that anchor into the parent byte range.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Placeholder nodes are recorded via ParseIssueStore and ribbon metrics and Integrity views remain consistent across tolerant parses.", + "source_line": null + }, + { + "type": "invariant", + "description": "Full swift test suite passes on Linux.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend regression coverage with ParseExportTests.testParseTreeBuilderSynthesizesPlaceholderForMissingRequiredChild and ParseTreeStoreTests.testPlaceholderNodesRecordedForMissingRequiredChildren.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Placeholder Node Synthesis for Missing Children", + "description": "Adds synthetic .corrupt nodes to parse trees when required children are missing, such as stbl under minf or tfhd under traf.", + "source_line": null + }, + { + "name": "Parse Issue Recording via ParseIssueStore", + "description": "Records placeholder issues in the app store pipeline, maintaining ribbon metrics and Integrity views during tolerant parses.", + "source_line": null + }, + { + "name": "Regression Tests for Placeholder Nodes", + "description": "Includes tests that verify placeholder synthesis and recording, ensuring full test suite passes on Linux.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 942, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_4_Placeholder_Nodes_for_Missing_Children_metrics.json b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_4_Placeholder_Nodes_for_Missing_Children_metrics.json new file mode 100644 index 00000000..ba3b5545 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_4_Placeholder_Nodes_for_Missing_Children_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_4_Placeholder_Nodes_for_Missing_Children.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide synthetic placeholder nodes for missing required children in the parse tree so that operators can see expected-but-absent structures and navigate to relevant hex ranges.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Missing required children such as stbl under minf or tfhd under traf must generate a ParseTreeNode with status .corrupt, attached ParseIssue metadata, and contextual copy in the detail pane.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The tree outline must render placeholders with italic fourcc, muted row styling, and corruption badges matching T3.2 behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting a placeholder must surface guidance in the Integrity detail section and provide a jump action into the hex viewer anchored to the parent range.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests must include fixtures with removed required children and assert placeholder creation, issue propagation, and navigation hooks.", + "source_line": null + }, + { + "type": "invariant", + "description": "Placeholder nodes should be created without disrupting stream traversal or other parsing logic.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing missing-child detection from validation (VR-001\u2026VR-015) and tolerant parsing guardrails to synthesize ParseTreeNode instances.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseIssueStore or related aggregation to register placeholder issues so that ribbon counts and Integrity panes remain accurate.", + "source_line": null + }, + { + "type": "invariant", + "description": "Placeholder styling, severity badges, and copy blocks must remain consistent with contextual status labeling workstream (T3.5).", + "source_line": null + }, + { + "type": "user_story", + "description": "Ensure accessibility: VoiceOver announces the placeholder status and suggested remediation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Placeholder Node Creation", + "description": "Generate synthetic ParseTreeNode entries for missing required children during tolerant parsing", + "source_line": null + }, + { + "name": "Status Metadata Attachment", + "description": "Assign status .corrupt and attach ParseIssue metadata to placeholder nodes", + "source_line": null + }, + { + "name": "Detail Pane Contextual Copy", + "description": "Display contextual guidance and copy in the Integrity detail pane when a placeholder is selected", + "source_line": null + }, + { + "name": "Outline Rendering of Placeholders", + "description": "Render placeholders with italic fourcc, muted row styling, and corruption badges in the tree outline", + "source_line": null + }, + { + "name": "Hex Viewer Jump Action", + "description": "Provide jump-to-hex functionality anchored to the parent range for selected placeholders", + "source_line": null + }, + { + "name": "Issue Registration in ParseIssueStore", + "description": "Register placeholder issues so ribbon counts and Integrity panes remain accurate", + "source_line": null + }, + { + "name": "Accessibility Announcements", + "description": "VoiceOver announces placeholder status and suggested remediation, including keyboard shortcut guidance", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3185, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_5_Contextual_Status_Labels_metrics.json b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_5_Contextual_Status_Labels_metrics.json new file mode 100644 index 00000000..ef6b4da9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_5_Contextual_Status_Labels_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/T3_5_Contextual_Status_Labels.md", + "n_spec": 7, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver contextual status chips in the outline and detail inspector so operators immediately understand whether a node is invalid, empty, corrupted, partial, or trimmed when tolerant parsing surfaces issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline rows render status labels with severity-aware colors and accessible text for nodes flagged as invalid, empty, corrupted, partial, or trimmed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail inspector mirrors the status label near existing corruption sections, keeping copy targets and VoiceOver announcements consistent.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Status presentation updates automatically as ParseIssueStore emits changes, with snapshot/UI tests planned under T5 verifying the bindings.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseTreeNode.status transitions align with issue severities defined in tolerant parsing integration notes to avoid mismatched labels.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse badge styling conventions established in T3.2 for consistent typography, spacing, and accessibility hooks.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with the upcoming Integrity summary tab (T3.6) so the same status language propagates into aggregated issue listings and exports.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Outline Status Chip Rendering", + "description": "Renders status labels in outline rows for nodes flagged as invalid, empty, corrupted, partial, or trimmed with severity-aware colors and accessible text.", + "source_line": null + }, + { + "name": "Detail Inspector Status Mirror", + "description": "Displays a status label near existing corruption sections in the detail inspector, mirroring the outline status and maintaining consistent copy targets and VoiceOver announcements.", + "source_line": null + }, + { + "name": "ParseIssueStore Binding Updates", + "description": "Automatically updates status presentation as ParseIssueStore emits changes, ensuring UI reflects current node statuses.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2117, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/next_tasks_metrics.json new file mode 100644 index 00000000..792d785e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/190_T3_4_Placeholder_Nodes_for_Missing_Children/next_tasks.md", + "n_spec": 2, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide contextual status labels for parsing outcomes to allow operators to distinguish issue severity at a glance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Thread tolerant parsing status metadata (Invalid, Empty, Corrupted, Partial, Trimmed) must be displayed through the outline rows and detail inspector.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Placeholder Nodes for Missing Children", + "description": "Creates synthetic nodes to represent expected but absent child structures in the outline.", + "source_line": null + }, + { + "name": "Contextual Status Labels", + "description": "Displays thread\u2011tolerant parsing status metadata (Invalid, Empty, Corrupted, Partial, Trimmed) on outline rows and detail inspector for operators.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verifies that focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "name": "Real\u2011World Assets Licensing", + "description": "Secures licensing for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures to replace synthetic payloads in regression baselines.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1133, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/Summary_of_Work_metrics.json new file mode 100644 index 00000000..afa8d97a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/Summary_of_Work_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/Summary_of_Work.md", + "n_spec": 6, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Display tolerant parsing status chips in outline rows and detail inspector to show invalid, partial, corrupted, trimmed, and related node states at a glance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline view models propagate ParseTreeStatusDescriptor through row snapshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail inspector renders synchronized badges using ParseTreeStatusBadge SwiftUI view.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tolerant parsing status enums include future states: invalid, empty, trimmed.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseTreeStatusDescriptor model is shared across outline rows and detail inspector.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ParseTreeStatusBadge SwiftUI view for badge presentation in both outline row and detail inspector.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStatusDescriptor Model", + "description": "Provides a shared data model representing the status of tolerant parsing for nodes.", + "source_line": null + }, + { + "name": "ParseTreeStatusBadge View", + "description": "A SwiftUI view that displays a badge indicating the node's parsing status.", + "source_line": null + }, + { + "name": "Outline Row Badge Rendering", + "description": "Renders synchronized status badges in outline rows based on ParseTreeStatusDescriptor.", + "source_line": null + }, + { + "name": "Detail Inspector Badge Rendering", + "description": "Displays status badges in the detail inspector for nodes, mirroring the outline row badges.", + "source_line": null + }, + { + "name": "Extended Parsing Status Enums", + "description": "Adds future parsing states such as invalid, empty, trimmed to the tolerant parsing status enumeration.", + "source_line": null + }, + { + "name": "Outline View Model Propagation", + "description": "Propagates ParseTreeStatusDescriptor through row snapshots in outline view models.", + "source_line": null + }, + { + "name": "Detail Metadata Badge Replacement", + "description": "Replaces the detail metadata status row with a badge presentation for node status.", + "source_line": null + }, + { + "name": "Corruption Issue Section Header Badge", + "description": "Mirrors the same status badge alongside the corruption issue section header for consistency.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 964, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/T3_5_Contextual_Status_Labels_metrics.json b/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/T3_5_Contextual_Status_Labels_metrics.json new file mode 100644 index 00000000..b5812e9b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/T3_5_Contextual_Status_Labels_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/T3_5_Contextual_Status_Labels.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Surface contextual status labels (Invalid, Empty, Corrupted, Partial, Trimmed) in both the outline tree and detail inspector so tolerant parsing metadata is actionable at a glance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline rows display localized, color-coded status chips for nodes flagged as invalid, empty, corrupted, partial, or trimmed, meeting contrast and VoiceOver labeling guidance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail inspector presents the same status chip near the corruption guidance block, keeping copy and announcements in sync across panes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Status chips respond to ParseIssueStore updates without manual refresh, preserving tolerant parsing live-update behavior and snapshot baselines.", + "source_line": null + }, + { + "type": "invariant", + "description": "Status-to-severity mapping matches tolerant parsing definitions in the execution workplan and archived T3.4 notes before hard-coding colors or labels.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse badge styling foundations from the T3.2/T3.4 outline work (spacing, typography, accessibility modifiers) to avoid regressions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Shared components or strings live in ISOInspectorUI modules rather than ad-hoc view code.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Outline Status Chip Display", + "description": "Shows localized, color\u2011coded status chips (Invalid, Empty, Corrupted, Partial, Trimmed) next to outline tree rows based on ParseTreeNode.status", + "source_line": null + }, + { + "name": "Detail Inspector Status Chip", + "description": "Presents the same status chip near the corruption guidance block in the detail inspector pane", + "source_line": null + }, + { + "name": "Live Update Integration with ParseIssueStore", + "description": "Status chips automatically update in response to changes emitted by ParseIssueStore without manual refresh", + "source_line": null + }, + { + "name": "Shared Styling and Accessibility Module", + "description": "Reuses badge styling, spacing, typography, and accessibility modifiers from ISOInspectorUI modules for consistency across outline, detail inspector, integrity tab, and export ribbons", + "source_line": null + }, + { + "name": "Status-to-Severity Mapping Validation", + "description": "Ensures status-to-severity mapping matches tolerant parsing definitions before hard\u2011coding colors or labels", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2339, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/next_tasks_metrics.json new file mode 100644 index 00000000..70ec28d9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/next_tasks_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/191_T3_5_Contextual_Status_Labels/next_tasks.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Contextual status chips now surface across outline rows and the detail inspector.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver regression pass for accessibility shortcuts must confirm focus command menus announce controls and restore focus targets on macOS and iPadOS hardware.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets such as Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures are required to shift regression baselines from synthetic payloads once licensing approvals are obtained.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Contextual Status Labels", + "description": "Displays contextual status chips across outline rows and the detail inspector", + "source_line": null + }, + { + "name": "VoiceOver Accessibility Shortcuts Verification", + "description": "Verifies that focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 801, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b6f2662d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend the JSON export schema for issues to include a schema.version descriptor (v2) when parse issues are present so tolerant payload consumers can detect the richer schema while strict-mode exports remain unchanged.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The JSON exporter emits a schema.version field with value v2 whenever parse issues are present.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict-mode exports do not include the schema.version descriptor and remain unchanged.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests cover trees containing zero, single, and multiple parse issues to guard new schema fields and issue payload structure.", + "source_line": null + }, + { + "type": "invariant", + "description": "The schema.version field is only present when parse issues exist.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The JSON exporter implementation was updated in ISOInspectorKit/Export/JSONParseTreeExporter.swift to emit the schema.version descriptor.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSON Exporter Schema Version Descriptor", + "description": "Emits a schema.version field (v2) in the exported JSON when parse issues are present to indicate richer schema for tolerant consumers.", + "source_line": null + }, + { + "name": "Tolerant Issue Payload Structure", + "description": "Provides structured payload for zero, single, and multiple parse issues within the JSON export.", + "source_line": null + }, + { + "name": "Snapshot Coverage for Parse Issues", + "description": "Unit tests that snapshot the JSON output for trees with no, one, or many parse issues to validate schema fields and issue structure.", + "source_line": null + }, + { + "name": "Documentation Update for Tolerant Exports", + "description": "Updates the app manual to explain the new schema version and removes the task from the active list.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1009, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/T4_1_Extend_JSON_Export_Schema_for_Issues_metrics.json b/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/T4_1_Extend_JSON_Export_Schema_for_Issues_metrics.json new file mode 100644 index 00000000..7c453b90 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/T4_1_Extend_JSON_Export_Schema_for_Issues_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/T4_1_Extend_JSON_Export_Schema_for_Issues.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add tolerant parsing diagnostics to the exported JSON schema so every node serializes its collected ParseIssue records alongside existing metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON exports include an issues collection for each node with severity, reason code, byte range, and human-readable description.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Schema/version documentation updated so downstream consumers can detect tolerant-mode payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Golden-file snapshot tests cover nodes with zero, single, and multiple issues to prevent regressions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict mode exports remain byte-for-byte compatible when no issues are present.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseIssueStore lookups remain efficient for large trees; reuse existing query helpers where possible.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ExportedNode/JSONExportEncoder structures in ISOInspectorKit to encode tolerant fields conditionally.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider forward compatibility by gating new fields behind a schema version bump and documenting fallback behavior for older consumers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ExportedNode issues collection", + "description": "Adds an 'issues' array to each exported node containing ParseIssue records with severity, reason code, byte range, and description.", + "source_line": null + }, + { + "name": "JSONExportEncoder tolerant field encoding", + "description": "Extends the encoder to conditionally include tolerant fields when serializing nodes.", + "source_line": null + }, + { + "name": "ParseIssueStore lookup optimization", + "description": "Ensures efficient retrieval of ParseIssue data for large parse trees during export.", + "source_line": null + }, + { + "name": "Schema version bump and documentation update", + "description": "Introduces a new schema version to signal tolerant-mode payloads and updates docs accordingly.", + "source_line": null + }, + { + "name": "Golden-file snapshot tests for issue scenarios", + "description": "Creates snapshot tests covering nodes with zero, single, and multiple issues to guard against regressions.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2229, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/next_tasks_metrics.json new file mode 100644 index 00000000..a1268a62 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/192_T4_1_Extend_JSON_Export_Schema_for_Issues/next_tasks.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "VoiceOver regression pass for accessibility shortcuts must be completed before hardware verification is scheduled.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hardware verification confirms that focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets must be secured before regression baselines can shift from synthetic payloads.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify that VoiceOver focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + }, + { + "name": "Real-World Assets Licensing and Integration", + "description": "Secure licensing approvals and integrate Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads in regression baselines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 554, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/Summary_of_Work_metrics.json new file mode 100644 index 00000000..93a8a0c8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 564, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/next_tasks_metrics.json new file mode 100644 index 00000000..c398448e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/193_Summary_of_Work_2025-10-27_Blocked_Tasks/next_tasks.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "VoiceOver regression pass for accessibility shortcuts must be completed before hardware verification is scheduled.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS and iPadOS hardware verification to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hardware verification confirms that focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "Real\u2011world assets must be secured before regression baselines can shift from synthetic payloads.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Verify that VoiceOver focus command menus announce controls and restore focus targets on macOS and iPadOS hardware", + "source_line": null + }, + { + "name": "Real-World Assets Licensing and Integration", + "description": "Secure licensing approvals and integrate Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to replace synthetic payloads in regression baselines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 554, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json new file mode 100644 index 00000000..043819fb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/194_ResearchLogMonitor_SwiftUIPreviews.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a developer, I want SwiftUI previews that display VR-006 research log information to load diagnostics from ResearchLogPreviewProvider and present ready/missing/schema-mismatch states without runtime failures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI previews that display VR-006 research log information load diagnostics from ResearchLogPreviewProvider and present ready/missing/schema-mismatch states without runtime failures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Preview bundles include the canonical VR006PreviewLog fixture plus representative missing and mismatch variants so schema drift is caught.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Inline documentation (DocC or preview annotations) instructs contributors how to refresh fixtures when schema fields change.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend preview compositions in the relevant UI modules to bind against ResearchLogPreviewProvider snapshots and render status messaging.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add lightweight unit or snapshot coverage (if feasible) to guarantee previews continue invoking the audit helper when fixtures changes.", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLogMonitor.audit must always be invoked for VR-006 research logs during design-time preview rendering.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogMonitor.audit", + "description": "Audits VR-006 research logs for schema conformance and surfaces diagnostics such as missing fields or schema drift", + "source_line": null + }, + { + "name": "ResearchLogPreviewProvider", + "description": "Synthesizes deterministic snapshots of VR-006 research log data, validates them via ResearchLogMonitor.audit, and provides fixtures for SwiftUI previews", + "source_line": null + }, + { + "name": "SwiftUI preview compositions for VR-006 research logs", + "description": "UI components that bind to ResearchLogPreviewProvider snapshots and render status messaging (ready/missing/schema-mismatch) in design-time previews", + "source_line": null + }, + { + "name": "Diagnostic presentation layer in previews", + "description": "Displays audit diagnostics from ResearchLogMonitor.audit within SwiftUI preview compositions without runtime failures", + "source_line": null + }, + { + "name": "Fixture management system", + "description": "Maintains canonical VR006PreviewLog fixture plus missing and mismatch variants, ensuring schema drift is caught during preview validation", + "source_line": null + }, + { + "name": "Documentation annotations for fixture refresh", + "description": "DocC or preview annotations that instruct contributors on refreshing fixtures when schema fields change", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2741, + "line_count": 32 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c7509181 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/Summary_of_Work.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Export plaintext integrity issues via CLI and app UI", + "source_line": null + }, + { + "type": "user_story", + "description": "Document export pathways in manuals and README feature matrix", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Plaintext exporter formatting behavior passes PlaintextIssueSummaryExporterTests", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI help text includes new export commands as verified by ISOInspectorCLIScaffoldTests/testHelpTextMentionsExportCommands", + "source_line": null + }, + { + "type": "invariant", + "description": "Project status trackers must reflect task completion and remove from active queue", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Shared exporter implementation used for both CLI and app", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Plaintext Integrity Issue Exporter", + "description": "Exports integrity issue data in plaintext format via CLI and app interfaces", + "source_line": null + }, + { + "name": "CLI Export Command Integration", + "description": "Adds toolbar buttons and command menu entries for exporting plaintext issues in the command-line interface", + "source_line": null + }, + { + "name": "App Manual Documentation Update", + "description": "Documents new plaintext export pathways in user manuals for both CLI and app", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1706, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T3_6_Integrity_Summary_Tab_metrics.json b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T3_6_Integrity_Summary_Tab_metrics.json new file mode 100644 index 00000000..c6eafd23 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T3_6_Integrity_Summary_Tab_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T3_6_Integrity_Summary_Tab.md", + "n_spec": 11, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a dedicated Integrity tab that consolidates all recorded ParseIssue entries into a sortable, filterable table and exposes exports so operators can triage corruption without scanning the outline manually.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity tab is accessible from the main inspector alongside Tree, Detail, and Hex tabs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Table lists every issue with sortable columns (severity default) and severity filters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting an issue focuses the associated node in the outline/detail views.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Share/Export menu offers JSON (existing schema v2) and plaintext summaries that include file metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI automation or SwiftUI preview coverage demonstrates populated corrupt fixture renders.", + "source_line": null + }, + { + "type": "invariant", + "description": "Data is surfaced via shared ParseIssueStore observers so counts stay in sync with ribbons.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse contextual status copy/colors from ISOInspectorUI to avoid divergence with badges and detail pane.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide keyboard shortcuts/hooks that future T3.7 navigation work can extend.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate export actions with ongoing T4 diagnostics deliverables to prevent duplicative menu wiring.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validate VoiceOver labels and table focus order per accessibility guidance.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Tab", + "description": "A dedicated tab in the main inspector that displays all ParseIssue entries in a sortable, filterable table.", + "source_line": null + }, + { + "name": "Sortable Issue Table", + "description": "Table columns for severity, code, message, offset, and owning node with default sorting by severity.", + "source_line": null + }, + { + "name": "Severity Filter Control", + "description": "UI control to filter issues displayed in the table based on their severity level.", + "source_line": null + }, + { + "name": "Issue Selection Focus", + "description": "Selecting a row focuses the corresponding node in the outline/detail views.", + "source_line": null + }, + { + "name": "Share/Export Menu", + "description": "Menu providing JSON (v2 schema) and plaintext export options for issue summaries, including file metadata.", + "source_line": null + }, + { + "name": "ParseIssueStore Observer Integration", + "description": "Mechanism to observe ParseIssueStore updates so the table stays synchronized with ribbons and other UI elements.", + "source_line": null + }, + { + "name": "Contextual Status Styling", + "description": "Reuse of contextual status copy/colors from ISOInspectorUI for consistency across badges and detail pane.", + "source_line": null + }, + { + "name": "Keyboard Shortcuts/Navigation Hooks", + "description": "Keyboard shortcuts or hooks that allow future navigation features to extend the tab\u2019s functionality.", + "source_line": null + }, + { + "name": "Accessibility Support", + "description": "VoiceOver labels and keyboard focus order compliance for the Integrity Tab and its table.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2243, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T4_2_Text_Issue_Summary_Export_metrics.json b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T4_2_Text_Issue_Summary_Export_metrics.json new file mode 100644 index 00000000..48a04048 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T4_2_Text_Issue_Summary_Export_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/T4_2_Text_Issue_Summary_Export.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a human-readable plaintext export of tolerant parsing issues and key file metadata for operators to share integrity results without requiring JSON tooling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The export command (UI and CLI) must offer a plaintext option that writes a UTF-8 report summarizing file metadata (path, size, analysis timestamp) followed by each ParseIssue grouped by severity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Report includes issue code, severity, affected node path, and byte range offsets using the tolerant parsing metadata aggregated by ParseIssueStore.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests must verify that the plaintext export for representative fixtures matches stored baselines and handles files with zero issues.", + "source_line": null + }, + { + "type": "invariant", + "description": "Metadata fields in the report must match forthcoming T4.3 requirements (size, hash, timestamp); placeholder fields may remain TODOs if hash work is deferred.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the shared export pipeline introduced for JSON exports via ParseIssueStore.makeIssueSummary() and extend it with a formatter that produces deterministic plain text.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire the new export option into the Integrity tab\u2019s Share menu and the CLI \"isoinspector export\" command, mirroring the JSON option naming.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add DocC and README snippets explaining when to prefer plaintext reports and how they differ from JSON payloads.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Plaintext Export Command", + "description": "Provides a UI and CLI option to generate a UTF-8 plaintext report summarizing file metadata and tolerant parsing issues.", + "source_line": null + }, + { + "name": "File Metadata Section", + "description": "Outputs path, size, analysis timestamp (and placeholder hash) for each exported file.", + "source_line": null + }, + { + "name": "Issue Grouping by Severity", + "description": "Lists ParseIssues grouped under severity headings in the plaintext report.", + "source_line": null + }, + { + "name": "Issue Detail Formatting", + "description": "Each issue includes code, severity, affected node path, and byte range offsets derived from ParseIssueStore metadata.", + "source_line": null + }, + { + "name": "Deterministic Plaintext Formatter", + "description": "Formatter that converts aggregated issue summaries into a deterministic plain\u2011text format for export.", + "source_line": null + }, + { + "name": "Export Pipeline Integration", + "description": "Integrates the plaintext formatter into the existing JSON export pipeline via ParseIssueStore.makeIssueSummary().", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2267, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/blocked_metrics.json b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/blocked_metrics.json new file mode 100644 index 00000000..ddc760c0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/blocked_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/blocked.md", + "n_spec": 5, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be logged and updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run the VoiceOver regression checklist once macOS and iPadOS hardware is available to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The VoiceOver regression checklist must reference archived context in DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets (Dolby Vision, AV1, VP9, Dolby AC-4, MPEG\u2011H) once licensing approvals are obtained and refresh regression baselines to validate tolerant parsing and export scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby\u00a0Vision\u00a0\u2026\u00a0MPEG\u2011H must be pending before importing assets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Run regression checklist to confirm focus command menus announce controls and restore focus targets after VoiceOver verification on macOS/iPadOS hardware.", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Import licensed media assets (Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H) and refresh regression baselines for tolerant parsing/export validation against real-world payloads.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1074, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/next_tasks_metrics.json new file mode 100644 index 00000000..2b1920cd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/next_tasks_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/194_T4_2_Plaintext_Issue_Export_Closeout/next_tasks.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build the Integrity tab listing all ParseIssue entries with sort/filter controls and export actions that stay in sync with ribbons and detail panes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Integrity Summary Tab must list all ParseIssue entries, provide sort and filter controls, support export actions, and remain synchronized with ribbons and detail panes.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseIssue entries displayed in the Integrity tab must always reflect the current state of the system and be consistent across all UI components.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The Integrity Summary Tab will be implemented as a separate component that interacts with existing ribbon and detail pane modules to maintain synchronization.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary Tab", + "description": "Provides a tab that lists all ParseIssue entries with sorting, filtering, and export actions synchronized with ribbons and detail panes.", + "source_line": null + }, + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Schedules hardware verification to ensure VoiceOver focus command menus announce controls and restore focus targets on macOS and iPadOS devices.", + "source_line": null + }, + { + "name": "Real-World Assets Integration", + "description": "Secures licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures to enable regression baselines using real-world media payloads instead of synthetic ones.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 824, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json new file mode 100644 index 00000000..d35d5b7d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/194_ResearchLogMonitor_SwiftUIPreviews.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate ResearchLogMonitor audit into SwiftUI preview scenarios to surface schema drift, missing fixtures, and empty payloads during design-time validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ResearchLogPreviewProvider snapshots must trigger ResearchLogMonitor.audit for each preview composition.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Previews should include canonical VR-006 fixtures plus mismatch/missing variants to provide regression visibility.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Diagnostics from ResearchLogPreviewProvider must appear in ResearchLogAuditPreview and have verified accessibility identifiers via UI hosting tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLogMonitor.audit must always execute during SwiftUI preview rendering of VR-006 data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ResearchLogPreviewProvider to supply snapshot previews with audit diagnostics integrated into the preview composition pipeline.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogMonitor.audit", + "description": "Validates research log data against schema, detecting drift, missing fixtures, and empty payloads during design-time validation", + "source_line": null + }, + { + "name": "ResearchLogPreviewProvider snapshots", + "description": "Generates SwiftUI preview compositions that include sample payloads and diagnostics for VR-006 research log data", + "source_line": null + }, + { + "name": "SwiftUI preview rendering of VR-006 fixtures", + "description": "Renders canonical, ready, missing, and schema mismatch fixtures in SwiftUI previews to exercise audit logic", + "source_line": null + }, + { + "name": "Diagnostics emission in ResearchLogAuditPreview", + "description": "Displays audit diagnostics alongside previewed payloads with accessibility identifiers for UI hosting tests", + "source_line": null + }, + { + "name": "Refresh process for preview fixtures on schema change", + "description": "Updates preview fixture bundles when schema fields change to keep designers unblocked", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1646, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/195_T4_4_Sanitize_Issue_Exports_metrics.json b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/195_T4_4_Sanitize_Issue_Exports_metrics.json new file mode 100644 index 00000000..7a38f002 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/195_T4_4_Sanitize_Issue_Exports_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/195_T4_4_Sanitize_Issue_Exports.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide diagnostics exports (JSON, plaintext, and future variants) that omit raw binary payloads while conveying sufficient metadata for debugging.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "JSON and plaintext issue exports contain only metadata (counts, severities, byte ranges, identifiers) and never embed raw byte arrays, hexdumps, or base64 payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests assert that exporters redact payload data when issues include cached byte buffers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation for tolerant parsing exports explicitly states that binary content is excluded and references the sanitisation guarantee.", + "source_line": null + }, + { + "type": "invariant", + "description": "Exporters must never emit raw hexdumps or payload slices in any export format.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit ParseEventCapturePayload and related DTOs to ensure ParseIssuePayload ignores binary attachments, stripping or rejecting such fields during encoding.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update PlaintextIssueSummaryExporter (and CLI bridge formatting) to elide payload previews while still including offset ranges and diagnostic codes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend exporter-focused tests in Tests/ISOInspectorKitTests to cover issues that previously included Data payloads, confirming sanitised output.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update DocC or README sections covering exports to mention the privacy guardrails once code changes land.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSON Tolerant Exporter", + "description": "Exports diagnostic issues in JSON format while omitting raw binary payloads and including metadata such as counts, severities, byte ranges, identifiers, and byte lengths for data references.", + "source_line": null + }, + { + "name": "Plaintext Issue Summary Exporter", + "description": "Generates plaintext summaries of diagnostic issues, excluding any payload previews but retaining offset ranges and diagnostic codes.", + "source_line": null + }, + { + "name": "ParseEventCapturePayload Sanitisation Module", + "description": "Processes event capture payloads to strip or reject binary attachments before encoding, ensuring no raw data is exported.", + "source_line": null + }, + { + "name": "Export Redaction Test Suite", + "description": "Automated unit and snapshot tests that verify exporters redact payload data when issues contain cached byte buffers.", + "source_line": null + }, + { + "name": "CLI Bridge Formatter for Exports", + "description": "Formats export output for command-line interfaces, ensuring payload previews are elided while metadata remains visible.", + "source_line": null + }, + { + "name": "Documentation Update Engine", + "description": "Updates DocC or README sections to explicitly state that binary content is excluded from tolerant parsing exports and references the sanitisation guarantee.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3100, + "line_count": 34 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/Summary_of_Work_metrics.json new file mode 100644 index 00000000..5570b857 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/Summary_of_Work.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "JSONParseTreeExporter must replace base64 payload fields with byte-length metadata for metadata item list values and data reference entries to prevent binary leakage in tolerant reports.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture next round of verification results, commands, and follow-up observations in the work log.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit coverage for the updated JSONParseTreeExporter must exist in Tests/ISOInspectorKitTests/ParseExportTests.swift.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The tolerance workplan, integration summary, and in-progress tracker must be refreshed to mark T4.4 complete and document the privacy audit outcome.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implementation details and verification notes are captured in DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/195_T4_4_Sanitize_Issue_Export.md.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSONParseTreeExporter", + "description": "Exports parse trees to JSON while sanitizing base64 payloads by replacing them with byte-length metadata for metadata item list values and data reference entries to prevent binary leakage in tolerant reports.", + "source_line": null + }, + { + "name": "T4.4 Sanitize Tolerant Exports Workplan", + "description": "Tracks progress, marks completion, and documents privacy audit outcomes for the T4.4 sanitize tolerant exports task.", + "source_line": null + }, + { + "name": "Verification Notes Capture", + "description": "Stores implementation details and verification notes in a dedicated markdown file within the task archive.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 929, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/T3_6_Integrity_Summary_Tab_metrics.json b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/T3_6_Integrity_Summary_Tab_metrics.json new file mode 100644 index 00000000..67c2101d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/T3_6_Integrity_Summary_Tab_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/T3_6_Integrity_Summary_Tab.md", + "n_spec": 4, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide operators a dedicated Integrity tab that consolidates all recorded ParseIssue entries into a sortable, filterable table and exposes exports so they can triage corruption without scanning the outline manually.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The SwiftUI tab layout must be finished with severity sort/filter controls synchronized with ribbon and detail pane counts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Row selection in the Integrity tab must bind to the outline/detail focus APIs introduced during T3.3\u2013T3.5 so navigation remains contextual.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Share menu must be wired to the refreshed plaintext and JSON exporters now shipping in T4.2.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary Tab UI", + "description": "A SwiftUI tab that displays a sortable and filterable table of all recorded ParseIssue entries.", + "source_line": null + }, + { + "name": "Severity Sort/Filter Controls", + "description": "Controls that allow users to sort or filter issues by severity, synchronized with ribbon and detail pane counts.", + "source_line": null + }, + { + "name": "Row Selection Binding", + "description": "Binding of table row selection to the outline/detail focus APIs for contextual navigation.", + "source_line": null + }, + { + "name": "Share Menu Integration", + "description": "A Share menu that exposes plaintext and JSON export options for the issue summary.", + "source_line": null + }, + { + "name": "Plaintext Issue Exporter", + "description": "An exporter that outputs the integrity summary in plaintext format, as defined in T4.2.", + "source_line": null + }, + { + "name": "JSON Issue Exporter", + "description": "An exporter that outputs the integrity summary in JSON format, as per\u00a0T\u2011\u00a0..", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1238, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/blocked_metrics.json b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/blocked_metrics.json new file mode 100644 index 00000000..8fffc174 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/blocked_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/blocked.md", + "n_spec": 5, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be logged and updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run the VoiceOver regression checklist once macOS and iPadOS hardware becomes available to confirm focus command menus announce controls and restore focus targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The VoiceOver regression checklist must reference archived context in DOCS/TASK_ARCHIVE/156_G8_VoiceOver_Regression_Pass_for_Accessibility_Shortcuts.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets (Dolby Vision, AV1, VP9, Dolby AC-4, MPEG\u2011H) once licensing approvals are obtained and refresh regression baselines to validate tolerant parsing and export scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The regression baselines must be refreshed after importing the licensed assets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Regression Pass for Accessibility Shortcuts", + "description": "Run regression checklist to confirm focus command menus announce controls and restore focus targets after VoiceOver verification", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Import licensed media assets (Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H) and refresh regression baselines for tolerant parsing and export validation", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1074, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/next_tasks_metrics.json new file mode 100644 index 00000000..009cafd5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/next_tasks.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Wire the Integrity tab layout so aggregated ParseIssue rows support severity sorting, filtering, and node focus.", + "source_line": null + }, + { + "type": "user_story", + "description": "Connect Share menu actions to the refreshed plaintext and JSON exporters without diverging from ribbon and detail pane counts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Aggregated ParseIssue rows must allow severity sorting, filtering, and node focus.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Share menu actions must use the refreshed plaintext and JSON exporters while maintaining consistency with ribbon and detail pane counts.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary Tab", + "description": "Provides a tab layout that aggregates ParseIssue rows and supports severity sorting, filtering, and node focus; includes share menu actions for plaintext and JSON exporters linked to ribbon and detail pane counts.", + "source_line": null + }, + { + "name": "ResearchLogMonitor Audit Integration in SwiftUI Previews", + "description": "Enables SwiftUI previews to consume ResearchLogPreviewProvider snapshots, displaying audit diagnostics for ready, missing, and schema mismatch fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 701, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json new file mode 100644 index 00000000..cb1e32de --- /dev/null +++ b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/194_ResearchLogMonitor_SwiftUIPreviews.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate ResearchLogMonitor audit into SwiftUI previews so designers can see diagnostics during design-time validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI preview compositions must consume ResearchLogPreviewProvider snapshots and run ResearchLogMonitor.audit against bundled VR-006 fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Diagnostics for ready, missing, and schema mismatch states must appear in ResearchLogAuditPreview matching the monitoring checklist.", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLogMonitor.audit must always execute when preview scenarios render VR-006 research log data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ResearchLogPreviewProvider snapshots through preview compositions to provide sample payloads and diagnostics alongside previews.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogPreviewProvider snapshots", + "description": "Provides SwiftUI preview compositions that render VR-006 research log data and run ResearchLogMonitor.audit to surface schema drift, missing fixtures, and empty payloads during design-time validation.", + "source_line": null + }, + { + "name": "ResearchLogAuditPreview diagnostics display", + "description": "Displays diagnostics for ready, missing, and schema mismatch states alongside sample payloads in SwiftUI previews.", + "source_line": null + }, + { + "name": "Canonical VR-006 fixture management", + "description": "Maintains canonical VR-006 fixtures and provides mismatch/missing variants for regression visibility in preview compositions.", + "source_line": null + }, + { + "name": "Schema change refresh process documentation", + "description": "Documents the process for refreshing preview fixtures when schema fields change to keep designers unblocked.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1621, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f5b558ae --- /dev/null +++ b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/Summary_of_Work_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/Summary_of_Work.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "Previous session notes must be archived in DOCS/TASK_ARCHIVE/195_T4_4_Sanitize_Issue_Exports/Summary_of_Work.md on 2025-10-27 and used to capture future verification runs, commands, and observations as new work begins.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 351, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Integrity_Summary_Tab_metrics.json b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Integrity_Summary_Tab_metrics.json new file mode 100644 index 00000000..950bddd1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Integrity_Summary_Tab_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Integrity_Summary_Tab.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver a dedicated Integrity tab that consolidates all recorded ParseIssue entries into a sortable, filterable table and exposes exports so operators can triage corruption without scanning the outline manually.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity tab appears alongside the tree/detail panes and lists aggregated ParseIssue rows with default severity sorting plus controls to sort by offset and affected node.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Severity filters adjust the table contents while keeping ribbon counts (ParseIssueStore.IssueMetrics) and the detail pane badges in sync.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting a table row focuses the associated node in the outline and detail panes using the existing navigation APIs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Share/Export actions invoked from the tab reuse the document-level plaintext and JSON exporters, and exported counts match the tab and ribbon totals.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI automation or snapshot coverage verifies that a corrupt fixture displays the expected issue count in the tab and that exports succeed for both full-document and selection scopes.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseIssueStore aggregates tolerant parsing diagnostics with severity counts following T2.1 and T2.3, enabling ribbon updates and Share sheet summaries without recomputation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce IntegritySummaryView (SwiftUI) under Sources/ISOInspectorApp backed by a lightweight view model that observes ParseIssueStore.issues and metrics snapshots.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseTreeExplorerView/AppShellView to include the new tab alongside existing tree/detail/hex content, ensuring tab state updates DocumentSessionController.focusIntegrityDiagnostics()", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary Tab", + "description": "A UI tab that displays a sortable and filterable table of all ParseIssue entries for the current document.", + "source_line": null + }, + { + "name": "ParseIssueStore Observation", + "description": "The view model observes ParseIssueStore.issues and IssueMetrics to provide real-time data to the Integrity Summary Tab.", + "source_line": null + }, + { + "name": "Severity Sorting and Filtering Controls", + "description": "UI controls that allow users to sort the issue table by severity, offset, or affected node, and filter by severity levels.", + "source_line": null + }, + { + "name": "Row Selection Navigation", + "description": "Selecting a row in the table focuses the associated node in the document outline and detail panes via DocumentSessionController APIs.", + "source_line": null + }, + { + "name": "Export Issue Summary Actions", + "description": "Share/Export buttons that invoke DocumentSessionController.exportIssueSummary(scope:) for plaintext export and exportJSON(scope:) for JSON export, reusing existing exporters.", + "source_line": null + }, + { + "name": "Tab State Management", + "description": "The tab state updates DocumentSessionController.focusIntegrityDiagnostics() to keep the UI in sync with the current document session.", + "source_line": null + }, + { + "name": "UI Automation & Snapshot Tests", + "description": "Automated tests that verify correct issue counts, table rendering, filter interactions and export functionality for both full-document and selection scopes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3007, + "line_count": 32 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Summary_of_Work_metrics.json new file mode 100644 index 00000000..3abf048d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Summary_of_Work_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/T3_6_Summary_of_Work.md", + "n_spec": 15, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "As an operator, I want a dedicated Integrity Summary tab that lists all ParseIssue entries in a sortable and filterable table so that I can triage corruption issues without manually scanning the outline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Integrity tab appears alongside tree/detail panes as a TabView with Explorer and Integrity tabs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All ParseIssue rows are aggregated and displayed in the IntegritySummaryView.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Issues are sorted by severity (Error > Warning > Info) by default.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The user can sort issues by offset or affected node using a sort picker.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Severity filter toggle buttons allow the user to show/hide specific issue levels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting an issue row focuses the associated node in the tree view and switches back to the Explorer tab.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Export actions (JSON, Issue Summary) are available in the Integrity tab toolbar and reuse existing DocumentSessionController export methods.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ribbon counts and detail pane badges stay synchronized with ParseIssueStore metrics.", + "source_line": null + }, + { + "type": "invariant", + "description": "The IntegritySummaryViewModel must observe ParseIssueStore for real-time updates via Combine publishers.", + "source_line": null + }, + { + "type": "invariant", + "description": "Severity filter state is maintained consistently across the view model and UI.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use MVVM pattern: IntegritySummaryViewModel handles business logic, IntegritySummaryView handles presentation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate Integrity tab into ParseTreeExplorerView using a TabView with dynamic header.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Make DocumentViewModel.store internal to allow access from ParseTreeExplorerView and IntegritySummaryView.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Follow One File, One Entity principle; keep files under 400 lines.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "IntegritySummaryViewModel", + "description": "Observes ParseIssueStore and provides sorted/filtered issue data for the UI", + "source_line": null + }, + { + "name": "IntegritySummaryView", + "description": "SwiftUI view displaying a sortable, filterable table of parsing issues with export buttons and navigation controls", + "source_line": null + }, + { + "name": "ParseTreeExplorerView Tab Integration", + "description": "Adds Explorer and Integrity tabs to the tree outline, handling dynamic headers and tab switching", + "source_line": null + }, + { + "name": "Issue Selection Navigation", + "description": "When an issue row is selected, focuses the corresponding node in the tree and switches back to the Explorer tab", + "source_line": null + }, + { + "name": "Export Handlers for Integrity Tab", + "description": "Provides JSON and issue summary export actions linked to DocumentSessionController", + "source_line": null + }, + { + "name": "DocumentViewModel Store Exposure", + "description": "Makes ParseIssueStore accessible to other views by changing its visibility from private to internal", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8568, + "line_count": 225 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/blocked_metrics.json b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/blocked_metrics.json new file mode 100644 index 00000000..220c0688 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/blocked_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/blocked.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks cannot proceed until their upstream dependencies are resolved.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real-world payloads once licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures are granted.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures must be obtained before importing licensed assets and refreshing regression baselines.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Blocked Tasks Log", + "description": "Tracks tasks that cannot proceed due to unresolved upstream dependencies and provides visibility into blocker status", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Manages the acquisition of licensed media assets such as Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H for use in testing", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 658, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/next_tasks_metrics.json new file mode 100644 index 00000000..9654abae --- /dev/null +++ b/DOCS/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/196_T3_6_Integrity_Summary_Tab/next_tasks.md", + "n_spec": 7, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build the Integrity tab surface with sortable/severity-filterable ParseIssue rows synchronized with ribbon metrics.", + "source_line": null + }, + { + "type": "user_story", + "description": "Route row selection through DocumentSessionController so focusing a row re-centers the outline and detail panes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Hook Share/Export actions to the refreshed plaintext and JSON exporters and extend UI/export tests to verify count parity.", + "source_line": null + }, + { + "type": "invariant", + "description": "The Integrity tab surface must remain synchronized with ribbon metrics at all times.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseIssue rows in the Integrity tab are sortable and severity-filterable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Row selection triggers DocumentSessionController to re-center outline and detail panes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Share/Export actions use refreshed plaintext and JSON exporters, and UI/export tests confirm count parity.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary Tab", + "description": "Provides a UI tab displaying ParseIssue rows that can be sorted and filtered by severity, synchronized with ribbon metrics; selecting a row focuses the outline and detail panes via DocumentSessionController.", + "source_line": null + }, + { + "name": "Share/Export Actions for Integrity Tab", + "description": "Allows users to share or export the current plaintext and JSON representations of the integrity data, ensuring exported counts match displayed counts.", + "source_line": null + }, + { + "name": "ResearchLogMonitor Audit Integration in SwiftUI Previews", + "description": "Integrates the ResearchLogMonitor audit helper into SwiftUI preview scenarios, displaying VR-006 diagnostics alongside bundled fixtures for testing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 785, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/197_Test_Suite_Fixes_Swift6_Concurrency/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/197_Test_Suite_Fixes_Swift6_Concurrency/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1ca50ae9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/197_Test_Suite_Fixes_Swift6_Concurrency/Summary_of_Work_metrics.json @@ -0,0 +1,133 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/197_Test_Suite_Fixes_Swift6_Concurrency/Summary_of_Work.md", + "n_spec": 16, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure all test suites pass in CI by fixing Swift 6 concurrency and memory management issues.", + "source_line": null + }, + { + "type": "user_story", + "description": "Eliminate CoreData warnings about multiple NSEntityDescriptions by caching NSManagedObjectModel instances.", + "source_line": null + }, + { + "type": "user_story", + "description": "Prevent crashes caused by invalid UUID strings in tests.", + "source_line": null + }, + { + "type": "user_story", + "description": "Avoid RunLoop.main.run usage that causes EXC_BAD_ACCESS during SwiftUI view tests.", + "source_line": null + }, + { + "type": "user_story", + "description": "Make IntegritySummaryViewModel sorting deterministic by replacing asynchronous Combine publishers with synchronous property observers.", + "source_line": null + }, + { + "type": "user_story", + "description": "Disable unreliable SwiftUI view hierarchy tests and recommend state-based or UI test alternatives.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All compilation errors related to Swift 6 strict concurrency are resolved, including type ambiguity, MainActor isolation violations, and Sendable conformance for test stubs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CoreData warnings about multiple NSEntityDescriptions no longer appear in any test run.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests that previously crashed due to invalid UUID strings now use valid hexadecimal UUIDs and do not crash.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI view tests no longer invoke RunLoop.main.run; instead they use XCTestExpectation with async dispatch to avoid memory access violations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "IntegritySummaryViewModel updates its displayed issues immediately upon sortOrder or severityFilter changes, ensuring sorting tests pass deterministically.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All disabled AppShellViewErrorBannerTests are marked with skip_ prefix and contain FIXME comments; no test failures occur from SwiftUI view hierarchy inspection.", + "source_line": null + }, + { + "type": "invariant", + "description": "Test stubs that mutate state must be annotated with @unchecked Sendable to avoid concurrency warnings.", + "source_line": null + }, + { + "type": "invariant", + "description": "The NSManagedObjectModel cache is a static property ensuring each model version only once, preventing duplicate entity descriptions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Explicitly import ISOInspectorKit.FourCharCode to resolve type ambiguity between Foundation and project types.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Mark test methods accessing @MainActor isolated objects with @MainActor to enforce isolation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FourCharCode Type Disambiguation Import", + "description": "Explicitly imports the custom FourCharCode struct to avoid Foundation's Darwin.FourCharCode ambiguity in tests.", + "source_line": null + }, + { + "name": "MainActor Isolation for Test Methods", + "description": "Marks test methods that access @MainActor types with @MainActor to satisfy Swift 6 concurrency rules.", + "source_line": null + }, + { + "name": "Sendable Conformance for Test Stubs", + "description": "Adds @unchecked Sendable to mutable test stub classes so they can be used in concurrent contexts without thread safety concerns.", + "source_line": null + }, + { + "name": "CoreData Model Caching", + "description": "Creates a static cache of NSManagedObjectModel instances per model version to eliminate multiple NSEntityDescriptions warnings during tests.", + "source_line": null + }, + { + "name": "UUID Validation Fix", + "description": "Replaces an invalid UUID string with a valid hexadecimal UUID to prevent nil unwrapping crashes in tests.", + "source_line": null + }, + { + "name": "Safe Async Expectation for SwiftUI View Tests", + "description": "Replaces unsafe RunLoop.main.run calls with XCTestExpectation and asyncAfter to wait for UI updates without corrupting the autorelease pool.", + "source_line": null + }, + { + "name": "Synchronous Property Observers in ViewModel", + "description": "Changes Combine publisher sinks to synchronous didSet observers on @Published properties so that test assertions see immediate state changes.", + "source_line": null + }, + { + "name": "Disabled SwiftUI View Hierarchy Tests with FIXME", + "description": "Marks tests that rely on containsText() for SwiftUI views as disabled, adding comments recommending state-based testing instead of view hierarchy inspection.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 15304, + "line_count": 401 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/198_Summary_of_Work_2025-10-29_JSON_Snapshot_Rounding/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/198_Summary_of_Work_2025-10-29_JSON_Snapshot_Rounding/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e24b1208 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/198_Summary_of_Work_2025-10-29_JSON_Snapshot_Rounding/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/198_Summary_of_Work_2025-10-29_JSON_Snapshot_Rounding/Summary_of_Work.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "All second-based values exported to JSON must be rounded to a fixed six-decimal precision before encoding to eliminate cross-platform float drift.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The exporter\u2019s JSON output for edit-list data must use Decimal representation of the rounded values.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Running swift test with filter JSONExportSnapshotTests should pass after implementation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a shared quantization helper utility (quantizedSeconds) to be used across exporter surfaces for consistent rounding.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Quantized Seconds Utility", + "description": "Provides a shared helper to round second-based values to a fixed six-decimal precision before JSON encoding.", + "source_line": null + }, + { + "name": "Edit List Exporter JSON Encoding", + "description": "Exports edit-list data as JSON using Decimal representation of quantized seconds, ensuring consistent formatting across platforms.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 916, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json new file mode 100644 index 00000000..28eb02b0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/194_ResearchLogMonitor_SwiftUIPreviews.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate ResearchLogMonitor audit into SwiftUI previews so that design-time validation surfaces schema drift, missing fixtures, and empty payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI preview scenarios must execute ResearchLogMonitor.audit via ResearchLogPreviewProvider snapshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Previews should include canonical VR-006 fixtures plus mismatch/missing variants for regression visibility.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Audit failures should surface using existing FoundationUI banner styles or a dedicated preview overlay if necessary.", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLogMonitor.audit must always be invoked during SwiftUI preview rendering to detect schema issues.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ResearchLogPreviewProvider snapshots as the dependency injection point for previews, avoiding app-only singletons.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogMonitor.audit", + "description": "Performs schema drift, missing fixture, and empty payload validation on VR-006 research log data", + "source_line": null + }, + { + "name": "ResearchLogPreviewProvider snapshots", + "description": "Generates SwiftUI preview compositions that invoke ResearchLogMonitor.audit to surface diagnostics alongside sample payloads", + "source_line": null + }, + { + "name": "VR006PreviewLog fixtures", + "description": "Bundled canonical VR-006 JSON fixtures used in previews for ready, missing, and schema mismatch scenarios", + "source_line": null + }, + { + "name": "ResearchLogAuditPreview", + "description": "Displays audit diagnostics within SwiftUI previews using existing FoundationUI banner styles or a dedicated overlay", + "source_line": null + }, + { + "name": "Dependency injection point for previews", + "description": "Lightweight mechanism allowing preview code to call ResearchLogMonitor.audit without accessing app-only singletons", + "source_line": null + }, + { + "name": "Accessibility identifiers in preview snapshots", + "description": "Stable identifiers used for automation and testing of preview diagnostics", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2426, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/197_T3_7_1_Integrity_Sorting_Refinements_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/197_T3_7_1_Integrity_Sorting_Refinements_metrics.json new file mode 100644 index 00000000..9028b9f7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/197_T3_7_1_Integrity_Sorting_Refinements_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/197_T3_7_1_Integrity_Sorting_Refinements.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement deterministic multi-field sorting for offset-based and affected-node-based orderings in the Integrity summary table to ensure CLI/export parity across large fixture sets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Offset-based sorting uses primary sort by byteRange.lowerBound, secondary tie-breaker by severity rank (Error > Warning > Info), tertiary tie-breaker by issue code or stable identifier to ensure deterministic ordering even when multiple issues share the same byte offset.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Affected node sorting uses primary sort by affected node depth or path, secondary sort by node ID numeric order, tertiary tie-breaker by severity rank to maintain consistent ordering when multiple issues affect the same node.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests assert deterministic sort order when issues have matching primary keys (e.g., three issues at the same offset with different severities produce a stable, repeatable order).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI verification confirms that switching sort modes in the Integrity tab produces consistent, repeatable orderings across app relaunch and fixture reload scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updates the IntegritySummaryViewModel implementation comments to reflect the multi-field sort strategy and rationale for each tie-breaker.", + "source_line": null + }, + { + "type": "invariant", + "description": "Sorting must match CLI/export ordering for consistency across all ISOInspector surfaces.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Multi-field sort logic is implemented in IntegritySummaryViewModel.swift, replacing single-field comparisons with deterministic tie-breaking based on severity rank and issue code or node depth.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary ViewModel Sorting", + "description": "Provides deterministic multi-field sorting for integrity issues by offset and affected node, ensuring consistent ordering across UI, CLI, and exports.", + "source_line": null + }, + { + "name": "Offset-Based Issue Sorting Logic", + "description": "Implements primary sort on byte range lower bound, secondary severity rank, tertiary issue code to order issues sharing the same offset.", + "source_line": null + }, + { + "name": "Affected-Node-Based Issue Sorting Logic", + "description": "Orders issues by affected node ID (or depth), then severity rank and byte offset to resolve ties when multiple issues affect the same node.", + "source_line": null + }, + { + "name": "Unit Tests for Deterministic Ordering", + "description": "Suite of tests asserting stable sort order for edge cases such as identical offsets, severities, or missing data.", + "source_line": null + }, + { + "name": "UI Verification of Sort Stability", + "description": "Ensures that switching sort modes in the Integrity tab yields repeatable orderings across app relaunches and fixture reloads.", + "source_line": null + }, + { + "name": "Documentation Updates for Sorting Strategy", + "description": "Comments and task documentation describing the multi-field sort approach and rationale for each tie-breaker.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8952, + "line_count": 160 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/198_Duplicate_Share_Toolbar_Button_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/198_Duplicate_Share_Toolbar_Button_metrics.json new file mode 100644 index 00000000..ff74e547 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/198_Duplicate_Share_Toolbar_Button_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/198_Duplicate_Share_Toolbar_Button.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Eliminate the duplicate Share toolbar button in the macOS ISOInspector app so that a single Share control exposes the full export menu without redundant toolbar items.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS build shows a single Share button providing all export options; automated tests confirm non-duplication.", + "source_line": null + }, + { + "type": "invariant", + "description": "The toolbar must not contain duplicate Share buttons on macOS.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a toolbar policy helper that disables the integrity view toolbar on macOS while preserving it for iOS environments.", + "source_line": null + }, + { + "type": "user_story", + "description": "Consolidate Share toolbar item definitions, ensuring menu content is composed in one location and reused.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The top-level AppShellView retains the consolidated export menu so macOS continues to expose full export functionality through a single Share button.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refactor IntegritySummaryView to route toolbar construction through the policy helper so the menu is only emitted when both export handlers are provided.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extend IntegritySummaryViewTests to cover the new toolbar policy, asserting that macOS disables the secondary toolbar and that the policy requires both export actions before surfacing the menu.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ToolbarPattern", + "description": "Defines toolbar groups and items for the ISOInspector macOS app", + "source_line": null + }, + { + "name": "AppShellView Toolbar Share Button", + "description": "Global export/share menu exposed via a single Share button in the main window toolbar", + "source_line": null + }, + { + "name": "IntegritySummaryView Toolbar Share Button", + "description": "Tab-specific Share button providing document-level exports, currently duplicated on macOS", + "source_line": null + }, + { + "name": "ToolbarPolicyHelper", + "description": "Controls whether the IntegritySummaryView toolbar is emitted based on platform and availability of export handlers", + "source_line": null + }, + { + "name": "ExportMenuBuilder", + "description": "Builds the menu items for export actions (JSON, report exports, etc.)", + "source_line": null + }, + { + "name": "IntegritySummaryViewTests", + "description": "Unit tests validating toolbar policy behavior for macOS and iOS platforms", + "source_line": null + }, + { + "name": "ToolbarPatternTests", + "description": "Unit tests covering toolbar item composition in FoundationUI", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5404, + "line_count": 75 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..8baf17f0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/Summary_of_Work.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "PDD Puzzle Retire", + "description": "Retires the PDD puzzle in ResearchLogMonitor.audit when SwiftUI preview pipelines execute audit via ResearchLogPreviewProvider snapshots.", + "source_line": null + }, + { + "name": "Task Tracker Update", + "description": "Updates todo.md, DOCS/INPROGRESS/next_tasks.md and archive next-task trackers to mark task #4 complete with cross-references to verification notes.", + "source_line": null + }, + { + "name": "Completion Summary Capture", + "description": "Captures completion summaries in active task brief DOCS/INPROGRESS/194_ResearchLogMonitor_SwiftUIPreviews.md and related archive entries documenting fixture health and diagnostic coverage.", + "source_line": null + }, + { + "name": "Swift Test Execution Policy", + "description": "Defines that CI-equivalent Swift tests are not executed in Linux container; rely on existing ResearchLogPreviewProviderTests and ResearchLogAccessibilityIdentifierTests during macOS verification.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1073, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_6_Integrity_Summary_Tab_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_6_Integrity_Summary_Tab_metrics.json new file mode 100644 index 00000000..ac5b6cc6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_6_Integrity_Summary_Tab_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_6_Integrity_Summary_Tab.md", + "n_spec": 11, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Triage polish items from Integrity tab release to keep table interactions, sorting refinements, and exporter hooks aligned with ribbon metrics and DocumentSession navigation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Sorting polish (#T36-001,#T36-002) must produce deterministic ordering matching CLI exports on large fixture sets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Navigation cue review (#T36-003) must restore Explorer tab selection reliably after state store refactors when focusing an issue row.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Metrics health check must spot-audit ribbon versus tab counts after tolerance parsing fixture regenerations to surface regressions quickly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Running swift test --filter IntegritySummaryViewTests validates updated ordering expectations after sorting refinements ship.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI automation coverage must confirm severity filtering keeps outline badges synchronized.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Exports for corrupt fixtures (Tests/Fixtures/Corrupt/*) must match plaintext/JSON summaries with table counts.", + "source_line": null + }, + { + "type": "invariant", + "description": "Table interactions, sorting refinements, and exporter hooks must remain aligned with ribbon metrics and DocumentSession navigation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit @todo markers in Sources/ISOInspectorApp/Integrity/IntegritySummaryView.swift and IntegritySummaryViewModel.swift to translate into discrete follow-up tasks for backlog.", + "source_line": null + }, + { + "type": "user_story", + "description": "Coordinate design to confirm final filter/button layout before freezing automation screenshots.", + "source_line": null + }, + { + "type": "user_story", + "description": "Draft acceptance criteria for T3.7 (issue navigation filters) based on backlog guidance in DOCS/AI/ISOViewer/ISOInspector_PRD_TODO.md.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary View", + "description": "UI component displaying a table of integrity issues with sorting and filtering capabilities", + "source_line": null + }, + { + "name": "Sorting Behavior for Integrity Issues", + "description": "Deterministic ordering of table rows based on offset/node to match CLI exports", + "source_line": null + }, + { + "name": "Navigation Cue Restoration", + "description": "Ensures focusing an issue row restores Explorer tab selection after state store changes", + "source_line": null + }, + { + "name": "Metrics Health Check", + "description": "Audit ribbon versus tab counts to detect regressions in metric displays", + "source_line": null + }, + { + "name": "Export Hooks for Integrity Summary", + "description": "Generate plaintext and JSON summaries of table data, ensuring consistency with exported fixture counts", + "source_line": null + }, + { + "name": "Severity Filtering Synchronization", + "description": "UI automation verifies that severity filters keep outline badges synchronized with filtered results", + "source_line": null + }, + { + "name": "Test Automation Suite for Integrity Summary", + "description": "Swift test suite (IntegritySummaryViewTests) validating sorting, filtering, and export behavior", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1901, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_7_Integrity_Navigation_Filters_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_7_Integrity_Navigation_Filters_metrics.json new file mode 100644 index 00000000..852140b5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_7_Integrity_Navigation_Filters_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/T3_7_Integrity_Navigation_Filters.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Investigators can navigate between corrupt nodes directly from the Integrity tab while keeping the outline tree in sync.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity summary table supports deterministic offset and affected-node sorting that matches CLI/export ordering across large fixture sets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting an issue row re-centers the Explorer outline on the affected node and preserves tab focus so investigators can immediately inspect details.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline toolbar exposes a filter toggle (and matching keyboard shortcut) that hides resolved/healthy nodes and cycles through corrupt entries in document order per the T3.7 acceptance notes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Navigation controls respect existing accessibility shortcuts and do not regress warning ribbon metrics or export parity validated in prior Integrity tasks.", + "source_line": null + }, + { + "type": "invariant", + "description": "Existing keyboard shortcut catalogs must not conflict with current Command+Option bindings when adding issue navigation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with ParseIssueStore metrics to reuse severity filters and align the toggle with ribbon counts before introducing new UI state.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend integration tests alongside the Integrity tab suite once filters and navigation land to protect CLI/UI parity.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary Table", + "description": "Displays corruption issues in a table with deterministic offset and affected-node sorting matching CLI/export ordering.", + "source_line": null + }, + { + "name": "Issue Row Selection Navigation", + "description": "Selecting an issue row re-centers the Explorer outline on the affected node while preserving tab focus for immediate inspection.", + "source_line": null + }, + { + "name": "Explorer Outline Filter Toggle", + "description": "Toolbar control that toggles visibility of resolved/healthy nodes, with a keyboard shortcut to cycle through corrupt entries in document order.", + "source_line": null + }, + { + "name": "Keyboard Shortcut Integration", + "description": "Adds issue navigation shortcuts (e.g., Command+Option) without conflicting existing bindings and respects accessibility shortcuts.", + "source_line": null + }, + { + "name": "ParseIssueStore Severity Filter Coordination", + "description": "Reuses severity filters from ParseIssueStore to align the filter toggle with ribbon counts before adding new UI state.", + "source_line": null + }, + { + "name": "Integration Tests for Filters & Navigation", + "description": "Extends Integrity tab test suite to cover navigation controls and filter behavior, ensuring CLI/UI parity.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3275, + "line_count": 32 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/blocked_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/blocked_metrics.json new file mode 100644 index 00000000..9baa6f3b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/blocked_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/blocked.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must not proceed until upstream dependencies are resolved.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures must be obtained before importing assets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Blocked Tasks Log", + "description": "Tracks tasks that cannot proceed until upstream dependencies are resolved and updates visibility when blockers change", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Handles acquisition of licensed media assets such as Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 659, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/next_tasks_metrics.json new file mode 100644 index 00000000..fb21340b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/next_tasks.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "IntegritySummaryViewModel implements deterministic order for CLI/UI parity via multi-field offset and affected-node sort implementations.", + "source_line": null + }, + { + "type": "user_story", + "description": "When selecting an Integrity issue, the Explorer outline expands and focuses the matching node before switching tabs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting an Integrity issue must expand and focus the matching node in the Explorer outline before tab switch.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add an \"issues only\" outline filter with keyboard shortcuts to jump between issue-bearing nodes as per tolerant parsing backlog.", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLog preview scenarios invoke the audit helper and surface ready/missing/schema mismatch diagnostics from ResearchLogPreviewProvider fixtures.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Summary ViewModel Sorting", + "description": "Provides deterministic multi-field offset and affected-node sorting for integrity summaries in CLI/UI.", + "source_line": null + }, + { + "name": "Integrity Navigation Filter \u2013 Issue Expansion", + "description": "Expands and focuses the matching node in the Explorer outline when an integrity issue is selected before switching tabs.", + "source_line": null + }, + { + "name": "Integrity Navigation Filter \u2013 Issues Only Outline Filter", + "description": "Adds a filter to show only nodes with issues and keyboard shortcuts to navigate between them.", + "source_line": null + }, + { + "name": "Research Log Monitor SwiftUI Previews Integration", + "description": "Integrates ResearchLog audit into SwiftUI previews, displaying diagnostics for ready/missing/schema mismatches from preview fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1365, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/19_C2_Tree_View_Virtualization_metrics.json b/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/19_C2_Tree_View_Virtualization_metrics.json new file mode 100644 index 00000000..b9f22007 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/19_C2_Tree_View_Virtualization_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/19_C2_Tree_View_Virtualization.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver a SwiftUI outline view for parsed ISO BMFF boxes using ParseTreeStore snapshots so users can explore files through a responsive hierarchy with search and filtering.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline renders >10k nodes smoothly while expanding/collapsing and reacting to incoming snapshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Search input filters the tree immediately, highlighting matches and collapsing irrelevant branches per UX expectations from the UI PRD.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Filter toggles allow focusing on validation warnings/errors, box categories, and streaming metadata in line with backlog notes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Works across macOS/iPadOS form factors with SwiftUI best practices, ready for integration in Phase E.", + "source_line": null + }, + { + "type": "invariant", + "description": "Search/filter logic can be reused by CLI/export features and unknown box warnings from VR-006 remain visible.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consume ParseTreeStore Combine snapshots and virtualize rendering to avoid performance cliffs when large payloads arrive.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define view models for nodes, selection state, and filtering categories so C3 detail/hex panes can subscribe later.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tree View Rendering", + "description": "Displays a SwiftUI outline view of parsed ISO BMFF boxes using ParseTreeStore snapshots, supporting smooth rendering of >10k nodes with virtualization.", + "source_line": null + }, + { + "name": "Node Selection State Management", + "description": "Manages selection state for tree nodes so that detail/hex panes can subscribe and react to user selections.", + "source_line": null + }, + { + "name": "Search Filtering", + "description": "Provides a search input that filters the tree immediately, highlights matches, and collapses irrelevant branches according to UX expectations.", + "source_line": null + }, + { + "name": "Category & Validation Filters", + "description": "Offers toggle controls to focus on validation warnings/errors, box categories, and streaming metadata, updating the tree view accordingly.", + "source_line": null + }, + { + "name": "Cross-Platform Compatibility", + "description": "Ensures the tree view works across macOS and iPadOS form factors following SwiftUI best practices.", + "source_line": null + }, + { + "name": "Combine Snapshot Consumption", + "description": "Consumes Combine snapshots from ParseTreeStore to update the tree view in real time as new data arrives.", + "source_line": null + }, + { + "name": "Reusable Search/Filter Logic", + "description": "Exposes search and filter logic that can be reused by CLI/export features and other components.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2543, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ba8e7487 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/Summary_of_Work_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/Summary_of_Work.md", + "n_spec": 4, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a virtualized parse tree outline view that supports incremental expansion and search filtering for large parse trees in SwiftUI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ParseTreeOutlineViewModel must be @MainActor to ensure SwiftUI updates are performed on the main thread.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The view model should support incremental expansion state of parse tree nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The view model implements search/filter constraints that allow only partial or full matching of?\u00a0", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeOutlineViewModel", + "description": "Virtualizes ParseTreeSnapshot hierarchies, manages incremental expansion state, applies search/filter constraints, and updates SwiftUI on the main actor", + "source_line": null + }, + { + "name": "ParseTreeExplorerView", + "description": "SwiftUI component that renders large parse trees using LazyVStack and provides UI for exploring parse nodes", + "source_line": null + }, + { + "name": "ParseTreeOutlineView", + "description": "SwiftUI outline view displaying parse tree structure with expandable rows and severity badges", + "source_line": null + }, + { + "name": "RowBadges", + "description": "UI elements indicating severity levels of parse nodes within the explorer", + "source_line": null + }, + { + "name": "SeverityToggle", + "description": "Control to filter parse nodes by severity in the SwiftUI explorer", + "source_line": null + }, + { + "name": "SearchAutoExpansion", + "description": "Feature that automatically expands tree nodes when search results are found", + "source_line": null + }, + { + "name": "ParseTreePreviewData", + "description": "Reusable preview data set for testing and demonstrating the outline view without a live parse pipeline", + "source_line": null + }, + { + "name": "UnitCoverageTests", + "description": "Test suite covering expansion, search auto\u2011expansion, and severity filtering behavior in ParseTreeOutlineViewModel", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1177, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/next_tasks_metrics.json new file mode 100644 index 00000000..119b27fa --- /dev/null +++ b/DOCS/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/19_C2_Tree_View_Virtualization/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Wire the explorer to real file selection and trigger ParseTreeStore.start so snapshots stream from user data.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement additional outline filters for box categories and streaming metadata (see @todo #6).", + "source_line": null + }, + { + "type": "user_story", + "description": "Expose selection bindings that feed upcoming C3 detail and hex panes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "File Explorer Integration", + "description": "Connects the explorer UI to real file selection and initiates ParseTreeStore.start to stream snapshots from user data.", + "source_line": null + }, + { + "name": "Outline Filters Extension", + "description": "Adds new outline filters for box categories and streaming metadata as specified in @todo #6.", + "source_line": null + }, + { + "name": "Selection Binding Exposure", + "description": "Provides bindings that feed selected items into upcoming detail and hex panes of C3.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 320, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json new file mode 100644 index 00000000..49b8d7a6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/194_ResearchLogMonitor_SwiftUIPreviews_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/194_ResearchLogMonitor_SwiftUIPreviews.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 281, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/197_T3_7_1_Integrity_Sorting_Refinements_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/197_T3_7_1_Integrity_Sorting_Refinements_metrics.json new file mode 100644 index 00000000..098ec1c7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/197_T3_7_1_Integrity_Sorting_Refinements_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/197_T3_7_1_Integrity_Sorting_Refinements.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 290, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/198_Duplicate_Share_Toolbar_Button_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/198_Duplicate_Share_Toolbar_Button_metrics.json new file mode 100644 index 00000000..a4cf0bf9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/198_Duplicate_Share_Toolbar_Button_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/198_Duplicate_Share_Toolbar_Button.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 267, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/200_T3_7_Integrity_Navigation_Filters_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/200_T3_7_Integrity_Navigation_Filters_metrics.json new file mode 100644 index 00000000..e5357ed2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/200_T3_7_Integrity_Navigation_Filters_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/200_T3_7_Integrity_Navigation_Filters.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Investigator can navigate from an Integrity tab issue to the affected node in the Explorer outline.", + "source_line": null + }, + { + "type": "user_story", + "description": "Investigators can hide healthy branches and view only issue-bearing nodes using an \"Issues only\" filter toggle.", + "source_line": null + }, + { + "type": "user_story", + "description": "Keyboard shortcuts (Cmd+Shift+E / Cmd+Shift+Option+E) allow cycling through issue-bearing nodes in document order.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting an Integrity issue expands ancestors, focuses the Explorer outline on the affected node, and maintains stable handoff between Integrity and Explorer tabs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The \"Issues only\" toggle hides healthy branches while preserving sibling context for affected nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard shortcuts cycle through issue-bearing nodes without conflicting with existing focus shortcuts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests and preview\u2011driven QA cover the new filter mode and navigation helpers, ensuring deterministic behavior across fixtures.", + "source_line": null + }, + { + "type": "invariant", + "description": "The ParseTreeOutlineViewModel must always expose a consistent set of rows that include the affected node when an issue is selected.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a showsOnlyIssues flag in ParseTreeOutlineFilter to control visibility of healthy branches.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing navigation helpers (rowID\u00a0after\u00a0..\u00a0\u2026) and view model\u2011based navigation coordinator for keyboard shortcuts.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Integrity Issue Navigation", + "description": "Allows selecting an integrity issue to expand ancestor nodes and focus the outline view on the affected node.", + "source_line": null + }, + { + "name": "Issues-Only Filter Toggle", + "description": "Toolbar toggle that shows only nodes with integrity issues, hiding healthy branches while preserving sibling context.", + "source_line": null + }, + { + "name": "Keyboard Navigation Shortcuts", + "description": "Cmd+Shift+E / Cmd+Shift+Option+E shortcuts to cycle through issue-bearing nodes in document order using view model helpers.", + "source_line": null + }, + { + "name": "Outline View Model Helpers", + "description": "Functions such as rowID(after:direction:) and navigation utilities exposed on ParseTreeOutlineViewModel for navigating and revealing nodes.", + "source_line": null + }, + { + "name": "Filter State Management", + "description": "ParseTreeOutlineFilter includes a showsOnlyIssues flag to control visibility of issue nodes in the outline.", + "source_line": null + }, + { + "name": "Unit Tests for Outline View Model", + "description": "Test suite covering filter mode, navigation helpers, and deterministic behavior across fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5941, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/Summary_of_Work_metrics.json new file mode 100644 index 00000000..5f7569a5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must always preserve historical tracking of archived sorting and navigation notes in DOCS/TASK_ARCHIVE/199_T3_7_Integrity_Sorting_and_Navigation/.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a user, I want the next_tasks.md file to focus on remaining T3.7 milestones so that I can easily see what is left to complete.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The checklist for T3.7 must be updated and live alongside the work log.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a user, I want to see integrity selections expand the Explorer ancestors, focus the outline, and clear #T36-003 when selecting an Integrity selection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity selections must expand Explorer ancestors, focus the outline and clear\u00a0#T36-003.", + "source_line": null + }, + { + "type": "user_story", + "description": "The user has\u00a0\"\u2026\u00a0..\u00a0..\u00a0\u2026\u00a0\u2026\u00a0\u2026\u00a0i\u2026\u00a0\u2026\u00a0\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Archive Prior Integrity Sorting and Navigation", + "description": "Archives previous integrity sorting, navigation planning, and ResearchLog preview audit notes to a specified DOCS/TASK_ARCHIVE directory for historical tracking.", + "source_line": null + }, + { + "name": "Generate Next Tasks Checklist", + "description": "Regenerates the next_tasks.md file focusing on remaining T3.7 milestones such as sorting refinements and navigation filters, placing the checklist alongside the work log.", + "source_line": null + }, + { + "name": "Monitor Real-World Asset Licensing Blocker", + "description": "Preserves and monitors an ongoing real-world asset licensing blocker without adding new permanent blockers.", + "source_line": null + }, + { + "name": "Issue Handoff Wiring for Integrity Selections", + "description": "Wires issue handoff so that selecting integrity items expands Explorer ancestors, focuses the outline view, and clears a specific task (#T36-003).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1643, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/T3_6_Integrity_Summary_Tab_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/T3_6_Integrity_Summary_Tab_metrics.json new file mode 100644 index 00000000..748d9b0d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/T3_6_Integrity_Summary_Tab_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/T3_6_Integrity_Summary_Tab.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 305, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/blocked_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/blocked_metrics.json new file mode 100644 index 00000000..6401f2b0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/blocked_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/blocked.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must not proceed until upstream dependencies are resolved.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed assets and refresh regression baselines after licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression baselines are refreshed so tolerant parsing and export scenarios validate against real-world payloads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Maintain a log of blocked tasks and update it whenever blockers change to ensure day\u2011to\u2011day visibility.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 659, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/next_tasks_metrics.json new file mode 100644 index 00000000..15429bd4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/next_tasks_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/200_T3_7_Integrity_Navigation_Filters/next_tasks.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "Integrity Summary ViewModel Sorting", + "description": "Provides deterministic multi-field offset and affected-node sorting for integrity summaries in CLI/UI.", + "source_line": null + }, + { + "name": "Explorer Outline Expansion", + "description": "Expands ancestor nodes when navigating to an integrity issue and returns focus to the selected node.", + "source_line": null + }, + { + "name": "Affected Node Selection", + "description": "Automatically selects affected nodes in the explorer outline upon choosing an integrity issue.", + "source_line": null + }, + { + "name": "Issues Only Toggle", + "description": "UI toggle that filters the explorer view to show only integrity issues.", + "source_line": null + }, + { + "name": "Issue Navigation Shortcuts", + "description": "Keyboard shortcuts (Cmd+Shift+E / Cmd+Shift+Option+E) for navigating between integrity issues using new navigation helpers.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 887, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/201_T5_1_Corrupt_Fixture_Corpus_metrics.json b/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/201_T5_1_Corrupt_Fixture_Corpus_metrics.json new file mode 100644 index 00000000..ac732073 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/201_T5_1_Corrupt_Fixture_Corpus_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/201_T5_1_Corrupt_Fixture_Corpus.md", + "n_spec": 7, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create a dedicated corrupted media fixture corpus to exercise tolerant parsing across diverse failure modes for regression suites and manual QA.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "At least ten fixtures representing unique corruption scenarios live under Fixtures/Corrupt/ with descriptive filenames.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each fixture includes a machine-readable manifest entry describing corruption type, affected boxes, and expected ParseIssue codes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated sanity checks load a subset of the new fixtures to ensure tolerant parsing completes and records the documented issues without crashes.", + "source_line": null + }, + { + "type": "invariant", + "description": "No current assets satisfy the acceptance criteria of covering at least ten distinct corruption patterns with curated metadata for downstream automation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define a manifest schema (JSON or YAML) for corruption metadata so future tasks can consume it programmatically.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Generate fixtures via scripted manipulations of known-good assets to keep creation reproducible; document scripts under scripts/fixtures/ if needed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Corrupt Fixture Corpus Repository", + "description": "A dedicated directory structure (Fixtures/Corrupt/) containing at least ten media fixture files that each represent a unique corruption scenario.", + "source_line": null + }, + { + "name": "Fixture Manifest Schema", + "description": "A machine\u2011readable manifest (JSON or YAML) that describes each fixture\u2019s corruption type, affected boxes, and expected ParseIssue codes.", + "source_line": null + }, + { + "name": "Automated Sanity Test Suite", + "description": "Unit/integration tests that load selected fixtures to verify tolerant parsing completes and records the documented issues without crashing.", + "source_line": null + }, + { + "name": "Fixture Generation Scripts", + "description": "Scripts under scripts/fixtures/ that programmatically create corrupted media files from known\u2011good assets by manipulating bytes (e.g., truncation, header patching).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2385, + "line_count": 33 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/Summary_of_Work_metrics.json new file mode 100644 index 00000000..7b6fa940 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/Summary_of_Work.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide deterministic corrupt fixtures for testing header decoding failures, truncated payloads, and traversal guard triggers in tolerant parsing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Corrupt fixtures must be located under Fixtures/Corrupt/, catalogued in Documentation/FixtureCatalog/corrupt-fixtures.json with corruption patterns, affected boxes, expected ParseIssue codes, and smoke-test hints.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "generate_fixtures.py should emit the corrupt corpus alongside existing synthetic text fixtures to allow reproducible regeneration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CorruptFixtureCorpusTests must validate manifest structure and confirm tolerant parsing processes smoke fixtures while recording documented issues.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always maintain a consistent fixture catalog and manifest structure for corrupt fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add deterministic corrupt fixtures under Fixtures/Corrupt/ and integrate them into the generated corpus via generate_fixtures.py.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Deterministic Corrupt Fixtures", + "description": "Provides a set of reproducible corrupt data fixtures covering header decoding failures, truncated payloads, and traversal guard triggers for tolerant parsing.", + "source_line": null + }, + { + "name": "Corrupt Fixture Catalog Documentation", + "description": "Documents corruption patterns, affected boxes, and expected ParseIssue codes with smoke-test hints in corrupt-fixtures.json.", + "source_line": null + }, + { + "name": "Fixture Generation Extension", + "description": "Extends generate_fixtures.py to emit the corrupt corpus alongside existing synthetic text fixtures for reproducible regeneration.", + "source_line": null + }, + { + "name": "Corrupt Fixture Corpus Tests", + "description": "Validates manifest structure and ensures tolerant parsing processes smoke fixtures while recording documented issues.", + "source_line": null + }, + { + "name": "Updated Fixture Catalog Documentation Workflow", + "description": "Describes the corrupt corpus workflow, references the new manifest and tests in the fixture catalog documentation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 894, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/next_tasks_metrics.json new file mode 100644 index 00000000..33d250f1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/201_T5_1_Corrupt_Fixture_Corpus/next_tasks.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automate regression tests across all corrupt fixtures to ensure tolerant parsing records documented issues and tree structures remain partial instead of aborting.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests must run on all corrupt fixtures and produce tolerant parsing records with documented issues while maintaining partial tree structures rather than aborting.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface corrupt corpus fixtures in UI smoke tests once table rendering harness is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI smoke tests should display corrupt corpus fixtures after the table rendering harness becomes available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend fixture metadata with size heuristics or playback notes to support downstream benchmarking prioritisation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fixture metadata must include size heuristics or playback notes when required by T5.4/T5.5 for prioritisation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Automated Regression Test Execution", + "description": "Runs regression tests across all corrupt fixtures, tolerating parsing errors and documenting issues while preserving partial tree structures.", + "source_line": null + }, + { + "name": "Corrupt Fixture UI Surface", + "description": "Displays corrupt corpus fixtures in UI smoke tests once table rendering harness is available.", + "source_line": null + }, + { + "name": "Fixture Metadata Extension", + "description": "Adds size heuristics or playback notes to fixture metadata for downstream benchmarking prioritization.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 452, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/BUG-0001-AccessibilityContrast_metrics.json b/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/BUG-0001-AccessibilityContrast_metrics.json new file mode 100644 index 00000000..4d0bacc2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/BUG-0001-AccessibilityContrast_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/BUG-0001-AccessibilityContrast.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Validate and correct FoundationUI's AccessibilityContext contrast detection logic so that it honours the platform \"Increase Contrast\" preference.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Contrast detection aligns with the \"Increase Contrast\" preference.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests cover the scenario where contrast and differentiate flags diverge.", + "source_line": null + }, + { + "type": "invariant", + "description": "The SwiftUI accessibilityContrast environment value is absent from the deployed toolchain, so referencing it directly breaks compilation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Switch the detection logic to consult AccessibilityContrast when available, falling back to legacy APIs for older platforms.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Updated baselinePrefersIncreasedContrast to favour system accessibility APIs (UIAccessibility.isDarkerSystemColorsEnabled / NSWorkspace.accessibilityDisplayShouldIncreaseContrast) and fall back to accessibilityDifferentiateWithoutColor only when no platform hook exists.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "AccessibilityContext.prefersIncreasedContrast", + "description": "Provides a boolean indicating whether the system \"Increase Contrast\" accessibility setting is enabled, used by FoundationUI components to adjust styling for high-contrast users.", + "source_line": null + }, + { + "name": "AccessibilityContext.accessibilityDifferentiateWithoutColor", + "description": "Exposes the system \"Differentiate Without Color\" accessibility flag, which can be overridden in tests and used as a fallback when contrast detection APIs are unavailable.", + "source_line": null + }, + { + "name": "FoundationUI Accessibility Context Environment Accessor", + "description": "A SwiftUI environment accessor that aggregates platform-specific accessibility flags into a single context object for use by UI components.", + "source_line": null + }, + { + "name": "Unit Tests for AccessibilityContext", + "description": "Test suite verifying the correctness of prefersIncreasedContrast logic, including scenarios where contrast and differentiate flags diverge and ensuring regression coverage.", + "source_line": null + }, + { + "name": "Fallback Logic to Legacy APIs", + "description": "Implementation that falls back to UIAccessibility.isDarkerSystemColorsEnabled on iOS or NSWorkspace.accessibilityDisplayShouldIncreaseContrast on macOS when SwiftUI's accessibilityContrast is unavailable.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4301, + "line_count": 60 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/Summary_of_Work_metrics.json new file mode 100644 index 00000000..7c155692 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/Summary_of_Work.md", + "n_spec": 2, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement deterministic corrupt fixture set (Fixtures/Corrupt/) and associated metadata, generator support, and tolerant parsing smoke tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run swift test --filter CorruptFixtureCorpusTests to verify implementation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Corrupt Fixture Corpus API", + "description": "Provides deterministic corrupt fixture set and metadata for testing", + "source_line": null + }, + { + "name": "Fixture Catalog Manifest", + "description": "JSON catalog of corrupt fixtures used by the system", + "source_line": null + }, + { + "name": "Generator Support for Corrupt Fixtures", + "description": "Tooling to generate corrupt fixture data", + "source_line": null + }, + { + "name": "Tolerant Parsing Smoke Tests", + "description": "Tests that validate parsing tolerates corrupt data", + "source_line": null + }, + { + "name": "Accessibility Contrast Flag Validation Workflow", + "description": "Process for capturing reproduction steps and findings for contrast helper mismatch", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 760, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/blocked_metrics.json b/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/blocked_metrics.json new file mode 100644 index 00000000..cdb4a895 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/blocked_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/202_BUG0001_Accessibility_Contrast/blocked.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must not proceed until upstream dependencies are resolved.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be obtained before importing assets.", + "source_line": null + }, + { + "type": "invariant", + "description": "The log should be updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Permanent blockers are stored under DOCS/TASK_ARCHIVE/BLOCKED to avoid duplicating retired work.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 646, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/203_T5_2_Regression_Tests_for_Tolerant_Traversal_metrics.json b/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/203_T5_2_Regression_Tests_for_Tolerant_Traversal_metrics.json new file mode 100644 index 00000000..199caca7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/203_T5_2_Regression_Tests_for_Tolerant_Traversal_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/203_T5_2_Regression_Tests_for_Tolerant_Traversal.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add regression tests for tolerant traversal that exercise truncated, overlapping, and malformed-header corrupt fixtures using the tolerant pipeline options.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each test must assert that traversal continues beyond the corrupt node, verifies emitted ParseIssue reason codes/ranges, and checks aggregate metrics (counts/depth) match manifest expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI or exporter-facing smoke tests must confirm tolerant runs produce warnings without aborting, ensuring UI/CLI wiring remains regression-free.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict-mode control coverage must remain unchanged; paired assertions that .strict runs still throw/abort as documented.", + "source_line": null + }, + { + "type": "invariant", + "description": "The ParseIssueStore metrics and summary functions (makeIssueSummary(), metricsSnapshot()) must accurately reflect aggregated warnings during tolerant traversal.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend Tests/ISOInspectorKitTests/ParsePipelineLiveTests.swift or add a dedicated TolerantTraversalRegressionTests suite to stream corrupt fixtures with .tolerant options and assert continued event emission.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Pipeline", + "description": "Processes box trees while continuing traversal after encountering corrupted nodes and records ParseIssue entries", + "source_line": null + }, + { + "name": "ParseIssue Store", + "description": "Aggregates parse issues, provides metrics snapshots and issue summaries for UI ribbons and CLI summaries", + "source_line": null + }, + { + "name": "Regression Test Suite \u2013 Tolerant Traversal Tests", + "description": "XCTest coverage that streams corrupt fixtures with tolerant options, asserts continued event emission and verifies ParseIssue reason codes/ranges and aggregate metrics", + "source_line": null + }, + { + "name": "CLI/Exporter Smoke Tests", + "description": "Snapshot or textual tests confirming tolerant runs produce warnings without aborting, ensuring UI/CLI wiring remains functional", + "source_line": null + }, + { + "name": "Strict Mode Control Tests", + "description": "Paired assertions that strict parsing runs still throw/abort as documented", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2805, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bf2d3d32 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/Summary_of_Work_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/Summary_of_Work.md", + "n_spec": 9, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a regression test suite for tolerant traversal that verifies continued parsing after corruption and accurate issue recording.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All 11 test methods must pass without failures when run against the tolerant parser implementation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each tolerant mode test must assert that traversal continues beyond a corrupt node and records a ParseIssue with correct reason code and byte range.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero-length loop guard tests must prevent infinite iteration and record guard.zero_size_loop issue.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Deep recursion guard tests must enforce a depth limit of 64 and record guard.recursion_depth_exceeded issue.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Invalid four-character code test must record an unknown box issue (VR-006) instead of header.invalid_fourcc.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Truncated size field test must record a reader_error issue.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Child exceeding parent range test must record payload.truncated for child exceeding parent bounds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Metrics aggregation tests must verify error/warning/info counts match actual issues and use ParseIssueStore.makeIssueSummary().", + "source_line": null + } + ], + "functional_units": [ + { + "name": "TolerantTraversalRegressionTests Suite", + "description": "A test suite validating tolerant parsing pipeline behavior across various corruption scenarios", + "source_line": null + }, + { + "name": "testTruncatedMoovContinuesTraversalAndRecordsIssue", + "description": "Ensures traversal continues after truncated moov payload and records a payload.truncated issue with correct severity and byte range", + "source_line": null + }, + { + "name": "testZeroLengthLoopGuardPreventsInfiniteIteration", + "description": "Verifies zero-length loop guard prevents infinite iteration and records guard.zero_size_loop issue while keeping depth bounded", + "source_line": null + }, + { + "name": "testDeepRecursionGuardLimitsTraversalDepth", + "description": "Checks recursion depth limit enforcement, recording guard.recursion_depth_exceeded issue and respecting configured depth limit", + "source_line": null + }, + { + "name": "testInvalidFourCCRecordsHeaderIssue", + "description": "Tests handling of invalid four-character codes and records appropriate header issue (e.g., VR-006)", + "source_line": null + }, + { + "name": "testTruncatedSizeFieldRecordsHeaderIssue", + "description": "Validates truncated size field handling and records header.truncated_field or reader_error issue", + "source_line": null + }, + { + "name": "testChildExceedingParentRangeRecordsPayloadIssue", + "description": "Ensures parent-child boundary violations are recorded as payload.truncated for the child node", + "source_line": null + }, + { + "name": "testTolerantModeAggregatesMetricsAcrossMultipleIssues", + "description": "Confirms aggregate metrics (error/warning/info counts) match actual issues and ParseIssueStore.makeIssueSummary() consistency", + "source_line": null + }, + { + "name": "testAllFixturesProcessInTolerantModeWithoutCrashing", + "description": "Processes all corrupt fixtures in tolerant mode, verifying expected issues without crashes", + "source_line": null + }, + { + "name": "testStrictModeThrowsOnTruncatedPayload", + "description": "Confirms strict mode aborts on truncated payload; exception throws", + "source_line": null + }, + { + "name": "testStrictModeThrowsOnZeroLengthLoop", + "description": "Confirm strict mode aborts\u00a0on\u00a0zero\u2011length\u00a0loop\u00a0..", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6892, + "line_count": 166 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/blocked_metrics.json b/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/blocked_metrics.json new file mode 100644 index 00000000..50a9abb0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/blocked_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/203_T5_2_Regression_Tests_for_Tolerant_Traversal/blocked.md", + "n_spec": 5, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must not proceed until upstream dependencies are resolved.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures must be obtained before importing assets.", + "source_line": null + }, + { + "type": "invariant", + "description": "The log of blocked tasks should be updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Permanent blockers are stored under DOCS/TASK_ARCHIVE/BLOCKED to avoid duplicating retired work.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Blocked Tasks Log", + "description": "Tracks tasks that cannot proceed due to unresolved upstream dependencies and provides visibility into blocker status", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Handles acquisition of licensed media assets such as Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H for use in the system", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 659, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/204_InspectorPattern_Lazy_Loading_metrics.json b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/204_InspectorPattern_Lazy_Loading_metrics.json new file mode 100644 index 00000000..dbbf4a34 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/204_InspectorPattern_Lazy_Loading_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/204_InspectorPattern_Lazy_Loading.md", + "n_spec": 9, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a developer using InspectorPattern, I want inspector panels to defer expensive subviews until they appear so that initial presentation is fast and scrolling remains smooth.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Inspector panels load heavy subviews on-demand without blocking initial presentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "State bindings between InspectorPattern and downstream editor view models propagate updates without redundant re-rendering of off-screen sections.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Scroll performance in inspector panes remains smooth when toggling sections or editing fields, as measured by SwiftUI Instruments traces or comparable profiling notes captured in the implementation summary.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and previews illustrate the lazy-loading behavior and state-handling patterns for downstream adopters.", + "source_line": null + }, + { + "type": "invariant", + "description": "InspectorPattern must retain existing spacing tokens and layout structure when using LazyVStack/LazyVGrid wrappers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use LazyVStack or LazyVGrid inside ScrollView to enable lazy loading of subviews while preserving spacing.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce optional binding hooks (e.g., @Binding\u00a0var\u00a0selection\u00a0\u2026\u00a0..) allow inspector panels control expansion/collapsing without eager evaluation.", + "source_line": null + }, + { + "type": "invariant", + "description": "API changes must be source\u2011compatible or provide shims to ensure continuity of downstream usage.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "InspectorPattern Lazy Loading", + "description": "Allows inspector panels to defer rendering of expensive subviews until they become visible within a scroll view.", + "source_line": null + }, + { + "name": "State Binding Hooks for InspectorPanel", + "description": "Provides optional @Binding or closure hooks so that panel expansion/collapsing and state updates propagate without eager evaluation.", + "source_line": null + }, + { + "name": "Scroll Performance Monitoring API", + "description": "Exposes instrumentation hooks to capture smooth scrolling metrics during inspector pane interactions.", + "source_line": null + }, + { + "name": "Documentation & Preview Generator", + "description": "Generates documentation and SwiftUI previews that illustrate lazy-loading behavior and state handling for downstream adopters.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2815, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/205_T6_1_CLI_Tolerant_Flag_metrics.json b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/205_T6_1_CLI_Tolerant_Flag_metrics.json new file mode 100644 index 00000000..fc757ac4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/205_T6_1_CLI_Tolerant_Flag_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/205_T6_1_CLI_Tolerant_Flag.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a CLI user of isoinspect, I want to be able to enable tolerant parsing via a --tolerant flag so that corruption diagnostics can be gathered without aborting the run.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a CI script runner, I want the default behavior to remain strict mode unless explicitly overridden, ensuring reliable exit codes and error handling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The isoinspect command accepts a --tolerant flag (and an inverse --strict flag) and defaults to strict behavior when unspecified.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI help text and documentation explain the tolerant mode, its defaults, and how it interacts with existing logging/export options.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tolerant runs surface corruption summaries using existing metrics without regressing strict-mode exits or error codes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests cover tolerant flag parsing and ensure strict mode remains default for CI-friendly invocations.", + "source_line": null + }, + { + "type": "invariant", + "description": "The --tolerant and --strict flags are mutually exclusive in the ArgumentParser configuration.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the ArgumentParser command configuration to add mutually exclusive tolerant/strict flags, mapping into ParsePipeline.Options presets already shipped for the app/SDK.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire the chosen mode into CLI execution so tolerant runs reuse ParseIssueStore summaries in final output.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refresh CLI documentation (DocC manual and --help) to describe the new switches and defaults.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "--tolerant flag", + "description": "CLI option to enable lenient parsing for corruption diagnostics", + "source_line": null + }, + { + "name": "--strict flag", + "description": "CLI option to enforce strict parsing, inverse of tolerant mode", + "source_line": null + }, + { + "name": "ArgumentParser configuration update", + "description": "Adds mutually exclusive tolerant/strict flags mapped to ParsePipeline.Options presets", + "source_line": null + }, + { + "name": "Tolerant mode execution wiring", + "description": "Integrates chosen mode into CLI workflow, reusing ParseIssueStore summaries in output", + "source_line": null + }, + { + "name": "CLI help text and documentation update", + "description": "Describes tolerant/strict switches, defaults, and interaction with logging/export options", + "source_line": null + }, + { + "name": "Regression tests for tolerant flag parsing", + "description": "Unit/integration tests ensuring correct behavior of tolerant vs strict invocations", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2630, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1d71a6ba --- /dev/null +++ b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/Summary_of_Work.md", + "n_spec": 6, + "n_func": 1, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a command-line interface that allows users to toggle between tolerant and strict parsing modes for the inspect, export-json, export-text, and export-capture commands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The CLI must support --tolerant and --strict switches on the specified commands, defaulting to strict mode when no flag is provided.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When --tolerant is used, parsing should be lenient; when --strict is used, parsing should be strict.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The help text and DocC manual must document the tolerant parsing usage for all affected commands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests must cover strict defaults, tolerant overrides, flag conflicts, and export parsing behavior.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system should always enforce that only one of --tolerant or --strict is present at any given time.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Tolerant Parsing Flag", + "description": "Adds --tolerant/--strict switches to inspect, export-json, export-text, and export-capture commands, enabling lenient or strict parsing modes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 589, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/blocked_metrics.json b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/blocked_metrics.json new file mode 100644 index 00000000..214aeae7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/blocked_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/204_T6_1_CLI_Tolerant_Flag/blocked.md", + "n_spec": 5, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must not proceed until upstream dependencies are resolved.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be obtained before importing assets.", + "source_line": null + }, + { + "type": "invariant", + "description": "The log of blocked tasks should be updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Permanent blockers are stored under DOCS/TASK_ARCHIVE/BLOCKED to avoid duplicating retired work.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Blocked Tasks Log", + "description": "Tracks tasks that cannot proceed until upstream dependencies are resolved and updates visibility when blockers change", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Handles acquisition of licensed media assets such as Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 659, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/205_T5_4_Performance_Benchmark/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/205_T5_4_Performance_Benchmark/Summary_of_Work_metrics.json new file mode 100644 index 00000000..6bc9b8f1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/205_T5_4_Performance_Benchmark/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/205_T5_4_Performance_Benchmark/Summary_of_Work.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide lenient-vs-strict CLI benchmarking for LargeFileBenchmarkTests to capture average duration and RSS deltas per mode.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The benchmark must report average duration and RSS deltas for each mode within the test suite.", + "source_line": null + }, + { + "type": "invariant", + "description": "Tolerant-mode overhead budgets are enforced: runtime \u22641.2\u00d7 of baseline and RSS increase \u226450 MiB, verified by XCTest assertions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results must show runtime overhead \u22641.049\u00d7 and RSS increase \u22640.01 MiB for the archived Linux metrics.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce PerformanceBenchmarkConfiguration to hold tolerant-mode budgets and enforce them via XCTest assertions.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "LargeFileBenchmarkTests", + "description": "CLI benchmarking for lenient vs strict modes, capturing average duration and RSS deltas", + "source_line": null + }, + { + "name": "PerformanceBenchmarkConfiguration", + "description": "Defines tolerant-mode overhead budgets (runtime multiplier and RSS increase) and enforces them via XCTest assertions", + "source_line": null + }, + { + "name": "LargeFileBenchmarkFixture", + "description": "Generates large test fixture files in a temporary directory under isoinspector-benchmarks", + "source_line": null + }, + { + "name": "ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES environment variable", + "description": "Specifies the size of the reference payload for benchmarking (e.g., 1 GiB)", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1606, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/205_T5_4_Performance_Benchmark_metrics.json b/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/205_T5_4_Performance_Benchmark_metrics.json new file mode 100644 index 00000000..1861f1a3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/205_T5_4_Performance_Benchmark_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/205_T5_4_Performance_Benchmark.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Benchmark lenient parsing against strict mode on a 1 GB reference fixture to ensure performance stays within budget.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict-mode benchmark establishes baseline metrics for the 1 GB reference fixture using the existing XCTest performance suite.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Lenient-mode benchmark completes on the same fixture with \u22641.2\u00d7 runtime overhead and \u226450 MB additional peak memory compared to the baseline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Results (metrics, configuration, fixture hash) are recorded and linked for archival in the forthcoming task summary.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI or local automation notes indicate how to repeat the benchmark (e.g., command invocation, environment requirements).", + "source_line": null + }, + { + "type": "invariant", + "description": "Performance gate must be enforced before the beta exit criteria can be met, pairing strict-mode baselines with lenient-mode runs on large_file_1GB.mp4.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse LargeFileBenchmarkTests by parameterizing the parsing mode (strict vs. lenient) and capturing metrics for both runs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend PerformanceBenchmarkConfiguration with tolerant-mode overhead budgets (1.2\u00d7 runtime, +50 MiB RSS) so the suite enforces the gate directly.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Lenient Parsing Performance Benchmark", + "description": "Runs a performance test comparing lenient parsing mode against strict mode on a 1 GB media fixture to ensure runtime and memory overhead stay within specified limits.", + "source_line": null + }, + { + "name": "Strict Mode Baseline Benchmark", + "description": "Executes the existing XCTest performance suite in strict parsing mode to establish baseline metrics for the 1 GB reference fixture.", + "source_line": null + }, + { + "name": "Parameterized Large File Benchmark Harness", + "description": "Reuses LargeFileBenchmarkTests, parameterized by parsing mode (strict or lenient), to capture runtime and memory metrics for each run.", + "source_line": null + }, + { + "name": "Performance Metrics Capture and Archival", + "description": "Collects raw timing and peak RSS data during benchmark runs and records them in Documentation/Performance for archival and regression analysis.", + "source_line": null + }, + { + "name": "CI / Local Automation Benchmark Invocation Guide", + "description": "Provides command invocation details, environment requirements, and notes on how to repeat the benchmark in CI or locally.", + "source_line": null + }, + { + "name": "Environment Constraint Documentation", + "description": "Documents macOS hardware and Combine support requirements for running lenient mode benchmarks, including mitigation steps for future automation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3743, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/Summary_of_Work_metrics.json new file mode 100644 index 00000000..5eec6632 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/Summary_of_Work.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide lenient-versus-strict performance benchmarking for ISOInspector CLI to validate runtime and RSS differences.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must capture average runtime and RSS deltas for both lenient and strict modes using LargeFileBenchmarkTests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Performance budgets in tolerant-mode must allow up to 1.2\u00d7 runtime overhead and +50 MiB RSS increase, enforced by XCTest assertions.", + "source_line": null + }, + { + "type": "invariant", + "description": "Runtime overhead must not exceed 1.049\u00d7 and RSS increase must not exceed 0.01 MiB for the 32\u202fMiB fixture measurements.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add tolerant-mode performance budgets to PerformanceBenchmarkConfiguration and wire them into XCTest assertions.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Lenient vs Strict Performance Benchmarking", + "description": "Captures average runtime and RSS deltas for CLI validation runs using lenient-versus-strict mode in LargeFileBenchmarkTests.", + "source_line": null + }, + { + "name": "Tolerant-Mode Performance Budgets Configuration", + "description": "Defines performance budget limits (1.2\u00d7 runtime, +50 MiB RSS) in PerformanceBenchmarkConfiguration and applies XCTest assertions.", + "source_line": null + }, + { + "name": "Local Measurement Recording for 32 MiB Fixture", + "description": "Records local measurements showing runtime overhead \u22641.049\u00d7 and RSS increase \u22640.01 MiB, archived in a log file.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1073, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/blocked_metrics.json b/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/blocked_metrics.json new file mode 100644 index 00000000..c56dbf53 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/blocked_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/206_T5_4_Performance_Benchmark_macOS_Run/blocked.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks cannot proceed until their upstream dependencies are resolved.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real-world payloads once licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be obtained before importing licensed assets and refreshing regression baselines.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Blocked Tasks Log", + "description": "Tracks tasks that cannot proceed due to unresolved upstream dependencies and provides visibility into blocker status", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Manages the acquisition of licensed media assets such as Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H for use in testing", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 646, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f71df5df --- /dev/null +++ b/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 686, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/blocked_metrics.json b/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/blocked_metrics.json new file mode 100644 index 00000000..cadd5f34 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/blocked_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/blocked.md", + "n_spec": 5, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "The log of blocked tasks must be updated whenever blocker status changes to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures must be secured before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark once macOS hardware with the 1 GiB performance fixture becomes available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The benchmark must run with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, collect runtime and RSS metrics, and archive them under Documentation/Performance/.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Assets", + "description": "Imports licensed media assets into the system and refreshes regression baselines for tolerant parsing and export validation.", + "source_line": null + }, + { + "name": "Execute macOS Benchmark", + "description": "Runs a macOS performance benchmark with a 1 GiB payload, collects runtime and RSS metrics, and archives results in Documentation/Performance.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1254, + "line_count": 15 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/next_tasks_metrics.json new file mode 100644 index 00000000..638de139 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/next_tasks_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/next_tasks.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run the lenient-versus-strict benchmark on macOS hardware with Combine enabled using the 1 GiB fixture", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Export ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Invoke swift test --filter LargeFileBenchmarkTests/testCLIValidationLenientModePerformanceStaysWithinToleranceBudget", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Archive the printed runtime and RSS metrics under Documentation/Performance/ alongside the existing 32 MiB results", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Run lenient-versus-strict benchmark", + "description": "Execute the performance benchmark comparing lenient and strict modes on macOS hardware using Combine framework", + "source_line": null + }, + { + "name": "Export payload size environment variable", + "description": "Set ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES to 1 GiB for the benchmark run", + "source_line": null + }, + { + "name": "Invoke specific test case", + "description": "Run swift test with filter LargeFileBenchmarkTests/testCLIValidationLenientModePerformanceStaysWithinToleranceBudget", + "source_line": null + }, + { + "name": "Archive runtime and RSS metrics", + "description": "Store printed runtime and RSS metrics in Documentation/Performance/ alongside existing 32 MiB results", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 432, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/208_T6_2_CLI_Corruption_Summary_Output_metrics.json b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/208_T6_2_CLI_Corruption_Summary_Output_metrics.json new file mode 100644 index 00000000..327f9a57 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/208_T6_2_CLI_Corruption_Summary_Output_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/208_T6_2_CLI_Corruption_Summary_Output.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expose tolerant parsing metrics in the iso-inspector-cli output so operators can immediately understand corruption severity without opening the UI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI analysis output prints corruption summary lines (errors, warnings, info, deepest affected depth) whenever lenient mode encounters recorded issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict-mode runs exit unchanged while tolerant-mode runs without issues continue to omit the summary block.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit or snapshot tests cover representative outputs: strict success, lenient with no issues, lenient with mixed-severity issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation (help text or usage examples) references the new summary block.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the CLI formatter to query ParseIssueStore metrics after analysis completes; ensure formatting stays deterministic for snapshot tests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the existing ParseIssueSummary types introduced by T2.3 instead of duplicating aggregation logic.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Gate summary emission on tolerant mode or presence of issues to avoid altering strict-mode ergonomics.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Corruption Summary Output", + "description": "Prints a summary block in the CLI analysis output showing counts of errors, warnings, info and deepest affected depth when tolerant mode encounters recorded issues.", + "source_line": null + }, + { + "name": "Tolerant Mode Detection", + "description": "Determines whether the CLI is running in tolerant mode or strict mode to decide if the corruption summary should be emitted.", + "source_line": null + }, + { + "name": "ParseIssueStore Metrics Query", + "description": "Queries ParseIssueStore.metricsSnapshot() after analysis completes to obtain formatter-ready data for the summary.", + "source_line": null + }, + { + "name": "Summary Block Formatting", + "description": "Formats the corruption summary lines deterministically for snapshot tests and UI parity.", + "source_line": null + }, + { + "name": "Unit/Snapshot Test Coverage", + "description": "Provides unit or snapshot tests covering strict success, lenient with no issues, and lenient with mixed-severity issues.", + "source_line": null + }, + { + "name": "Documentation Update", + "description": "Updates help text or usage examples to reference the new corruption summary block.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2326, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/BugFix_Colors_Tertiary_macOS_2025-11-07_metrics.json b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/BugFix_Colors_Tertiary_macOS_2025-11-07_metrics.json new file mode 100644 index 00000000..e99b2453 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/BugFix_Colors_Tertiary_macOS_2025-11-07_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/BugFix_Colors_Tertiary_macOS_2025-11-07.md", + "n_spec": 6, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Improve visual clarity and accessibility of macOS UI components by ensuring DS.Colors.tertiary is used as a background color instead of a label color.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DS.Colors.tertiary on macOS returns .controlBackgroundColor, providing \u22654.5:1 contrast with window backgrounds in both Light and Dark modes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All semantic colors are non\u2011nil and platform parity is maintained between iOS and macOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests pass: testTertiaryColorIsBackgroundColorOnMacOS, testTertiaryColorPlatformParity, testAllSemanticColorsAreNotNil.", + "source_line": null + }, + { + "type": "invariant", + "description": "DS.Colors.tertiary must always be a background color on macOS and not a label color.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use .controlBackgroundColor for DS.Colors.tertiary on macOS to match iOS's .tertiarySystemBackground and adhere to Apple HIG.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DS.Colors.tertiary macOS background color token", + "description": "Provides a subtle background color for macOS components, matching iOS's tertiarySystemBackground and ensuring WCAG AA contrast", + "source_line": null + }, + { + "name": "testTertiaryColorIsBackgroundColorOnMacOS test", + "description": "Regression test verifying DS.Colors.tertiary uses proper background color on macOS", + "source_line": null + }, + { + "name": "testTertiaryColorPlatformParity test", + "description": "Test ensuring semantic consistency of DS.Colors.tertiary across iOS and macOS", + "source_line": null + }, + { + "name": "testAllSemanticColorsAreNotNil test", + "description": "Prevents accidental breakage by asserting all semantic color definitions are non\u2011nil", + "source_line": null + }, + { + "name": "Bug Fix - macOS Tertiary Color Contrast preview", + "description": "SwiftUI preview demonstrating correct contrast for DS.Colors.tertiary in SidebarPattern, InspectorPattern, Card, SurfaceStyle etc.", + "source_line": null + }, + { + "name": "SidebarPattern component", + "description": "UI pattern showing a detail content area with proper background separation using DS.Colors.tertiary", + "source_line": null + }, + { + "name": "InspectorPattern component", + "description": "UI pattern panel that uses DS.Colors.tertiary for background differentiation", + "source_line": null + }, + { + "name": "Card component", + "description": "Component that displays card backgrounds using DS.Colors.tertiary", + "source_line": null + }, + { + "name": "SurfaceStyle component", + "description": "Applies the style with background color set to DS.1?", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7897, + "line_count": 222 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/Summary_of_Work_metrics.json new file mode 100644 index 00000000..3f165af3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/Summary_of_Work_metrics.json @@ -0,0 +1,23 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/Summary_of_Work.md", + "n_spec": 1, + "n_func": 1, + "intent_atoms": [ + { + "type": "invariant", + "description": "All prior in-progress notes for the macOS 1 GiB lenient-versus-strict benchmark must be archived under DOCS/TASK_ARCHIVE/207_Summary_of_Work_2025-11-04_macOS_Benchmark_Block/. ", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Corruption Summary Output", + "description": "Provides tolerant-mode corruption summary lines in the isoinspect inspect command, including severity counts and deepest affected depth from ParseIssueStore; documented in DocC and tested via CLI scaffold tests for tolerant and strict modes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 897, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/blocked_metrics.json b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/blocked_metrics.json new file mode 100644 index 00000000..41b7c38b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/blocked_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/blocked.md", + "n_spec": 13, + "n_func": 7, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blocker status changes to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be granted before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, collect runtime and RSS metrics, and archive them under Documentation/Performance once macOS hardware with the 1 GiB performance fixture becomes available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS hardware with the 1 GiB performance fixture must be available in the automation environment before running the benchmark.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish FoundationUI Phase\u202f5.2 performance baselines in PERFORMANCE.md after manual profiling with Xcode Instruments on macOS developer machine.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Render times measured by Time Profiler must be under 100\u202fms, allocations under 5\u202fMB, and Core Animation must verify 60\u202fFPS on device for the manual performance profiling task.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish CI integration with performance gates after completing multi\u2011platform benchmark tests (iOS\u00a017, macOS\u00a014, iPadOS\u00a017) once all required metrics are documented.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time must be under 10s for a clean build, binary size under 500KB release, memory footprint under 5MB per screen, 60\u202fFPS during interactions, and BoxTreePattern with 1000+ nodes must perform within acceptable limits.", + "source_line": null + }, + { + "type": "user_story", + "description": "Compile cross\u2011platform test results and create a cross\u2011platform report after testing on iOS\u00a017+, macOS\u00a014+, and iPadOS\u00a017+ devices and simulators.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All platforms must pass dark mode verification, RTL language testing (Arabic, Hebrew), and multiple locale/region testing before the report is compiled.", + "source_line": null + }, + { + "type": "user_story", + "description": "Achieve final accessibility sign\u2011off after manual VoiceOver, keyboard navigation, dynamic type, reduce motion, contrast, and bold text testing on real devices.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility score must reach 100% after automated tests and manual edge\u2011case validation before sign\u2011off.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Assets", + "description": "Import licensed media assets and refresh regression baselines for tolerant parsing and export scenarios", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run lenient vs strict benchmark on macOS with 1 GiB payload, collect runtime and RSS metrics, archive results", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish performance baseline data in PERFORMANCE.md after profiling", + "source_line": null + }, + { + "name": "Generate Performance Report", + "description": "Document findings from Xcode Instruments profiling (render time, memory, FPS) into a report", + "source_line": null + }, + { + "name": "Create Benchmark Metrics Report", + "description": "Document baseline metrics for build time, binary size, memory footprint, FPS and performance of BoxTreePattern", + "source_line": null + }, + { + "name": "Compile Cross-Platform Test Results", + "description": "Collect and compile test results across iOS, macOS, iPadOS devices and simulators into a cross\u2011platform report", + "source_line": null + }, + { + "name": "Finalize Accessibility Sign-Off", + "description": "Complete manual accessibility testing and final sign-off on VoiceOver, keyboard navigation etc.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4383, + "line_count": 75 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/next_tasks_metrics.json new file mode 100644 index 00000000..d5dcd806 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/208_T6_2_CLI_Corruption_Summary_Output/next_tasks.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run the lenient-versus-strict benchmark on macOS hardware with Combine enabled using a 1 GiB fixture and archive performance metrics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Export ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, invoke swift test with specified filter, archive runtime and RSS metrics under Documentation/Performance/, cross-check against Linux baseline log, and note deviations in summary log.", + "source_line": null + }, + { + "type": "invariant", + "description": "The archived macOS benchmark results must be stored alongside existing 32 MiB results in Documentation/Performance/.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend CLI output to show corruption summary metrics using Task T6.2 implementation, depending on Task T2.3 metrics aggregation functions ParseIssueStore.metricsSnapshot() and makeIssueSummary().", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Lenient vs Strict Benchmark Execution", + "description": "Run the lenient-versus-strict benchmark on macOS hardware with Combine enabled using a 1 GiB fixture and capture runtime and RSS metrics.", + "source_line": null + }, + { + "name": "Benchmark Results Archival", + "description": "Archive printed runtime and RSS metrics under Documentation/Performance alongside existing 32 MiB results.", + "source_line": null + }, + { + "name": "Cross-Check Benchmark Results", + "description": "Compare macOS benchmark results against archived Linux baseline and note deviations in the summary log.", + "source_line": null + }, + { + "name": "CLI Corruption Summary Output Extension", + "description": "Extend CLI output to show corruption summary metrics, including strict success, lenient without issues, and lenient with mixed\u2011severity issues.", + "source_line": null + }, + { + "name": "Metrics Aggregation Dependency", + "description": "Use Task T2.3 metrics aggregation via ParseIssueStore.metricsSnapshot() / makeIssueSummary() for CLI corruption summary.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1245, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/209_T5_5_Fuzzing_Harness_metrics.json b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/209_T5_5_Fuzzing_Harness_metrics.json new file mode 100644 index 00000000..a26edb94 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/209_T5_5_Fuzzing_Harness_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/209_T5_5_Fuzzing_Harness.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build an automated fuzzing harness that exercises tolerant parsing against 100+ synthetically corrupted MP4 fixtures and demonstrates a 99.9% crash\u2011free completion rate so lenient mode can ship with confidence.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "An XCTest-driven fuzz suite generates or mutates \u2265100 corrupt payloads per run and feeds them through the tolerant parsing pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Harness reports aggregate completion statistics and asserts that all cases complete without crashes or unexpected fatal errors (\u226599.9% success for the batch).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Failures capture reproduction artifacts (seed, mutation description, minimal repro payload) for archival under `Documentation/CorruptedFixtures/` when encountered.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI configuration executes the fuzz suite on Linux runners without timeouts, keeping total runtime within the existing benchmark budget.", + "source_line": null + }, + { + "type": "invariant", + "description": "The tolerant parsing pipeline must be forced into tolerant mode via ParsePipeline.Options and clamp issue budgets so runaway corruption still terminates; strict mode remains unaffected by running a small control sample.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a dedicated test target module (e.g., `TolerantParsingFuzzTests`) that iterates over generated cases inside a single XCTest, recording completion counts and measuring guard coverage.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the CorruptFixtureBuilder utilities from Task T5.1 archives to seed base payloads, then apply deterministic mutations driven by seeded RandomNumberGenerator so failures are reproducible.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Emit structured diagnostics (seed, mutation kind, offsets) via XCTAttachment for any failure and optionally persist the offending payload using existing fixture manifest helpers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update documentation trackers once the harness lands so stakeholders know crash\u2011free validation is covered.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "XCTest-Driven Fuzz Suite", + "description": "Automated test harness that generates or mutates \u2265100 corrupt MP4 payloads per run and feeds them through the tolerant parsing pipeline.", + "source_line": null + }, + { + "name": "CorruptFixtureBuilder Integration", + "description": "Utility module reusing CorruptFixtureBuilder to seed base payloads and apply deterministic mutations driven by seeded RNGs for reproducible failures.", + "source_line": null + }, + { + "name": "Tolerant Parsing Pipeline Configuration", + "description": "Integration with ParsePipeline.Options to force tolerant mode, clamp issue budgets, and ensure strict mode remains unaffected via control sample.", + "source_line": null + }, + { + "name": "Failure Artifact Capture", + "description": "On failure, captures reproduction artifacts (seed, mutation description, minimal repro payload) and persists them under Documentation/CorruptedFixtures/ using XCTAttachment and fixture manifest helpers.", + "source_line": null + }, + { + "name": "CI Execution Configuration", + "description": "Configures CI to run the fuzz suite on Linux runners without timeouts, keeping total runtime within benchmark budget.", + "source_line": null + }, + { + "name": "Guard Coverage Measurement", + "description": "Records completion counts and measures traversal guard coverage during each test run.", + "source_line": null + }, + { + "name": "Documentation Update Tracker", + "description": "Updates documentation trackers once harness lands so stakeholders know crash-free validation is covered.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3086, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work_T5.5_metrics.json b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work_T5.5_metrics.json new file mode 100644 index 00000000..cdd4fd8d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work_T5.5_metrics.json @@ -0,0 +1,193 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work_T5.5.md", + "n_spec": 10, + "n_func": 26, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build an automated fuzzing harness that exercises tolerant parsing against 100+ synthetically corrupted MP4 fixtures and demonstrates a 99.9% crash\u2011free completion rate so lenient mode can ship with confidence.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The fuzzing harness must generate at least 100 corrupt payloads per run using deterministic mutations seeded with 42, assert a success rate of \u226599.9%, capture reproduction artifacts for any failures, and complete within a 5\u2011minute CI budget.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All mutation coverage tests (header truncation, overlapping ranges, bogus size) must pass with 20 iterations each.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reproduction artifacts must be saved as JSON metadata and binary payload in Documentation/CorruptedFixtures/FuzzArtifacts/, including seed, mutation description, error message, and exact corrupt payload.", + "source_line": null + }, + { + "type": "invariant", + "description": "Deterministic mutations use a seeded RNG (seed 42) to ensure reproducibility of failures.", + "source_line": null + }, + { + "type": "invariant", + "description": "The fuzzing harness must integrate with existing tolerant parsing pipeline ParsePipeline.live(options: .tolerant), ParseIssueStore, and ChunkedFileReader.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a single XCTestCase class TolerantParsingFuzzTests.swift containing four test methods for core fuzz, mutation coverage, CI budget, and artifact capture.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement CorruptPayloadGenerator with six mutation types: header truncation, overlapping ranges, bogus size, invalid FourCC, zero\u2011size loop, payload truncation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce FuzzStatistics struct to track success/failure counts and generate human\u2011readable summary.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use ReproductionArtifact struct and saveReproductionArtifact() helper to automatically capture artifacts for failures.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "TolerantParsingFuzzTests", + "description": "XCTestCase providing fuzzing harness for tolerant parsing against corrupted MP4 payloads", + "source_line": null + }, + { + "name": "testFuzzTolerantParsingWith100PlusCorruptPayloads", + "description": "Core test generating 100+ deterministic corrupt payloads, asserting \u226599.9% crash-free rate and capturing reproduction artifacts", + "source_line": null + }, + { + "name": "testHeaderTruncationMutations", + "description": "Mutation coverage test for header truncation scenarios (20 iterations)", + "source_line": null + }, + { + "name": "testOverlappingRangeMutations", + "description": "Mutation coverage test for overlapping parent-child range violations (20 iterations)", + "source_line": null + }, + { + "name": "testBogusSizeMutations", + "description": "Mutation coverage test for impossibly large size declarations (20 iterations)", + "source_line": null + }, + { + "name": "testFuzzHarnessCompletesWithinBenchmarkBudget", + "description": "CI integration test validating runtime within 5\u2011minute budget using a subset of iterations", + "source_line": null + }, + { + "name": "CorruptPayloadGenerator", + "description": "Deterministic mutation engine producing six types of MP4 corruption mutations", + "source_line": null + }, + { + "name": "HeaderTruncationMutation", + "description": "Incomplete box header mutation (1\u20133 bytes) applied by CorruptPayloadGenerator", + "source_line": null + }, + { + "name": "OverlappingRangeMutation", + "description": "Child boxes exceeding parent boundaries mutation", + "source_line": null + }, + { + "name": "BogusSizeMutation", + "description": "Impossibly large size declaration mutation", + "source_line": null + }, + { + "name": "InvalidFourCCMutation", + "description": "Non\u2011ASCII four\u2011character code mutation", + "source_line": null + }, + { + "name": "ZeroSizeLoopMutation", + "description": "Multiple zero\u2011size children to trigger loop guards", + "source_line": null + }, + { + "name": "PayloadTruncationMutation", + "description": "Declared size larger than actual payload mutation", + "source_line": null + }, + { + "name": "FuzzStatistics", + "description": "Struct aggregating success/failure counts, rates and detailed failure records", + "source_line": null + }, + { + "name": "ReproductionArtifact", + "description": "Struct holding metadata and binary payload for reproducing failures", + "source_line": null + }, + { + "name": "saveReproductionArtifact", + "description": "Helper to persist JSON metadata and MP4 payload for a failed case", + "source_line": null + }, + { + "name": "SeededRandomNumberGenerator", + "description": "LCG based RNG providing deterministic seeds for fuzzing", + "source_line": null + }, + { + "name": "CorruptPayload", + "description": "Wrapper combining binary data with mutation metadata", + "source_line": null + }, + { + "name": "MutationDescription", + "description": "Codable description of applied mutation", + "source_line": null + }, + { + "name": "ParseResult", + "description": "Aggregates completion status, event count and issue count", + "source_line": null + }, + { + "name": "ParsePipeline.live(\".tolerant\")", + "description": "Existing tolerant parsing pipeline used by the fuzz harness", + "source_line": null + }, + { + "name": "ParseIssueStore", + "description": "Issue aggregation store for collecting parse issues during tests", + "source_line": null + }, + { + "name": "ChunkedFileReader", + "description": "Binary reader used to read input payloads in chunks", + "source_line": null + }, + { + "name": "Documentation/CorruptedFixtures/FuzzArtifacts/.gitignore", + "description": "Git\u2011ignored file excluding auto\u2011generated artifacts from version control", + "source_line": null + }, + { + "name": "Documentation/CorruptedFixtures/FuzzArtifacts/README.md", + "description": "Guide for artifact reproduction and cleanup", + "source_line": null + }, + { + "name": "Summary_of_Work_T5.5", + "description": "Document summarizing the work done and success criteria met", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9395, + "line_count": 258 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work_metrics.json new file mode 100644 index 00000000..39d72a27 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/Summary_of_Work.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "The tolerant parsing fuzzing harness must achieve a crash\u2011free completion rate of at least 99.9% across all generated MP4 payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All 100+ synthetic corrupted MP4 payloads are automatically generated and each iteration is executed with the CI integration test validating benchmark budget.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want the tolerant parsing fuzzing harness to generate deterministic mutation types (header truncation, overlapping ranges, bogus size declarations, invalid FourCC, zero\u2011size loop guards, payload truncation) so that I can validate ISOInspectorKit\u2019s resilience.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The reproduction artifact capture system will automatically save artifacts to Documentation/CorruptedFixtures/FuzzArtifacts/, including JSON metadata (seed, mutation, error) and the binary payload, with .gitignore and README.md documentation.", + "source_line": null + }, + { + "type": "invariant", + "description": "All test files must follow TDD workflow, PDD principles, XP practices, and AI code structure guidelines (e.g., 474 lines, one entity per file).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Fuzzing Harness", + "description": "Automated generation and execution of over 100 synthetically corrupted MP4 payloads to test parser resilience, ensuring \u226599.9% crash-free completion.", + "source_line": null + }, + { + "name": "Corrupt Payload Generator", + "description": "Deterministic mutation engine producing six types of corrupt MP4 headers/payloads (header truncation, overlapping ranges, bogus size declarations, invalid FourCC, zero-size loop guards, payload truncation).", + "source_line": null + }, + { + "name": "Reproduction Artifact Capture System", + "description": "Automatically saves corrupted test artifacts with JSON metadata (seed, mutation, error) and binary payload to Documentation/CorruptedFixtures/FuzzArtifacts/. ", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2564, + "line_count": 52 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/blocked_metrics.json b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/blocked_metrics.json new file mode 100644 index 00000000..87685660 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/blocked_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/blocked.md", + "n_spec": 13, + "n_func": 7, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blocker status changes to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be granted before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark once macOS hardware with the 1\u202fGiB performance fixture becomes available in the automation environment.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS hardware with a 1\u202fGiB performance fixture must be present in the current automation environment before running the benchmark.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines for FoundationUI Phase\u00a05.2 after manual profiling and benchmarking tasks are completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All manual profiling steps (render time <100\u202fms, memory allocation <5\u202fMB, 60\u202fFPS on device) must be documented in a performance report before publishing baselines.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance benchmarks for FoundationUI Phase\u00a05.2 after multi\u2011platform testing is completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time must be <10s for a clean build, binary size <500KB release, memory footprint <5MB per screen, 60\u202fFPS during interactions, and BoxTreePattern with 1000+ nodes must perform within acceptable limits before CI integration.", + "source_line": null + }, + { + "type": "user_story", + "description": "Compile cross\u2011platform test results and create a cross\u2011platform report after testing on iOS\u00a017+, macOS\u00a014+, and iPadOS\u00a017+ devices and simulators is finished.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All listed device configurations, dark mode, RTL language, and locale/region tests must be executed before compiling the report.", + "source_line": null + }, + { + "type": "user_story", + "description": "Achieve final accessibility sign\u2011off for FoundationUI after manual VoiceOver, keyboard navigation, dynamic type, reduce motion, contrast, and bold text testing is completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Manual accessibility testing must confirm 98%+ accessibility score and cover all edge cases before final sign\u2011off.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Assets", + "description": "Import licensed media assets and refresh regression baselines for tolerant parsing and export validation", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run lenient vs strict benchmark on macOS with 1 GiB payload, collect runtime and RSS metrics, archive results", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish performance baseline data in PERFORMANCE.md after profiling", + "source_line": null + }, + { + "name": "Generate Performance Report", + "description": "Document findings from Xcode Instruments profiling (render time, memory, FPS) into a report", + "source_line": null + }, + { + "name": "Create Benchmark Metrics Report", + "description": "Record benchmark metrics such as build time, binary size, memory footprint, FPS and BoxTreePattern performance", + "source_line": null + }, + { + "name": "Compile Cross-Platform Test Results", + "description": "Collect and compile test results across iOS, mac\u2011to\u00ads\u00a0and iPadOS for a cross\u2011platform report", + "source_line": null + }, + { + "name": "Finalize Accessibility Sign-Off", + "description": "Complete manual accessibility testing and finalise\u00a0the\u00a0\u2026", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4383, + "line_count": 75 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/next_tasks_metrics.json new file mode 100644 index 00000000..7368adb2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/209_T5_5_Tolerant_Parsing_Fuzzing_Harness/next_tasks.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run the lenient-versus-strict benchmark on macOS hardware with Combine enabled using the 1\u202fGiB fixture", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Export ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824 before running the test", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Invoke swift test --filter LargeFileBenchmarkTests/testCLIValidationLenientModePerformanceStaysWithinToleranceBudget", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Archive the printed runtime and RSS metrics under Documentation/Performance/ alongside the existing 32\u202fMiB results", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Cross\u2011check results against the archived Linux baseline in Documentation/Performance/2025-11-04-lenient-vs-strict-benchmark.log and note deviations in the summary log", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Run lenient-versus-strict benchmark on macOS", + "description": "Execute the performance test for large file handling in lenient mode and compare against tolerance budget", + "source_line": null + }, + { + "name": "Export benchmark payload size variable", + "description": "Set environment variable ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES to 1 GiB before running tests", + "source_line": null + }, + { + "name": "Invoke specific Swift test case", + "description": "Run swift test with filter LargeFileBenchmarkTests/testCLIValidationLenientModePerformanceStaysWithinToleranceBudget", + "source_line": null + }, + { + "name": "Archive runtime and RSS metrics", + "description": "Store printed performance metrics in Documentation/Performance alongside existing 32 MiB results", + "source_line": null + }, + { + "name": "Cross-check against Linux baseline", + "description": "Compare macOS benchmark results to archived Linux log file and record deviations in summary log", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 608, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/Summary_of_Work_metrics.json new file mode 100644 index 00000000..346a634b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/Summary_of_Work.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Hook the outline explorer to actual file import and streaming parse sessions so snapshots arrive from user-selected MP4 files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline explorer must display snapshots that are generated from user-selected MP4 files via streaming parse sessions.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend outline filters to cover box categories and streaming metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline filters should include options for box categories and streaming metadata as tracked by @todo #6.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tree View Virtualization & Search", + "description": "Provides a virtualized tree view of parsed data with search and severity filtering capabilities", + "source_line": null + }, + { + "name": "Combine-driven Outline View Model", + "description": "Manages outline data using Combine for reactive updates", + "source_line": null + }, + { + "name": "SwiftUI Explorer Surfaces", + "description": "Renders the explorer UI using SwiftUI, including virtualization via LazyVStack and severity toggles", + "source_line": null + }, + { + "name": "Parse State Badges", + "description": "Displays badges indicating the parse state of items in the tree view", + "source_line": null + }, + { + "name": "Preview Hierarchy Data Seeding", + "description": "Seeds preview data so the explorer can render without a live parse pipeline", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 738, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/next_tasks_metrics.json new file mode 100644 index 00000000..8a8ef86a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/20_C2_Tree_View_Virtualization_Follow_Up/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Kick off C2 \u2013 Tree view rendering using the new ParseTreeStore snapshots (outline UI, search, filters).", + "source_line": null + }, + { + "type": "user_story", + "description": "Draft C3 detail/hex stores that subscribe to the Combine bridge for payload slices and metadata panels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrate the outline explorer with real file ingestion so parsing drives live snapshot updates.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tree View Rendering", + "description": "Render a tree view UI using ParseTreeStore snapshots, including outline display, search, and filters.", + "source_line": null + }, + { + "name": "C3 Detail/Hex Stores", + "description": "Provide detail and hex data stores that subscribe to the Combine bridge for payload slices and metadata panels.", + "source_line": null + }, + { + "name": "Outline Explorer Integration with File Ingestion", + "description": "Integrate the outline explorer so that file ingestion triggers parsing and live snapshot updates.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 349, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/210_T5_3_UI_Corruption_Smoke_Tests_metrics.json b/DOCS/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/210_T5_3_UI_Corruption_Smoke_Tests_metrics.json new file mode 100644 index 00000000..62cc9b38 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/210_T5_3_UI_Corruption_Smoke_Tests_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/210_T5_3_UI_Corruption_Smoke_Tests.md", + "n_spec": 12, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Develop automated UI smoke tests that verify corruption indicators (badges, placeholders, detail diagnostics) render correctly in the ISOInspector app when tolerant parsing detects issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI automation tests load corrupt fixtures and assert the warning ribbon, corruption badges, and placeholder nodes appear with the correct accessibility labels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity summary views expose the aggregate issue list for the loaded fixture and the tests validate representative rows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests confirm that selecting nodes reveals the Corruption detail section populated with offsets and reason codes sourced from ParseIssueStore.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test suite passes locally (swift test) and integrates into CI without flakiness, using fixtures or previews available in the repository.", + "source_line": null + }, + { + "type": "invariant", + "description": "No FoundationUI deliverables are involved; this work targets the primary ISOInspector app test suite.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse or extend existing UI automation infrastructure under Tests/ISOInspectorUITests (e.g., ParseTreeStreamingSelectionAutomationTests) to open fixtures and interact with the Integrity tab.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reference manifest metadata from Fixtures/Corrupted/manifest.json to drive expectations for badge counts and placeholder presence.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure automation waits for streaming parse completion; consider existing Combine publishers or view model states to synchronize assertions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Cover at least one case each for: corrupt node badge, missing-child placeholder, and aggregate Integrity list entry.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with tolerance parsing exports to reuse shared helper functions (Tests/ISOInspectorKitTests/Helpers/FixtureLoading.swift) if UI tests need to verify textual content.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update documentation after landing to mark T5.3 complete and archive PRD.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Warning Ribbon Rendering", + "description": "UI component that displays a warning ribbon when tolerant parsing detects corruption in the ISOInspector app.", + "source_line": null + }, + { + "name": "Corruption Badge Display", + "description": "Badge UI element shown on corrupt nodes indicating the presence of corruption issues.", + "source_line": null + }, + { + "name": "Placeholder Node Rendering", + "description": "UI placeholder elements inserted for missing or corrupted child nodes during parsing.", + "source_line": null + }, + { + "name": "Integrity Summary Tab View", + "description": "Tab that aggregates and lists all detected corruption issues for a loaded fixture.", + "source_line": null + }, + { + "name": "Corruption Detail Section", + "description": "Detail pane showing offsets, reason codes, and other information for selected corrupt nodes.", + "source_line": null + }, + { + "name": "UI Automation Test Suite for Corrupt Fixtures", + "description": "Automated tests that load corrupted fixtures, interact with UI components, and assert correct rendering and accessibility labels.", + "source_line": null + }, + { + "name": "Fixture Loading Helper Functions", + "description": "Shared utilities to load fixture data and manifest metadata for use in UI tests.", + "source_line": null + }, + { + "name": "Synchronization Mechanism for Streaming Parse Completion", + "description": "Logic to wait for parsing streams to finish before asserting UI state, using Combine publishers or view model states.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3114, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/Summary_of_Work_metrics.json new file mode 100644 index 00000000..40103163 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/Summary_of_Work_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/210_T5_3_UI_Corruption_Smoke_Tests/Summary_of_Work.md", + "n_spec": 15, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Validate UI corruption indicators (badges, warning ribbons, integrity summaries, and detail diagnostics) render correctly when tolerant parsing detects issues in corrupt MP4 fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Corruption badge displays \"Corrupted\" with error level and accessibility label \"Corrupted status\" for corrupt nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Partial badge displays \"Partial\" with warning level and accessibility label \"Partial status\" for partially corrupted nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No corruption badge is displayed for valid nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "IntegritySummaryViewModel displays corruption issues such as payload.truncated and guard.zero_size_loop.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity summary offsets are sorted based on offset values for corruption issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Corruption detail section populates with issue offsets, reason codes, and severity from ParseIssueStore.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Warning ribbon accessibility labels are derived from ParseIssueStore.IssueMetrics structure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No warning ribbon appears when no issues are present.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration test processes all smoke fixtures (truncated-moov.mp4, zero-length-loop.mp4, deep-recursion.mp4) and verifies nodes with issues have non\u2011valid status, badge descriptors created for corrupt nodes, and expected issue codes in ParseIssueStore.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility labels for corruption indicators match specified strings: \"Corrupted status\", \"Partial status\", and warning ribbon text.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseTreeStore state management must consistently reflect parse tree and issues across tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "IntegritySummaryViewModel must always expose an aggregate issue list for loaded fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Test suite placed in Tests/ISOInspectorAppTests/UICorruptionIndicatorsSmokeTests.swift with 449 lines of test code.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "CI pipeline integration via xcodebuild test and deterministic fixtures to avoid flakiness.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Corruption Badge Display", + "description": "UI component that shows a badge labeled 'Corrupted' or 'Partial' on nodes with corruption issues and provides accessibility labels.", + "source_line": null + }, + { + "name": "Integrity Summary View Model", + "description": "View model that aggregates and sorts corruption issues for display in an integrity summary list, including payload truncation and guard loop errors.", + "source_line": null + }, + { + "name": "Corruption Detail Section", + "description": "UI section within a node detail view that lists issue offsets, reason codes, and severity from the parse issue store.", + "source_line": null + }, + { + "name": "Warning Ribbon Component", + "description": "UI ribbon that appears when corruption issues are detected, displaying counts and deepest affected depth with an accessibility label.", + "source_line": null + }, + { + "name": "ParseTreeStore State Management", + "description": "Central state store for the parse tree and associated corruption issues used by UI components.", + "source_line": null + }, + { + "name": "ParseIssueStore.IssueMetrics", + "description": "Data structure providing metrics for warning ribbon content such as issue counts and depth information.", + "source_line": null + }, + { + "name": "Integration Test Suite UICorruptionIndicatorsSmokeTests", + "description": "Automated test suite that verifies badge, summary, detail, and ribbon behavior against corrupt MP4 fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5513, + "line_count": 112 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/PRD_metrics.json b/DOCS/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/PRD_metrics.json new file mode 100644 index 00000000..6634b004 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/PRD_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/PRD.md", + "n_spec": 11, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "SDK consumers can opt into tolerant parsing via ISOInspectorKit.ParseOptions and use corruption-resilient parsing in their applications.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SDK documentation is created for tolerant parsing (TolerantParsingGuide.md) with at least 3 working code examples: basic setup, accessing corruption metrics from ParseIssueStore, comparing strict vs. tolerant behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline.Options, .strict and .tolerant presets have inline documentation with usage notes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation explains when to use tolerant mode and how to interpret ParseIssue results.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Article is linked from main ISOInspectorKit.docc/Documentation.md Topics section.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "swift package generate-documentation succeeds and renders the new guide without errors.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParsePipeline.Options API must remain public with .strict and .tolerant presets available.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add DocC comments to ParsePipeline.Options struct in ISOInspectorKit/ISO/ParsePipeline.swift.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create new article TolerantParsingGuide.md under Sources/ISOInspectorKit/ISOInspectorKit.docc/Articles with specified sections and code samples.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update main catalog Documentation.md to add a new \"Tolerant Parsing\" topic linking to .", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create executable test examples in Tests/ISOInspectorKitTests/Examples/TolerantParsingExamples.swift and documentation tests in Tests/ISOInspectorKitTests/Documentation/TolerantParsingDocTests.swift to verify code samples compile and run.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParsePipeline.Options API", + "description": "Public struct exposing parsing configuration options such as strict and tolerant presets, abortOnStructuralError, maxCorruptionEvents, payloadValidationLevel.", + "source_line": null + }, + { + "name": "ParsePipeline.init(options:) initializer", + "description": "Creates a ParsePipeline instance with specified options for non\u2011live parsing contexts.", + "source_line": null + }, + { + "name": "ParsePipeline.live(options:) initializer", + "description": "Creates a live ParsePipeline configured with the given options for streaming or real\u2011time parsing.", + "source_line": null + }, + { + "name": "TolerantParsingGuide documentation article", + "description": "DocC article explaining tolerant parsing, usage scenarios, setup examples, and best practices.", + "source_line": null + }, + { + "name": "Documentation.md topic link to Tolerant Parsing guide", + "description": "Adds a reference in the main ISOInspectorKit documentation catalog linking to the new guide.", + "source_line": null + }, + { + "name": "Inline DocC comments for ParsePipeline.Options", + "description": "Provides API reference documentation for options struct and its presets within source code.", + "source_line": null + }, + { + "name": "Code examples in TolerantParsingGuide", + "description": "Swift snippets demonstrating basic tolerant setup, accessing ParseIssueStore metrics, and comparing strict vs. tolerant behavior.", + "source_line": null + }, + { + "name": "ParseIssueStore integration example", + "description": "Shows how to attach a ParseIssueStore to the parsing context and query issues by severity.", + "source_line": null + }, + { + "name": "Custom options configuration example", + "description": "Illustrates modifying tolerant preset properties like maxCorruptionEvents and maxTraversalDepth before creating a pipeline.", + "source_line": null + }, + { + "name": "Test file TolerantParsingDocTests.swift", + "description": "Executable tests that compile and run the documentation code samples against corrupt media fixtures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7062, + "line_count": 172 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..67f1a616 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/Summary_of_Work_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/211_T6_3_SDK_Tolerant_Parsing_Documentation/Summary_of_Work.md", + "n_spec": 7, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a third\u2011party developer I want to opt into tolerant parsing via ParsePipeline.Options so that my application can parse corrupted media files and collect corruption metrics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SDK documentation includes a TolerantParsingGuide.md article with 5+ working code examples covering basic setup, accessing issues, filtering by severity, custom options configuration, and strict vs tolerant comparison.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParsePipeline.Options has comprehensive inline DocC comments for all properties, presets (.strict and .tolerant), and PayloadValidationLevel enum cases.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Documentation.md Topics section contains a new \"Tolerant Parsing\" topic linking to the guide article.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test file TolerantParsingDocTests.swift verifies that all documented code patterns compile, execute correctly, and match preset values.", + "source_line": null + }, + { + "type": "invariant", + "description": "ParsePipeline.Options.tolerant preset must not alter any existing public API behavior beyond enabling tolerant parsing mode.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Documentation is structured using DocC markdown with Topics organization to improve discoverability of tolerant parsing features.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "TolerantParsingGuide Article", + "description": "DocC article providing overview, use cases, setup, issue access, advanced config, best practices for tolerant parsing", + "source_line": null + }, + { + "name": "ParsePipeline.Options API", + "description": "Public struct exposing configuration options for parsing pipelines, including presets .strict and .tolerant", + "source_line": null + }, + { + "name": "ParsePipeline.live(options:) Method", + "description": "Creates a ParsePipeline instance configured with given Options", + "source_line": null + }, + { + "name": "ParseIssueStore Component", + "description": "Stores and queries ParseIssue objects collected during parsing", + "source_line": null + }, + { + "name": "ParseIssue Representation", + "description": "Individual issue object containing severity, code, message, byte range", + "source_line": null + }, + { + "name": "Documentation.md Topics Section", + "description": "Catalog entry linking to TolerantParsingGuide article", + "source_line": null + }, + { + "name": "Code Examples in Documentation", + "description": "Five+ copy\u2011paste ready snippets demonstrating tolerant parsing usage and issue handling", + "source_line": null + }, + { + "name": "Test Suite TolerantParsingDocTests", + "description": "Automated tests verifying documented API patterns, preset values, and issue querying", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9142, + "line_count": 252 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/212_I0_1_Add_FoundationUI_Dependency_metrics.json b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/212_I0_1_Add_FoundationUI_Dependency_metrics.json new file mode 100644 index 00000000..f0b8c646 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/212_I0_1_Add_FoundationUI_Dependency_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/212_I0_1_Add_FoundationUI_Dependency.md", + "n_spec": 7, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add FoundationUI as a Swift Package dependency to ISOInspectorApp and verify successful builds with the new target, establishing foundation for UI component migration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI added as dependency in Package.swift under ISOInspectorApp target.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Package resolves successfully: swift package resolve completes without errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Clean build succeeds: swift build completes for all platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test build succeeds: swift test compiles without errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Platform requirements validated: macOS 13+, iOS/iPadOS 16+, no conflicts with existing dependencies.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI imports work in app targets (import FoundationUI compiles).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Dependency Management", + "description": "Adds FoundationUI as a Swift Package dependency to ISOInspectorApp and ensures all targets can import it.", + "source_line": null + }, + { + "name": "Package Resolution Verification", + "description": "Runs swift package resolve to fetch and validate the FoundationUI package without errors.", + "source_line": null + }, + { + "name": "Build Verification Across Platforms", + "description": "Compiles ISOInspectorApp for macOS, iOS, and iPadOS using swift build, ensuring no build failures.", + "source_line": null + }, + { + "name": "Test Build Verification", + "description": "Compiles test targets with swift test, confirming that tests compile successfully.", + "source_line": null + }, + { + "name": "Import Verification Test", + "description": "Creates a minimal test file to import FoundationUI and access basic components like DS.Badge.", + "source_line": null + }, + { + "name": "Platform Requirements Validation", + "description": "Checks that the app meets minimum macOS 13+ and iOS/iPadOS 16+ requirements and updates if needed.", + "source_line": null + }, + { + "name": "CI/CD Pipeline Integration", + "description": "Ensures the CI/CD pipeline passes with the new FoundationUI dependency added.", + "source_line": null + }, + { + "name": "SwiftLint Compliance Check", + "description": "Runs swiftlint to verify no lint violations are introduced by adding the dependency.", + "source_line": null + }, + { + "name": "Documentation Updates", + "description": "Updates README, changelog and developer onboarding docs to reflect the foundation UI integration.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6624, + "line_count": 182 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Planning_Complete_metrics.json b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Planning_Complete_metrics.json new file mode 100644 index 00000000..ec50f888 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Planning_Complete_metrics.json @@ -0,0 +1,158 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Planning_Complete.md", + "n_spec": 15, + "n_func": 14, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI into ISOInspectorApp gradually, starting with small components and scaling up.", + "source_line": null + }, + { + "type": "user_story", + "description": "Maintain backward compatibility so old and new UI coexist during integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All phase tasks complete before proceeding to next phase.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests pass with coverage \u226580% per phase.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot regression tests pass on all platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility audit score \u226595% (WCAG 2.1 AA).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero SwiftLint violations after code review.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Performance baselines met with no regressions.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI components must be fully tested before integration.", + "source_line": null + }, + { + "type": "invariant", + "description": "No magic numbers; all design tokens used from FoundationUI.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a phased 6\u2011phase integration roadmap (Phases\u00a00\u20136) with quality gates.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement a testing pyramid: 70% unit, 20% integration, 10% E2E.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Adopt WCAG\u00a02.1 AA accessibility compliance as cross\u2011cutting requirement.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Support macOS/iOS/iPadOS platforms with platform\u2011aware adaptations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Document integration patterns and success criteria in FoundationUI_Integration_Strategy.md.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Integration Strategy Document", + "description": "Detailed phased roadmap for integrating FoundationUI into ISOInspectorApp, including phases, subtasks, testing strategy, quality metrics, and risk assessment.", + "source_line": null + }, + { + "name": "Phase 0 Setup & Verification Tasks", + "description": "Initial setup tasks such as adding FoundationUI dependency, creating integration test suite, building component showcase, documenting patterns, and updating design system guide.", + "source_line": null + }, + { + "name": "Phase 1 Foundation Components Integration", + "description": "Integration of core FoundationUI components into the app with unit tests, snapshot tests, accessibility checks, and performance baselines.", + "source_line": null + }, + { + "name": "Phase 2 Interactive Components Integration", + "description": "Adding interactive FoundationUI components to the app, ensuring functionality across platforms and compliance with testing and accessibility standards.", + "source_line": null + }, + { + "name": "Phase 3 Layout Patterns Implementation", + "description": "Implementing layout patterns from FoundationUI, including complex UI arrangements, with comprehensive testing and performance monitoring.", + "source_line": null + }, + { + "name": "Phase 4 Platform Adaptation", + "description": "Adapting FoundationUI components for macOS, iOS, and iPadOS specific behaviors such as keyboard shortcuts, hover effects, and layout differences.", + "source_line": null + }, + { + "name": "Phase 5 Advanced Features Integration", + "description": "Incorporating advanced FoundationUI features like documentation, QA hooks, and extended component capabilities into the app.", + "source_line": null + }, + { + "name": "Phase 6 Full Integration & Validation", + "description": "Final integration phase validating all components, running full test suite, ensuring WCAG 2.1 AA compliance, performance budgets, and publishing migration guide.", + "source_line": null + }, + { + "name": "Integration Test Suite", + "description": "Automated tests covering unit, snapshot, accessibility, performance, and integration scenarios for FoundationUI integration.", + "source_line": null + }, + { + "name": "Component Showcase Application", + "description": "A showcase app demonstrating all integrated FoundationUI components for development velocity and testing.", + "source_line": null + }, + { + "name": "Design System Architecture Documentation", + "description": "Technical spec section detailing FoundationUI layers, integration patterns, quality metrics, and platform adaptations.", + "source_line": null + }, + { + "name": "Accessibility Audit Tooling", + "description": "Automated accessibility tests ensuring WCAG 2.1 AA compliance across all platforms.", + "source_line": null + }, + { + "name": "Performance Monitoring Suite", + "description": "Tools and tests measuring app launch time, tree scroll FPS, memory usage to enforce performance budgets.", + "source_line": null + }, + { + "name": "Documentation Updates (next_tasks.md, Summary_of_Work.md)", + "description": "Updated task queues and project status documents reflecting integration plan progress.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 16075, + "line_count": 493 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Strategy_metrics.json b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Strategy_metrics.json new file mode 100644 index 00000000..392fe97e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Strategy_metrics.json @@ -0,0 +1,348 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/FoundationUI_Integration_Strategy.md", + "n_spec": 48, + "n_func": 19, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI into ISOInspectorApp gradually and phasically starting with small components.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add FoundationUI Swift Package dependency to ISOInspectorApp target.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ISOInspectorApp builds successfully with FoundationUI dependency added.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create integration test suite for FoundationUI in ISOInspectorApp.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration test suite structure is established under Tests/ISOInspectorAppTests/FoundationUI/.", + "source_line": null + }, + { + "type": "user_story", + "description": "Build Component Showcase SwiftUI view to incrementally test UI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Component Showcase renders all FoundationUI components without crashes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document FoundationUI integration patterns in technical specification.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Technical spec updated with \"FoundationUI Integration Patterns\" section.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update design system guide with integration checklist for FoundationUI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Design System Guide includes new integration checklist.", + "source_line": null + }, + { + "type": "user_story", + "description": "Consolidate manual badge implementations into DS.Badge and DS.Indicator components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All manual badges replaced with DS.Badge; all status indicators use DS.Indicator.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit test coverage for badge/indicator variants is \u226590%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests pass for light/dark modes and all four status levels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility score for badges/indicators is \u226598%.", + "source_line": null + }, + { + "type": "user_story", + "description": "Migrate details panel container styling to DS.Card and DS.SectionHeader components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All container styling uses DS.Card; all section headers use DS.SectionHeader.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No manual padding or corner magic numbers; spacing uses DS.Spacing tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dark mode is fully functional for card and section components.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace metadata display with DS.KeyValueRow component.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All metadata displayed via DS.KeyValueRow with consistent spacing using DS tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Copyable action integrated into key-value rows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test coverage for key-value row variants is \u226585%.", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate DS.CopyableText and DS.Copyable wrappers for copy functionality across metadata values, hex viewer addresses, and other text fields.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Copy works on macOS, iOS, and iPadOS with correct keyboard shortcuts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Visual feedback appears upon copying.", + "source_line": null + }, + { + "type": "user_story", + "description": "Apply DS.InteractiveStyle modifier to clickable rows, tree controls, and toolbar buttons for consistent interaction feedback.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All interactive elements exhibit hover (macOS) or touch (iOS) feedback.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No accessibility conflicts with focus management.", + "source_line": null + }, + { + "type": "user_story", + "description": "Use DS.SurfaceStyle environment key to apply surface material and elevation across primary, detail, and modal surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All surfaces use appropriate SurfaceStyle; shadows render correctly on all platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dark mode shadows are correct and no accessibility violations.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace manual sidebar navigation with DS.SidebarPattern for macOS and iPadOS, providing search/filter integration and keyboard shortcuts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Sidebar pattern works on macOS/iPad; file browser navigation functional; keyboard shortcuts operational.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver and keyboard navigation are fully accessible.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace manual inspector panel layout with DS.InspectorPattern, ensuring fixed header sticky behavior and platform-adaptive spacing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Inspector pattern applied to all detail sections; scroll performance maintained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests pass for heading hierarchy and landmarks.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace manual tree view with DS.BoxTreePattern, implementing lazy rendering, animation, selection highlighting, and virtualized large trees.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tree renders with <16ms per frame; memory stable during expand/collapse.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests for tree appearance\u00a0and VoiceOver navigation are verified.", + "source_line": null + }, + { + "type": "user_story", + "description": "Apply DS.ToolbarPattern to the top toolbar, ensuring adaptive layout across macOS and iOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Toolbar layout adapts; overflow menu functional; accessibility score \u226598%.", + "source_line": null + }, + { + "type": "user_story", + "description": "Use platform adaptation context to apply platform\u2011specific spacing and sizing\u00a0for\u00a0macOS\u00a0and\u00a0iOS\u00a0sized\u00a0by\u00a0the\u00a0environment.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Spacing\u00a0is\u00a0correct\u00a0on\u00a0all\u00a0platforms\u00a0with\u00a0size\u00a0class\u00a0\u2013\u00a0regular\u00a0or\u00a0compact.", + "source_line": null + }, + { + "type": "user_story", + "description": "Apply\u00a0DS.AccessibilityContext\u00a0to\u00a0all\u00a0i18n\u00a0\u2011\u00a0i.e.,\u00a0Reduce\u00a0Motion\u00a0..\u00a0\u2026.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "WCAG\u00a02.1\u00a0AA\u00a0Compliance\u00a0\u2013\u00a0a\u00a0in\u2011\u2010\u00a0..\u00a0..\u00a0..\u00a0..\u00a0..\u00a0..\u00a0We\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Dependency Integration", + "description": "Add FoundationUI Swift package as a dependency to ISOInspectorApp target and ensure build succeeds.", + "source_line": null + }, + { + "name": "Integration Test Suite Setup", + "description": "Create structured integration test directories for FoundationUI components within ISOInspectorAppTests.", + "source_line": null + }, + { + "name": "Component Showcase View", + "description": "Build a SwiftUI view that renders all FoundationUI components for development and testing purposes.", + "source_line": null + }, + { + "name": "FoundationUI Integration Patterns Documentation", + "description": "Document patterns and best practices for integrating FoundationUI into the app in technical specifications.", + "source_line": null + }, + { + "name": "Design System Integration Checklist Update", + "description": "Update design system guide with checklist items for FoundationUI integration.", + "source_line": null + }, + { + "name": "Badge & Status Indicator Wrapper", + "description": "Wrap existing badge logic in DS.Badge and DS.Indicator components, providing reusable views for status badges.", + "source_line": null + }, + { + "name": "Parse Status Indicator Component", + "description": "Create a view that displays parse tree node status using DS.Indicator variants.", + "source_line": null + }, + { + "name": "Unit Tests for Badge/Indicator Variants", + "description": "Provide unit tests covering all badge and indicator states.", + "source_line": null + }, + { + "name": "Snapshot Tests for Badges", + "description": "Generate snapshot tests for light/dark mode and four status levels.", + "source_line": null + }, + { + "name": "Accessibility Tests for Badges", + "description": "Test VoiceOver labels, contrast, focus for badge components.", + "source_line": null + }, + { + "name": "Card Container Wrapper", + "description": "Wrap details panel sections in DS.Card and section headers in DS.SectionHeader.", + "source_line": null + }, + { + "name": "BoxDetailsCard Component", + "description": "Reusable SwiftUI view that encapsulates a DS.Card for detail panels.", + "source_line": null + }, + { + "name": "BoxSectionHeader Component", + "description": "Reusable SwiftUI view that encapsulates a DS.SectionHeader.", + "source_line": null + }, + { + "name": "Unit & Snapshot Tests for Card Variants", + "description": "Test card elevation, material and layout across platforms.", + "source_line": null + }, + { + "name": "Accessibility Tests for Card/Section Header", + "description": "Ensure semantic structure and landmarks for cards and headers.", + "source_line": null + }, + { + "name": "Key-Value Row Wrapper", + "description": "Wrap metadata display using DS.KeyValueRow with ISO-specific formatting.", + "source_line": null + }, + { + "name": "BoxMetadataRow Component", + "description": "Reusable SwiftUI view that implements a copyable key\u2011value row.", + "source_line": null + }, + { + "name": "Unit & Snapshot Tests for Key\u2011Value Rows", + "description": "Test layout variants and copy functionality.", + "source_line": null + }, + { + "name": "Copyable Text Wrapper", + "description": "Use DS.CopyableText or DS.Copycopy?\"", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 34571, + "line_count": 1079 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/Summary_of_Work_metrics.json new file mode 100644 index 00000000..49470f28 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/Summary_of_Work_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/Summary_of_Work.md", + "n_spec": 14, + "n_func": 7, + "intent_atoms": [ + { + "type": "invariant", + "description": "FoundationUI dependency must be declared in Package.swift for ISOInspectorApp", + "source_line": null + }, + { + "type": "invariant", + "description": "ISOInspectorApp targets must import FoundationUI without compile errors", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests verify module import, component availability (Badge, Card, KeyValueRow), BadgeLevel compatibility, design token accessibility, and platform compatibility", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want to add FoundationUI as a dependency so that the app can use its UI components", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a phased integration approach with Phase 0 for setup and verification, followed by subsequent phases for component, layout, platform, and advanced feature integration", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All DS.Spacing tokens must be used instead of hardcoded magic numbers", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test coverage per phase must \u226580%", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility score must \u226598% (WCAG 2.1 AA)", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "App launch time <2s, tree scroll \u226555fps, memory usage <250MB", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI components must coexist with legacy UI during transition", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer or QA engineer, I want to document integration patterns and quality gates in Technical Spec", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updates must reflect current phase and quality gates", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create test infrastructure for 80%+ coverage and 0.5d per phase", + "source_line": null + }, + { + "type": "user_story", + "description": "As a user?\u00a0", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Dependency Integration", + "description": "Adds FoundationUI as a package dependency to ISOInspectorApp and verifies importability.", + "source_line": null + }, + { + "name": "ParseTreeStatusBadge Component Usage", + "description": "Uses the Badge component from FoundationUI in ParseTreeStatusBadge.swift to display status badges.", + "source_line": null + }, + { + "name": "FoundationUI Integration Test Suite", + "description": "Provides automated tests confirming module import, component availability (Badge, Card, KeyValueRow), badge levels, design tokens, and platform compatibility.", + "source_line": null + }, + { + "name": "Component Showcase SwiftUI View", + "description": "A SwiftUI view that demonstrates FoundationUI components for development and testing purposes.", + "source_line": null + }, + { + "name": "Technical Specification Documentation of Integration Patterns", + "description": "Documents patterns and best practices for integrating FoundationUI into the app.", + "source_line": null + }, + { + "name": "Design System Guide Integration Checklist", + "description": "Updates the design system guide with a checklist for integrating FoundationUI components.", + "source_line": null + }, + { + "name": "SDK Tolerant Parsing Documentation", + "description": "Creates DocC article and inline documentation explaining tolerant parsing options in the SDK.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6748, + "line_count": 158 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/blocked_metrics.json b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/blocked_metrics.json new file mode 100644 index 00000000..3e732cf8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/blocked_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/blocked.md", + "n_spec": 14, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blocker status changes to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be granted before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark once macOS hardware with the 1\u202fGiB performance fixture becomes available in the automation environment.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must run with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, collect runtime and RSS metrics, and archive them under Documentation/Performance/.", + "source_line": null + }, + { + "type": "invariant", + "description": "The todo.md entry \"Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark\" remains open until the run completes and metrics are published.", + "source_line": null + }, + { + "type": "user_story", + "description": "Perform manual performance profiling with Xcode Instruments on a macOS developer machine to measure render times, memory usage, and frame rates for FoundationUI Phase\u202f5.2.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Render times must be under 100\u202fms, memory allocations under 5\u202fMB, and Core Animation must verify 60\u202fFPS on device.", + "source_line": null + }, + { + "type": "user_story", + "description": "Perform manual performance benchmarks across iOS\u202f17, macOS\u202f14, and iPadOS\u202f17 to validate build time, binary size, memory footprint, frame rate, and complex node rendering.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time must be under 10s for a clean build, binary size under 500KB release, memory footprint under 5MB per screen, and 60\u202fFPS during interactions; BoxTreePattern with 1000+ nodes must run without performance regressions.", + "source_line": null + }, + { + "type": "user_story", + "description": "Conduct cross\u2011platform testing on iOS, macOS, and iPadOS devices and simulators to verify dark mode, RTL language support, and locale/region variations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All listed device configurations must be tested and results compiled into a cross\u2011platform report.", + "source_line": null + }, + { + "type": "user_story", + "description": "Perform manual accessibility testing with VoiceOver, keyboard navigation, dynamic type, and other accessibility features to achieve final accessibility sign\u2011off for FoundationUI Phase\u202f5.2.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All listed accessibility tests must be performed; 98% automated accessibility score already achieved; manual edge\u2011case testing must complete before final sign\u2011off.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Media Assets", + "description": "Import licensed Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H assets into the system and refresh regression baselines for tolerant parsing and export validation.", + "source_line": null + }, + { + "name": "Execute macOS 1\u202fGiB Benchmark", + "description": "Run the lenient\u2011vs\u2011strict performance benchmark on a macOS machine with a 1\u202fGiB payload, collect runtime and RSS metrics, and archive results in Documentation/Performance.", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish collected performance baselines for FoundationUI Phase\u202f5.2 into PERFORMANCE.md after profiling or benchmarking is complete.", + "source_line": null + }, + { + "name": "Generate Cross\u2011Platform Test Report", + "description": "Compile cross\u2011platform test results from iOS, macOS, and iPadOS devices/simulators and produce a comprehensive report.", + "source_line": null + }, + { + "name": "Perform Manual Accessibility Sign\u2011off", + "description": "Conduct manual VoiceOver, keyboard navigation, dynamic type, contrast, and other accessibility tests on real devices to achieve final accessibility approval.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4387, + "line_count": 75 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/next_tasks_metrics.json new file mode 100644 index 00000000..e4e4c5a4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/next_tasks_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/next_tasks.md", + "n_spec": 11, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement SDK Tolerant Parsing Documentation (T6.3) to provide a DocC guide with examples and inline documentation updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation includes TolerantParsingGuide.md in specified location, code examples for tolerant parsing setup and ParseIssueStore usage, updated inline docs for ParsePipeline.Options, .strict, .tolerant, link from main Documentation.md Topics section, and verified with test file in Tests/ISOInspectorKitTests.", + "source_line": null + }, + { + "type": "invariant", + "description": "Documentation must be completed by 2025-11-12 as marked COMPLETED.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add FoundationUI dependency to ISOInspectorApp package.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI added in Package.swift, builds with FoundationUI target, platform requirements updated if needed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create integration test suite for FoundationUI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests/ISOInspectorAppTests/FoundationUI directory created, XCTest framework set up, test templates for snapshot/unit/integration patterns exist.", + "source_line": null + }, + { + "type": "user_story", + "description": "Build component showcase view (ComponentShowcase.swift) with tabs and render all Foundation UI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "View has tabs for each foundation layer, scrollable & searchable, renders all components.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document integration patterns in technical spec.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add \"FoundationUI Integration\" section\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Documentation", + "description": "Provides a DocC guide and code examples for SDK tolerant parsing setup and ParseIssueStore usage, including inline documentation updates for ParsePipeline options.", + "source_line": null + }, + { + "name": "FoundationUI Dependency Integration", + "description": "Adds FoundationUI as a package dependency, verifies builds, and updates platform requirements.", + "source_line": null + }, + { + "name": "FoundationUI Integration Test Suite", + "description": "Creates XCTest integration tests for FoundationUI components, including snapshot, unit, and integration patterns.", + "source_line": null + }, + { + "name": "Component Showcase View", + "description": "SwiftUI view that displays all FoundationUI components in tabs with search and scrollable interface for visual testing.", + "source_line": null + }, + { + "name": "Integration Patterns Documentation", + "description": "Adds a section to the technical spec documenting architecture patterns for wrapping FoundationUI components with code examples.", + "source_line": null + }, + { + "name": "Design System Integration Guide Update", + "description": "Updates the design system guide with an integration checklist, migration path, and quality gates per phase.", + "source_line": null + }, + { + "name": "Badge Component Feature", + "description": "FoundationUI badge and status indicator component implementation as part of Phase 1.", + "source_line": null + }, + { + "name": "Card Component Feature", + "description": "FoundationUI card container and section component implementation.", + "source_line": null + }, + { + "name": "Key-Value Row Component", + "description": "FoundationUI key\u2011value row and metadata component.", + "source_line": null + }, + { + "name": "Floating Settings Panel Shell", + "description": "Implements a macOS/iPad/iOS settings panel scene using FoundationUI cards, with keyboard shortcuts and accessibility focus.", + "source_line": null + }, + { + "name": "Settings Persistence & Reset", + "description": "Wires persistence of permanent and session settings through UserPreferencesStore and CoreData JSON fallback, including reset actions and diagnostics.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4987, + "line_count": 88 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/replace_bento4_test_fixtures_metrics.json b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/replace_bento4_test_fixtures_metrics.json new file mode 100644 index 00000000..8686ceac --- /dev/null +++ b/DOCS/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/replace_bento4_test_fixtures_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/212_FoundationUI_Phase_0_Integration_Setup/replace_bento4_test_fixtures.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Replace external Bento4 test fixtures with internal MP4 sample files to eliminate dependency and gain control over test data.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All CLI compatibility tests must pass using the new internal MP4 samples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The DOCS/SAMPLES/Bento4-master directory must be removed from the repository.", + "source_line": null + }, + { + "type": "invariant", + "description": "Test references should point only to internal sample files and not to any external Bento4 paths.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Create Minimal MP4 Sample Files", + "description": "Generate small MP4 files for testing purposes", + "source_line": null + }, + { + "name": "Update Test References", + "description": "Modify test code to point to new sample file locations", + "source_line": null + }, + { + "name": "Verify CLI Compatibility Tests", + "description": "Run and confirm that all command-line interface tests pass using the new fixtures", + "source_line": null + }, + { + "name": "Remove External Bento4 Samples Directory", + "description": "Delete the DOCS/SAMPLES/Bento4-master directory from the project", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1047, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/212_I0_2_Create_Integration_Test_Suite_metrics.json b/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/212_I0_2_Create_Integration_Test_Suite_metrics.json new file mode 100644 index 00000000..c6c8562f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/212_I0_2_Create_Integration_Test_Suite_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/212_I0_2_Create_Integration_Test_Suite.md", + "n_spec": 11, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expand the Tests/ISOInspectorAppTests/FoundationUI/ test suite to provide comprehensive FoundationUI component test coverage for iOS and macOS platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Comprehensive test coverage of at least 80% for core FoundationUI components (Badge, Card, KeyValueRow, Button, TextField).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests implemented for visual regression detection across iOS and macOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Platform-specific test variants covering iOS 17+, macOS 14+ and relevant device sizes (iPad Pro 12.9\", 11\").", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All tests pass locally with swift test, showing zero failures and snapshot diffs match expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI integration ready: tests integrated into GitHub Actions workflow if applicable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Updated DOCS/INPROGRESS/next_tasks.md marking I0.2 as completed and I0.3 as next priority.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI must be added to SwiftPM dependencies (I0.1 complete).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use SwiftUI .snapshot() testing framework for snapshot tests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Lock snapshot baseline to specific Xcode version in CI config.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Parallelize snapshot generation across test targets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Badge Component Tests", + "description": "Unit tests verifying rendering, states, sizes, and colors of the Badge component across iOS and macOS.", + "source_line": null + }, + { + "name": "Card Component Tests", + "description": "Tests for Card layout, padding, shadow handling, and responsive behavior on different platforms.", + "source_line": null + }, + { + "name": "KeyValueRow Component Tests", + "description": "Validation of label/value alignment, wrapping, and layout consistency in KeyValueRow views.", + "source_line": null + }, + { + "name": "Button Component Tests", + "description": "Tests ensuring Button action triggers, state changes, accessibility labels, and visual appearance.", + "source_line": null + }, + { + "name": "TextField Component Tests", + "description": "Unit tests for TextField input binding, placeholder text, validation states, and accessibility.", + "source_line": null + }, + { + "name": "Snapshot Testing Framework Integration", + "description": "Implementation of SwiftUI snapshot testing across light/dark modes, accessibility sizes, and platform traits.", + "source_line": null + }, + { + "name": "Platform-Specific Test Variants", + "description": "Test suites configured to run on iOS 17.x simulators, macOS 14.x simulators, and iPad Pro variants for responsive layout validation.", + "source_line": null + }, + { + "name": "Coverage Measurement Tool", + "description": "Tooling to measure and enforce \u226580% test coverage of FoundationUI component code paths.", + "source_line": null + }, + { + "name": "CI Integration for Tests", + "description": "GitHub Actions workflow configuration to run the FoundationUI test suite on CI runners with snapshot baseline locking.", + "source_line": null + }, + { + "name": "Accessibility Validation Tests", + "description": "Tests that verify components announce correctly with VoiceOver enabled and meet accessibility standards.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4569, + "line_count": 88 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/FoundationUI_Integration_Strategy_metrics.json b/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/FoundationUI_Integration_Strategy_metrics.json new file mode 100644 index 00000000..56832c74 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/FoundationUI_Integration_Strategy_metrics.json @@ -0,0 +1,523 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/FoundationUI_Integration_Strategy.md", + "n_spec": 79, + "n_func": 23, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI into ISOInspectorApp gradually and phasically starting with small components.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add FoundationUI Swift Package dependency to ISOInspectorApp target.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create integration test suite for FoundationUI in ISOInspectorApp.", + "source_line": null + }, + { + "type": "user_story", + "description": "Build Component Showcase SwiftUI view for incremental UI testing.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document FoundationUI Integration Patterns in technical spec.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update Design System Guide with integration checklist.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ISOInspectorApp builds successfully with FoundationUI dependency.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration test suite structure is established.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Component Showcase renders all FoundationUI components without crashes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero SwiftLint violations in the project.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Code coverage for FoundationUI integration tests is \u226580%.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace manual badge implementations with DS.Badge and DS.Indicator components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All manual badges are replaced by DS.Badge.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All status indicators use DS.Indicator.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit test coverage for badge/indicator variants is \u226590%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests pass for all light/dark modes and four status levels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility score for badges/indicators is \u226598%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time impact of badge integration is <5%.", + "source_line": null + }, + { + "type": "user_story", + "description": "Migrate details panel container styling to DS.Card and DS.SectionHeader components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All container styling uses DS.Card.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All section headers use DS.SectionHeader.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No manual padding or corner magic numbers; spacing uses DS.Spacing tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dark mode is fully functional for card containers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot regression tests pass on all platforms.", + "source_line": null + }, + { + "type": "user_story", + "description": "Use DS.KeyValueRow to display metadata consistently in details panel.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All metadata displayed via DS.KeyValueRow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Consistent spacing uses DS tokens; no magic numbers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Copyable actions integrated into key-value rows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test coverage for key\u2011value row implementation is \u226585%.", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate DS.CopyableText and DS.Copyable wrappers for copy functionality across platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Copy works on all platforms with visual feedback.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard shortcuts (Cmd+C/Ctrl+C) function correctly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility labels for copy actions are correct.", + "source_line": null + }, + { + "type": "user_story", + "description": "Apply DS.InteractiveStyle modifier to clickable rows, tree controls, and toolbar buttons.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All interactive elements have consistent feedback; macOS hover state works; iOS touch feedback visible.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No accessibility conflicts with focus management.", + "source_line": null + }, + { + "type": "user_story", + "description": "Use DS.SurfaceStyle environment key for surface material and elevation across app surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All surfaces use appropriate SurfaceStyle (thin, regular, thick).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Elevation hierarchy is clear visually; dark mode shadows correct.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility violations are none.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace manual sidebar navigation with DS.SidebarPattern for macOS/iPad.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Sidebar pattern works on macOS and iPad; file browser navigation functional.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Search/filter integrated into sidebar pattern.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "iOS fallback uses NavigationStack.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard shortcuts (Cmd+1/2/3) operational on macOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver and keyboard navigation fully functional.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace manual inspector panel layout with DS.InspectorPattern.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fixed header sticky and functional in inspector pattern.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Scroll performance maintained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests pass.", + "source_line": null + }, + { + "type": "user_story", + "description": "Replace manual tree view with DS.BoxTreePattern for optimized hierarchical display.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tree renders with <16ms frame time; memory stable during expand/collapse.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Large tree (1000+ nodes) renders responsively.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests for tree appearance pass.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver navigation works.", + "source_line": null + }, + { + "type": "user_story", + "description": "Apply DS.ToolbarPattern to top toolbar across platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Toolbar layout adaptive; overflow menu functional.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Icons and labels clear; accessibility score \u226598%.", + "source_line": null + }, + { + "type": "user_story", + "description": "Use platform adaptation context for automatic spacing/sizing via DS.PlatformAdaptation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Spacing correctly applied on macOS, iOS, iPadOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Size class adaptation respected.", + "source_line": null + }, + { + "type": "user_story", + "description": "Apply accessibility context for Reduce Motion, Contrast, Dynamic Type and Bold Text.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Animations respect Reduce Motion; high contrast mode fully functional.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dynamic Type scales correctly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bold text accessibility setting applied.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver narration for all interactive elements.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard navigation (Tab/Return/Escape) fully accessible.", + "source_line": null + }, + { + "type": "user_story", + "description": "Centralize dark mode via DS.ColorSchemeAdapter.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero hardcoded colors in UI code.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dark mode rendering consistent across views.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests for light/dark/high-contrast.", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate search and filter components using DS components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Search UI uses foundation UI components; performance <100ms for 10K boxes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate progress indicator with async parsing updates using DS.ProgressView.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Progress updates in real\u2011time; no freezing.", + "source_line": null + }, + { + "type": "user_story", + "description": "Enhance export functionality with foundation UI patterns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Export modal uses foundation UI design system; all format options functional.", + "source_line": null + }, + { + "type": "user_story", + "description": "Improve hex viewer with foundation typography and copyable data.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hex viewer uses DS typography; performance <50ms render time.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Dependency Integration", + "description": "Adds FoundationUI Swift package as a dependency to ISOInspectorApp target and verifies build.", + "source_line": null + }, + { + "name": "Integration Test Suite Setup", + "description": "Creates structured integration test directories for FoundationUI components.", + "source_line": null + }, + { + "name": "Component Showcase View", + "description": "Builds a SwiftUI view that renders all FoundationUI components for development and testing.", + "source_line": null + }, + { + "name": "Foundation Components Wrappers - Badge & Status Indicators", + "description": "Wraps DS.Badge and DS.Indicator into BoxStatusBadgeView and ParseStatusIndicator for badge/indicator usage.", + "source_line": null + }, + { + "name": "Foundation Components Wrappers - Card Containers & Sections", + "description": "Wraps DS.Card and DS.SectionHeader into BoxDetailsCard and BoxSectionHeader for container styling.", + "source_line": null + }, + { + "name": "Foundation Components Wrappers - Key-Value Rows", + "description": "Wraps DS.KeyValueRow into BoxMetadataRow for metadata display with copyable action.", + "source_line": null + }, + { + "name": "Copyable Text Wrapper", + "description": "Integrates DS.CopyableText and DS.Copyable wrappers for text fields, hex viewer addresses, and provides platform shortcuts.", + "source_line": null + }, + { + "name": "Interactive Style Modifier Application", + "description": "Applies DS.InteractiveStyle to clickable rows, tree controls, and toolbar buttons for consistent hover/press feedback.", + "source_line": null + }, + { + "name": "Surface Material Styling", + "description": "Uses DS.SurfaceStyle environment key to apply surface styles (.thin,.regular,.thick) across UI surfaces.", + "source_line": null + }, + { + "name": "Sidebar Pattern Implementation", + "description": "Replaces manual sidebar with DS.SidebarPattern via BoxesSidebar view, including search/filter integration and platform shortcuts.", + "source_line": null + }, + { + "name": "Inspector Pattern Implementation", + "description": "Applies DS.InspectorPattern in BoxInspector for details panel layout with sticky header and scroll behavior.", + "source_line": null + }, + { + "name": "Tree Box Pattern Implementation", + "description": "Wraps DS.BoxTreePattern into BoxTree view, enabling lazy rendering, animations, selection, and large\u2011tree performance.", + "source_line": null + }, + { + "name": "Toolbar Pattern Implementation", + "description": "Uses DS.ToolbarPattern to arrange toolbar buttons adaptively across macOS/iOS platforms.", + "source_line": null + }, + { + "name": "Platform Adaptation Context Setup", + "description": "Provides DS.PlatformAdaptation environment context for automatic spacing/sizing per platform and size class.", + "source_line": null + }, + { + "name": "Accessibility Context Integration", + "description": "Applies DS.AccessibilityContext to respect Reduce Motion, High Contrast, Dynamic Type, Bold Text, and VoiceOver settings.", + "source_line": null + }, + { + "name": "Dark Mode Adapter Implementation", + "description": "Centralizes dark mode handling via DS.ColorSchemeAdapter and replaces hard\u2011coded colors with design system tokens.", + "source_line": null + }, + { + "name": "Search & Filter UI Components", + "description": "Creates BoxSearchView and BoxFilterView using FoundationUI typography/spacing for search functionality.", + "source_line": null + }, + { + "name": "Progress View Integration", + "description": "Builds BoxParsingProgressView that displays live parsing progress using DS.ProgressView and async streams.", + "source_line": null + }, + { + "name": "Export Modal Implementation", + "description": "Provides BoxExportView modal with format selection, share sheet integration, and accessibility support.", + "source_line": null + }, + { + "name": "Hex Viewer Enhancement", + "description": "Enhances hex viewer with DS.Typography, copyable rows, byte highlighting, and performance optimizations.", + "source_line": null + }, + { + "name": "Full App Integration Test Suite", + "description": "Creates comprehensive end\u2011to\u2011end tests covering launch, navigation, search, export, dark mode, accessibility, platform behavior, performance, and visual regression.", + "source_line": null + }, + { + "name": "Performance Validation Tests", + "description": "Measures app launch time, tree rendering, scroll FPS, memory usage, binary size impact to ensure performance budgets are met.", + "source_line": null + }, + { + "name": "Documentation & Migration Guide", + "description": "Updates technical spec, migration guide, integration guide, API docs, and component showcase examples for the new FoundationUI wrappers.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 34453, + "line_count": 961 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/Summary_of_Work_metrics.json new file mode 100644 index 00000000..3ea8d8aa --- /dev/null +++ b/DOCS/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/Summary_of_Work_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/213_I0_2_Create_Integration_Test_Suite/Summary_of_Work.md", + "n_spec": 13, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create comprehensive integration test suite for FoundationUI components (Badge, Card, KeyValueRow) across iOS and macOS platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test coverage \u226580% for core FoundationUI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All tests pass on iOS 17+ and macOS 14+.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each test file contains detailed documentation of coverage areas and test counts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test files follow project coding standards, One File \u2014 One Entity principle, and TDD/XP/PDD methodologies.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All created test files are syntactically correct and ready for execution.", + "source_line": null + }, + { + "type": "invariant", + "description": "Component initialization tests must validate default and custom parameters across all combinations.", + "source_line": null + }, + { + "type": "invariant", + "description": "Semantic/property tests must verify enum cases, property values, design tokens, and string serialization.", + "source_line": null + }, + { + "type": "invariant", + "description": "View rendering tests must confirm non\u2011nil body and platform-specific rendering.", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility tests must cover labels, VoiceOver compatibility, and platform features.", + "source_line": null + }, + { + "type": "invariant", + "description": "AgentDescribable protocol tests must validate component type identification, properties serialization, and semantic description generation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Test suite organized into separate files per component following One File \u2014 One Entity principle.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Tests written using TDD, XP, and PDD practices to ensure maintainability and coverage.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BadgeComponentTests", + "description": "Unit tests validating Badge component initialization, semantics, rendering, platform compatibility, protocol conformance, real-world usage, edge cases, and property equality", + "source_line": null + }, + { + "name": "CardComponentTests", + "description": "Unit tests covering Card component initialization, elevation levels, corner radius variations, material backgrounds, rendering, content types, platform compatibility, protocol conformance, nested cards, real-world usage, and elevation property equality", + "source_line": null + }, + { + "name": "KeyValueRowComponentTests", + "description": "Unit tests for KeyValueRow component initialization, layout options, text content variations, copyable functionality, rendering, platform compatibility, protocol conformance, real-world usage, edge cases, layout recommendations, and combinations testing", + "source_line": null + }, + { + "name": "FoundationUIIntegrationTests", + "description": "Integration tests ensuring FoundationUI module import, component availability, design token access, and cross-platform compatibility", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8673, + "line_count": 245 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/214_I0_4_Document_Integration_Patterns/I0_4_Document_Integration_Patterns_metrics.json b/DOCS/TASK_ARCHIVE/214_I0_4_Document_Integration_Patterns/I0_4_Document_Integration_Patterns_metrics.json new file mode 100644 index 00000000..fecc4076 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/214_I0_4_Document_Integration_Patterns/I0_4_Document_Integration_Patterns_metrics.json @@ -0,0 +1,138 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/214_I0_4_Document_Integration_Patterns/I0_4_Document_Integration_Patterns.md", + "n_spec": 12, + "n_func": 13, + "intent_atoms": [ + { + "type": "user_story", + "description": "Future developers can wire FoundationUI components into ISOInspector features (C21, C22) using documented integration patterns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Added \"FoundationUI Integration\" section to 03_Technical_Spec.md or created new file.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documented architecture patterns for wrapping FoundationUI components such as Badge, Card, KeyValueRow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provided code examples for Badge integration with ISOInspector state, Card layout patterns for detail panes, and KeyValueRow usage for metadata display.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documented design token usage (DS.Spacing, DS.Colors, DS.Typography, etc.).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Created \"Do's and Don'ts\" guidelines for consistency.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Referenced existing test suite and ComponentTestApp in documentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Cross-linked from relevant PRDs and README sections.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation reviewed for clarity and correctness with no broken references.", + "source_line": null + }, + { + "type": "invariant", + "description": "Design tokens must be used for spacing, colors, typography when styling FoundationUI components.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wrap FoundationUI components in custom wrappers to adapt them to ISOInspector state and Combine/SwiftUI previews.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use snapshot tests to validate component rendering.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Integration Section", + "description": "Documentation section detailing how to integrate FoundationUI components into ISOInspector", + "source_line": null + }, + { + "name": "Component Wrapper Patterns", + "description": "Guidelines for wrapping and adapting FoundationUI components such as Badge, Card, KeyValueRow", + "source_line": null + }, + { + "name": "State Management Bridge", + "description": "Mechanism for connecting FoundationUI component state with Combine/SwiftUI previews", + "source_line": null + }, + { + "name": "Design Token Usage Guide", + "description": "Examples of using design tokens (DS.Spacing, DS.Colors, DS.Typography) within FoundationUI components", + "source_line": null + }, + { + "name": "Platform Considerations Documentation", + "description": "Notes on iOS, macOS, iPadOS specifics for FoundationUI integration", + "source_line": null + }, + { + "name": "Badge Integration Code Example", + "description": "Sample code showing how to integrate a FoundationUI Badge with ISOInspector state", + "source_line": null + }, + { + "name": "Card Layout Pattern Example", + "description": "Pattern for wrapping detail pane content using FoundationUI Card layout", + "source_line": null + }, + { + "name": "KeyValueRow Usage Example", + "description": "Example of using FoundationUI KeyValueRow for metadata display", + "source_line": null + }, + { + "name": "Integrity Summary Panel Mockup", + "description": "Cross\u2011component example building an Integrity Summary panel with FoundationUI components", + "source_line": null + }, + { + "name": "Do's and Don'ts Guidelines", + "description": "Best practices and pitfalls to avoid when integrating FoundationUI", + "source_line": null + }, + { + "name": "Cross\u2011linking Instructions", + "description": "Guidelines for linking documentation from README, PRDs, and ComponentTestApp", + "source_line": null + }, + { + "name": "Integration Test Suite Reference", + "description": "Documentation reference to the 123\u2011test integration suite covering Badge, Card, KeyValueRow", + "source_line": null + }, + { + "name": "ComponentTestApp Showcase Reference", + "description": "Reference to live examples in the ComponentTestApp showcase application", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4861, + "line_count": 79 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/I0_5_Update_Design_System_Guide_metrics.json b/DOCS/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/I0_5_Update_Design_System_Guide_metrics.json new file mode 100644 index 00000000..7d89b239 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/I0_5_Update_Design_System_Guide_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/I0_5_Update_Design_System_Guide.md", + "n_spec": 13, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Update the Design System Guide to include FoundationUI integration checklist, migration path, quality gates, and accessibility requirements.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add \"FoundationUI Integration Checklist\" section to Design System Guide.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document migration path from old UI patterns to FoundationUI components with code examples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add quality gates per integration phase (Phase 0-6).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document accessibility requirements ensuring \u226598% WCAG 2.1 AA compliance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Cross-reference ComponentTestApp and integration test suite.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ensure all code examples are accurate and testable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No broken links or references in the guide.", + "source_line": null + }, + { + "type": "invariant", + "description": "Design tokens must be used for spacing, colors, typography, and animations; no hard\u2011coded platform values.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI components must be wrapped with domain\u2011specific semantics before exposure to business logic.", + "source_line": null + }, + { + "type": "invariant", + "description": "SwiftLint 0 violations, compiler warnings 0, test coverage \u226580%, accessibility audit \u226598% must hold for each phase.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a single file per component wrapper following \"One File\u2011\"\u2011one\u2011Entity\u00a0principle.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Platform adaptation uses @Environment(\\", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Integration Checklist", + "description": "Section detailing checklist items for integrating FoundationUI components into the app", + "source_line": null + }, + { + "name": "Migration Path to FoundationUI", + "description": "Guidance on mapping old UI patterns to new FoundationUI components with code examples and workflow", + "source_line": null + }, + { + "name": "Quality Gates per Integration Phase", + "description": "Defined quality criteria and gates for each of the six integration phases (Phase\u00a00\u20136)", + "source_line": null + }, + { + "name": "Accessibility Requirements for FoundationUI Integration", + "description": "WCAG 2.1 AA compliance checklist, VoiceOver, keyboard navigation, dynamic\u2011type and color contrast guidelines", + "source_line": null + }, + { + "name": "ComponentTestApp Cross-References", + "description": "Links to live examples in ComponentTestApp and test suite references throughout the guide", + "source_line": null + }, + { + "name": "Design System Guide Update Process", + "description": "Procedure for reviewing current guide, adding new sections, and marking task completion", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 10593, + "line_count": 241 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d4098d66 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/Summary_of_Work_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/215_I0_5_Update_Design_System_Guide/Summary_of_Work.md", + "n_spec": 8, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Update Design System Guide to include FoundationUI integration checklist, migration path, quality gates, and accessibility requirements.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Design token usage verification points (5), component wrapper pattern points (4), testing requirements (5), platform compatibility points (5), accessibility compliance points (7), documentation points (4), build quality gates (5).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Migration path includes 10 component mappings, 7-step workflow, before/after code examples for Badge, Card, KeyValueRow, common pitfalls with solutions, rollback strategy.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Quality gates documented for phases 0-6 with objectives, validation metrics, success criteria, performance budgets (Phase 6).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility requirements meet WCAG 2.1 AA \u226598%, include VoiceOver testing, keyboard navigation, dynamic type support, color contrast, reduce motion, high contrast mode.", + "source_line": null + }, + { + "type": "invariant", + "description": "All code examples are accurate and testable; no broken links or references.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "FoundationUI integration checklist added as Section 9 in Design System Guide with subsections 9.1-9.6.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Component mapping table for 10 components, migration workflow, and cross\u2011reference links to technical spec and test suite.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Integration Checklist API", + "description": "Endpoint or documentation section that lists verification points for design tokens, component wrappers, testing, platform compatibility, accessibility, documentation, and build quality gates.", + "source_line": null + }, + { + "name": "Component Mapping Table", + "description": "Data structure mapping old UI components to FoundationUI equivalents with priorities, phases, and effort estimates.", + "source_line": null + }, + { + "name": "Migration Workflow Engine", + "description": "Process definition that guides developers through the 7-step migration from identification to archival of legacy UI patterns.", + "source_line": null + }, + { + "name": "Code Example Repository", + "description": "Collection of before/after code snippets for Badge, Card, KeyValueRow and other components demonstrating migration and pitfalls.", + "source_line": null + }, + { + "name": "Quality Gates Dashboard", + "description": "Interface showing phase\u2011specific quality gates (Phase\u00a00\u20136) with objectives, validation metrics, success criteria and performance budgets.", + "source_line": null + }, + { + "name": "Accessibility Compliance Checker", + "description": "Checklist and tooling integration that verifies WCAG\u00a02.1 AA compliance, VoiceOver, keyboard navigation, dynamic\u2011type support, color contrast, etc.", + "source_line": null + }, + { + "name": "Cross\u2011Reference Link Manager", + "description": "System that manages links to external resources such as component showcase, test suite, technical spec.", + "source_line": null + }, + { + "name": "Design System Guide Document", + "description": "Markdown file (10_DESIGN_SYSTEM_GUIDE.md) containing all sections of the specification.", + "source_line": null + }, + { + "name": "Phase\u00a00 Status Tracker", + "description": "Tool or document tracking completion status of Phase\u00a00 tasks and quality gates.", + "source_line": null + }, + { + "name": "Next Tasks Planner", + "description": "Document or interface that manages next\u2011step tasks for future phases.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 11719, + "line_count": 258 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/214_I1_1_Badge_Status_Indicators_metrics.json b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/214_I1_1_Badge_Status_Indicators_metrics.json new file mode 100644 index 00000000..0fd8f867 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/214_I1_1_Badge_Status_Indicators_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/214_I1_1_Badge_Status_Indicators.md", + "n_spec": 14, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Consolidate scattered manual badge implementations in ISOInspectorApp into consistent, reusable FoundationUI components (DS.Badge and DS.Indicator) for displaying parse status, error levels, and processing indicators.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All manual badges replaced with DS.Badge (CorruptionBadge, SeverityBadge, ParseStateBadge).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStatusBadge wrapper uses DS.Badge for parse status levels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Component migration completed: no dedicated BoxStatusBadgeView or ParseStatusIndicator wrappers needed; reusing ParseTreeStatusBadge.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit test coverage \u226590% for badge variants (33 Badge tests inherited from Phase 0).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests pass for all variants in light/dark modes, covering all 4 status levels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests verify VoiceOver labels, contrast ratios, focus (WCAG 2.1 AA compliance via FoundationUI Badge).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero SwiftLint violations and build time impact <5%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No performance regressions in tree rendering.", + "source_line": null + }, + { + "type": "invariant", + "description": "All status indicators use DS.Badge component; DS.Indicator not used at this time.", + "source_line": null + }, + { + "type": "invariant", + "description": "Consistent visual language across light/dark modes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility compliance (VoiceOver, contrast, focus) must always hold for badges.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use DS.Badge component for all status indicators; re-use ParseTreeStatusBadge wrapper instead of creating new BoxStatusBadgeView or ParseStatusIndicator components.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Platform-adaptive sizing via FoundationUI and use of DS.PlatformAdaptation for size/spacing differences.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DS.Badge Component", + "description": "Reusable UI component for displaying status badges (info, warning, error, success) across the application.", + "source_line": null + }, + { + "name": "ParseTreeStatusBadge Wrapper", + "description": "Convenience wrapper that uses DS.Badge to represent parse status levels within tree view nodes.", + "source_line": null + }, + { + "name": "Badge Migration Utility", + "description": "Process that replaces manual badge implementations (CorruptionBadge, SeverityBadge, ParseStateBadge) with DS.Badge in ISOInspectorApp codebase.", + "source_line": null + }, + { + "name": "Accessibility Test Suite for Badges", + "description": "Automated tests ensuring badges have VoiceOver labels, contrast ratios, and focus behavior compliant with WCAG 2.1 AA.", + "source_line": null + }, + { + "name": "Snapshot Test Suite for Badge Variants", + "description": "Tests capturing visual appearance of badge variants in light and dark modes.", + "source_line": null + }, + { + "name": "Unit Test Suite for Badge Variants", + "description": "Comprehensive unit tests covering all status levels and platform-specific behaviors of DS.Badge.", + "source_line": null + }, + { + "name": "Component Showcase App (ComponentTestApp)", + "description": "Application demonstrating badge components and their usage examples.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7628, + "line_count": 167 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work_metrics.json new file mode 100644 index 00000000..a478a5c5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/Summary_of_Work.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Consolidate scattered manual badge implementations in ISOInspectorApp into consistent, reusable FoundationUI DS.Badge component for displaying parse status, error levels, and processing indicators.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All three manual badge implementations (CorruptionBadge, SeverityBadge, ParseStateBadge) are migrated to use DS.Badge with correct level mappings and preserve tooltip, accessibility labels, and macOS focusable behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Import FoundationUI in Sources/ISOInspectorApp/Tree/ParseTreeOutlineView.swift and remove unused .iconName extension from ParseIssue.Severity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add @todo #I1.1 comments for future DS.Indicator usage at specified locations (ParseTreeOutlineView.swift:550-552 and ParseTreeDetailView.swift:138-139).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CorruptionBadge", + "description": "Displays corruption status using DS.Badge component with icon support and accessibility features", + "source_line": null + }, + { + "name": "SeverityBadge", + "description": "Shows severity level of parse issues via DS.Badge with consistent styling", + "source_line": null + }, + { + "name": "ParseStateBadge", + "description": "Indicates current parse state (idle, parsing, finished, failed) using DS.Badge levels mapping", + "source_line": null + }, + { + "name": "DS.Badge API usage in ParseTreeOutlineView", + "description": "Reusable badge component integration for various status indicators in the tree view", + "source_line": null + }, + { + "name": "@todo #I1.1 DS.Indicator consideration points", + "description": "Markers for future compact inline status indicators in tree and metadata rows", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8769, + "line_count": 224 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/blocked_metrics.json b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/blocked_metrics.json new file mode 100644 index 00000000..4fbc2fb7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/blocked_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/blocked.md", + "n_spec": 14, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be granted before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark once macOS hardware with the 1\u202fGiB performance fixture becomes available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must run with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, collect runtime and RSS metrics, and archive them under Documentation/Performance/.", + "source_line": null + }, + { + "type": "invariant", + "description": "The todo.md entry \"Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark\" must remain open until the run completes and metrics are published.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines for FoundationUI Phase\u202f5.2 in PERFORMANCE.md after manual profiling with Xcode Instruments is completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Render times must be <100\u202fms, memory usage <5\u202fMB, and Core Animation must verify 60\u202fFPS on device during the manual profiling task.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish CI performance gates after completing multi\u2011platform benchmark tests for FoundationUI Phase\u202f5.2.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time <10s for a clean build, binary size <500KB release, memory footprint <5MB per screen, 60\u202fFPS on all platforms during interactions, and BoxTreePattern with 1000+ nodes must be verified.", + "source_line": null + }, + { + "type": "user_story", + "description": "Compile cross\u2011platform test results and create a cross\u2011platform report after manual testing on iOS, macOS, iPadOS devices and simulators.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests must cover iOS\u202f17+ devices (iPhone\u00a0SE/15/15\u202fPro\u00a0Max), macOS\u00a014+ multiple window sizes, iPadOS\u00a017+ all size\u2011class orientations, Dark Mode, RTL languages, and multiple locales.", + "source_line": null + }, + { + "type": "user_story", + "description": "Achieve final accessibility sign\u2011off after manual VoiceOver, keyboard navigation, dynamic\u2011Type\u2011size\u2011to\u2011XXXL, etc., testing on real devices.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility score must be 98% or higher; manual edge\u2011case testing must confirm that all required accessibility features are implemented.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Assets", + "description": "Import licensed media assets and refresh regression baselines for tolerant parsing and export scenarios", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run lenient\u2011vs\u2011strict benchmark on macOS with 1\u202fGiB payload, collect runtime and RSS metrics, archive results", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish performance baseline data in PERFORMANCE.md after profiling", + "source_line": null + }, + { + "name": "Publish Performance Benchmarks", + "description": "Publish benchmark metrics after manual multi\u2011platform testing", + "source_line": null + }, + { + "name": "Compile Cross\u2011Platform Test Report", + "description": "Compile test results from iOS, macOS, and iPadOS devices into a cross\u2011platform report", + "source_line": null + }, + { + "name": "Final Accessibility Sign\u2011off", + "description": "Sign off on accessibility after completing manual VoiceOver, keyboard, dynamic type, and contrast tests", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4468, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/next_tasks_metrics.json new file mode 100644 index 00000000..5f2b0c4b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/next_tasks_metrics.json @@ -0,0 +1,128 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/216_I1_1_Badge_Status_Indicators/next_tasks.md", + "n_spec": 12, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI dependency into the project and ensure it builds successfully.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI dependency is added and project compiles without errors.", + "source_line": null + }, + { + "type": "invariant", + "description": "All integration tests must pass (123 tests) before moving to next phase.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create a comprehensive integration test suite for FoundationUI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration test suite contains 123 tests covering Badge, Card, KeyValueRow, and Integration components.", + "source_line": null + }, + { + "type": "invariant", + "description": "Test coverage must be \u226580% after Phase 0.", + "source_line": null + }, + { + "type": "user_story", + "description": "Build a component showcase using ComponentTestApp to display all FoundationUI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ComponentTestApp shows at least 14 screens with live components.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document integration patterns and design system guide updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation includes a migration path, quality gates for each of six phases, and accessibility requirements \u226598% WCAG 2.1 AA.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use DS.Badge for all badge components instead of custom implementations.", + "source_line": null + }, + { + "type": "user_story", + "description": "Migrate existing badges (..).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Dependency Integration", + "description": "Integrates FoundationUI library into the project and ensures successful build.", + "source_line": null + }, + { + "name": "Integration Test Suite for FoundationUI", + "description": "A comprehensive set of automated tests covering Badge, Card, KeyValueRow, and Integration components (123 tests).", + "source_line": null + }, + { + "name": "Component Showcase Application", + "description": "Live demo app displaying all FoundationUI components across multiple screens.", + "source_line": null + }, + { + "name": "Documentation of Integration Patterns", + "description": "Technical spec detailing how to integrate FoundationUI components into existing code.", + "source_line": null + }, + { + "name": "Design System Guide Update", + "description": "Updated guide with migration roadmap, quality gates, and accessibility requirements for FoundationUI integration.", + "source_line": null + }, + { + "name": "Badge & Status Indicator Component", + "description": "Standardized DS.Badge component used throughout the app for status badges.", + "source_line": null + }, + { + "name": "Card Container Component", + "description": "BoxDetailsCard wrapper around DS.Card for consistent card styling.", + "source_line": null + }, + { + "name": "Section Header Component", + "description": "BoxSectionHeader\u00a0wrapper\u00a0around\u00a0DS.SectionHeader.", + "source_line": null + }, + { + "name": "Key\u2011Value Row Component", + "description": "BoxMetadataRow\u00a0\u2013\u00a0a reusable\u00a0DS.KeyValueRow\u00a0for display of metadata.", + "source_line": null + }, + { + "name": "SettingsPanelScene UI", + "description": "Floating settings panel UI with FoundationUI cards for user preferences.", + "source_line": null + }, + { + "name": "User Preferences Persistence Layer", + "description": "Handles persistence and reset logic for global and session\u2011based settings via UserPreferencesStore.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5222, + "line_count": 99 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/217_I1_2_Card_Containers_Sections_metrics.json b/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/217_I1_2_Card_Containers_Sections_metrics.json new file mode 100644 index 00000000..c6ec341b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/217_I1_2_Card_Containers_Sections_metrics.json @@ -0,0 +1,133 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/217_I1_2_Card_Containers_Sections.md", + "n_spec": 16, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Migrate ISOInspectorApp details panel container sections to use FoundationUI Design System DS.Card and DS.SectionHeader components for consistent layout and dark mode support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All details panel container sections must use DS.Card component with appropriate elevation levels (thin, regular, thick).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All section headers must be replaced with DS.SectionHeader component via BoxSectionHeader wrapper.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No hardcoded padding, corner radius, or shadow values; all spacing uses DS.Spacing tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dark mode rendering must be correct and consistent across all cards using ColorSchemeAdapter.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Card elevation hierarchy must be visually clear (thin < regular < thick).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit test coverage for new wrapper components must be \u226590%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests must pass for all card variants in light and dark modes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests must verify card nesting behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests must confirm semantic structure, landmarks, VoiceOver announcements, keyboard focus order, and WCAG 2.1 AA compliance with score \u226598%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No SwiftLint violations introduced.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time impact must be <5%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No performance regressions in details panel rendering; frame time <16ms.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI DS.Card and DS.SectionHeader components are available and integrated into the project.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create BoxDetailsCard wrapper around DS.Card to support all elevation levels and platform adaptation context.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create BoxSectionHeader\u00a0wrapper\u00a0to\u00a0wrap\u00a0DS\u00a0\u2013\u00a0the\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxDetailsCard", + "description": "SwiftUI wrapper around FoundationUI DS.Card providing elevation levels (thin, regular, thick) and platform adaptation for details panel sections.", + "source_line": null + }, + { + "name": "BoxSectionHeader", + "description": "SwiftUI wrapper around FoundationUI DS.SectionHeader with typography variants, optional divider support, and VoiceOver landmark announcements for section headers.", + "source_line": null + }, + { + "name": "DetailsPanelCardLayout", + "description": "Refactored layout of the ISOInspectorApp details panel using BoxDetailsCard and BoxSectionHeader, replacing manual styling with Design System tokens and automatic dark mode rendering.", + "source_line": null + }, + { + "name": "CardElevationUnitTests", + "description": "Unit tests covering all DS.Card elevation variants (thin, regular, thick) within BoxDetailsCard, ensuring correct appearance and token usage.", + "source_line": null + }, + { + "name": "CardSnapshotTests", + "description": "Snapshot tests for light/dark modes and elevation levels of BoxDetailsCard to verify visual consistency across platforms.", + "source_line": null + }, + { + "name": "CardIntegrationTests", + "description": "Integration tests validating nested card layouts, cards inside scrollable containers, and interaction with other FoundationUI components.", + "source_line": null + }, + { + "name": "AccessibilityTests", + "description": "Tests confirming semantic structure, landmarks, VoiceOver announcements, keyboard focus order, and WCAG 2.1 AA compliance for BoxDetailsCard and BoxSectionHeader.", + "source_line": null + }, + { + "name": "DarkModeVerification", + "description": "Manual and automated checks ensuring automatic dark mode adaptation via ColorSchemeAdapter for all card components across macOS, iOS, and iPadOS.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9460, + "line_count": 265 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/blocked_metrics.json b/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/blocked_metrics.json new file mode 100644 index 00000000..d0a325b1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/blocked_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/blocked.md", + "n_spec": 11, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blockers change to maintain day-to-day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real-world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be granted before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark once macOS hardware with the 1\u202fGiB performance fixture becomes available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must run with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, collect runtime and RSS metrics, and archive them under Documentation/Performance/.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines for FoundationUI Phase\u202f5.2 using Xcode Instruments on macOS developer machine once manual execution is possible.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Time Profiler must measure render times <100\u202fms, Allocations instrument memory profiling <5\u202fMB, Core Animation must verify 60\u202fFPS on device, and findings documented in a performance report.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish the performance baselines for Foundation\u00a0UI\u00a0Phase\u00a05.2 after CI integration with performance gates once multi\u2011platform testing is completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time <10s for clean build, binary size <500\u202fKB release, memory footprint <5\u202fMB per screen, 60\u202fFPS on all platforms during interactions, and baseline metrics documented.", + "source_line": null + }, + { + "type": "user_story", + "description": "Compile cross\u2011platform test results and create a cross\u2011platform report once devices and simulators are available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests must cover iOS\u00a017+ devices (iPhone\u00a0SE\u00a0\u2026\u00a0iPhone\u00a015\u00a0Pro\u00a0Max), iOS\u00a0\u2013\u00a0iPadOS\u00a0\u2013\u00a0iJSON?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Media Assets", + "description": "Import licensed Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H assets into the system and refresh regression baselines for tolerant parsing and export validation.", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run a lenient\u2011vs\u2011strict performance benchmark on macOS with a 1\u202fGiB payload, collect runtime and RSS metrics, and archive results in Documentation/Performance.", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish collected performance baselines for FoundationUI Phase\u00a05.2 into PERFORMANCE.md after profiling or benchmarking tasks are completed.", + "source_line": null + }, + { + "name": "Generate Cross\u2011Platform Test Report", + "description": "Compile test results from iOS, macOS, and iPadOS devices/simulators into a cross\u2011platform report covering size classes, dark mode, RTL, locale, and orientation.", + "source_line": null + }, + { + "name": "Finalize Accessibility Sign\u2011off", + "description": "Complete manual VoiceOver, keyboard navigation, dynamic type, contrast, and other accessibility checks to achieve final sign\u2011off for the component.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4468, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/next_tasks_metrics.json new file mode 100644 index 00000000..c2086623 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/next_tasks_metrics.json @@ -0,0 +1,133 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/217_I1_2_Card_Containers_Sections/next_tasks.md", + "n_spec": 14, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI dependency into the project and ensure it builds successfully.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI dependency is integrated and building without errors.", + "source_line": null + }, + { + "type": "invariant", + "description": "All integration tests must pass (123 tests) with \u226580% test coverage.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create a comprehensive integration test suite for FoundationUI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration test suite contains 123 tests covering Badge, Card, KeyValueRow, and Integration components.", + "source_line": null + }, + { + "type": "invariant", + "description": "Zero SwiftLint violations in the project.", + "source_line": null + }, + { + "type": "user_story", + "description": "Build a component showcase using ComponentTestApp to display live FoundationUI components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ComponentTestApp provides at least 14 screens showcasing components.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document integration patterns for FoundationUI in technical spec.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation includes ~685 lines in 03_Technical_Spec.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update the Design System Guide with migration roadmap.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Design System Guide updated with ~800 lines added.", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility compliance \u226598% WCAG\u00a02.1\u00a0AA for all components.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use\u00a0DS.Badge\u00a0to\u00a0the\u2011end\u00a0of\u2010\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Dependency Integration", + "description": "Integrates FoundationUI library into the project and ensures successful build.", + "source_line": null + }, + { + "name": "Integration Test Suite for FoundationUI", + "description": "Runs comprehensive tests covering Badge, Card, KeyValueRow, and Integration components to validate integration.", + "source_line": null + }, + { + "name": "Component Showcase Application", + "description": "Live demo app displaying all FoundationUI components across multiple screens.", + "source_line": null + }, + { + "name": "Documentation of Integration Patterns", + "description": "Technical documentation outlining how to integrate FoundationUI components into the system.", + "source_line": null + }, + { + "name": "Design System Guide Update", + "description": "Updates design system guide with migration roadmap and guidelines for using FoundationUI.", + "source_line": null + }, + { + "name": "Badge & Status Indicator Component", + "description": "Provides Badge UI component (DS.Badge) for displaying corruption, severity, and parse state indicators.", + "source_line": null + }, + { + "name": "Card Container Component", + "description": "Wrapper around DS.Card providing BoxDetailsCard functionality and layout.", + "source_line": null + }, + { + "name": "Section Header Wrapper", + "description": "Wrapper around DS.SectionHeader with \"BoxSectionHeader\"\u00a0.", + "source_line": null + }, + { + "name": "Key\u2011Value Row Component", + "description": "Custom wrapper for DS.KeyValueRow\u00a0\u2014\u00a0i.e.,\u00a0BoxMetadataRow.", + "source_line": null + }, + { + "name": "User Settings Panel Shell", + "description": "Floating settings panel UI that displays\u00a0\u2026", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4447, + "line_count": 90 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display_metrics.json b/DOCS/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display_metrics.json new file mode 100644 index 00000000..c6d83900 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display_metrics.json @@ -0,0 +1,143 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display.md", + "n_spec": 16, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Migrate metadata display patterns across the ISOInspector UI to use the FoundationUI DS.KeyValueRow component via a new BoxMetadataRow wrapper that supports label, value, and optional copyable action.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Audit all current metadata display patterns for row heights, spacing, font sizes, colors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Create BoxMetadataRow wrapper around DS.KeyValueRow with support for label, value, optional copyable action, inheriting dark mode adaptation and matching accessibility pattern from I1.1 and I1.2.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Refactor all metadata field displays to use BoxMetadataRow across ISO box metadata, parse results, issue summaries, codec/track info, file header details.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests for BoxMetadataRow component with \u226590% coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests validating layout, colors, dark mode adaptation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests confirming WCAG 2.1 AA compliance (\u226598% score).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests with copyable action behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests ensuring existing metadata displays still function correctly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add BoxMetadataRow to ComponentTestApp showcase screen.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update Design System Guide with migration patterns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verify zero SwiftLint violations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test coverage remains \u226580% across affected targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI components automatically handle dark mode; BoxMetadataRow must inherit this behavior via environment modifiers.", + "source_line": null + }, + { + "type": "invariant", + "description": "Copyable action pattern must provide visual/haptic feedback on successful copy and work on iOS, iPadOS, macOS.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxMetadataRow will be a wrapper around DS.KeyValueRow exposing label, value, optional CopyableAction configuration and conditional display of copy button.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxMetadataRow Component", + "description": "A reusable UI component that wraps FoundationUI's DS.KeyValueRow to display a label and value pair with optional copy-to-clipboard action, supporting dark mode and accessibility.", + "source_line": null + }, + { + "name": "Metadata Display Refactor", + "description": "System-wide migration of all metadata field displays (box metadata, parse results, codec/track info, file header details) to use the BoxMetadataRow component.", + "source_line": null + }, + { + "name": "Copyable Action Integration", + "description": "Implementation of copy-to-clipboard functionality for metadata values, including visual/haptic feedback and integration with existing CopyableAction patterns.", + "source_line": null + }, + { + "name": "Unit Test Suite for BoxMetadataRow", + "description": "Automated tests ensuring component behavior, state handling, and 90%+ code coverage.", + "source_line": null + }, + { + "name": "Snapshot Testing for Layout & Dark Mode", + "description": "Visual regression tests comparing rendered layouts, colors, and dark mode adaptation against approved baselines.", + "source_line": null + }, + { + "name": "Accessibility Compliance Tests", + "description": "Tests verifying WCAG\u202f2.1\u202fAA compliance with \u226598% score, covering VoiceOver labels and Dynamic Type support.", + "source_line": null + }, + { + "name": "Integration Tests for Copyable Behavior", + "description": "Simulated user interaction tests confirming copy action works across iOS, iPadOS, and macOS platforms.", + "source_line": null + }, + { + "name": "Regression Test Suite", + "description": "Tests ensuring existing metadata displays continue to function correctly after migration.", + "source_line": null + }, + { + "name": "ComponentTestApp Showcase Screen", + "description": "A screen in ComponentTestApp that demonstrates the BoxMetadataRow component in use.", + "source_line": null + }, + { + "name": "Design System Guide Update", + "description": "Documentation updates describing migration patterns, usage guidelines, and design tokens for BoxMetadataRow.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6121, + "line_count": 119 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work_metrics.json new file mode 100644 index 00000000..40e245db --- /dev/null +++ b/DOCS/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/218_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work.md", + "n_spec": 11, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user of ISOInspector UI, I want metadata display patterns to use the FoundationUI DS.KeyValueRow component via a BoxMetadataRow wrapper so that all metadata rows are consistent, accessible, and testable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All existing metadata displays in ParseTreeDetailView.swift, EncryptionSummary, and other views must be refactored to use BoxMetadataRow with correct layout, copyable behavior, and design system tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxMetadataRow component must expose public properties: label, value, layout (horizontal/vertical), copyable (bool) and conform to AgentDescribable protocol.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Component must support dark mode adaptation, WCAG 2.1 AA accessibility, dynamic type scaling, minimum touch target sizes, high contrast, reduce motion, and provide appropriate VoiceOver labels and hints.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests covering initialization, layout, copyable behavior, content variations, real\u2011world ISO metadata scenarios, agent describable conformance, integration in VStack/ScrollView, accessibility, dark mode, design system tokens, snapshot/layout consistency, and performance must total 60+ tests with \u226590% coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Showcase screen BoxMetadataRowScreen.swift must demonstrate all API variations, interactive controls for layout and copyable toggle, long text handling, real\u2011world ISO metadata examples, dark mode documentation, and accessibility features list.", + "source_line": null + }, + { + "type": "invariant", + "description": "The BoxMetadataRow component file must contain a single entity per file and be less than 400 lines in size.", + "source_line": null + }, + { + "type": "invariant", + "description": "All metadata display code must import FoundationUI and remove any deprecated metadataRow helper functions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wrap the existing DS.KeyValueRow from FoundationUI instead of creating a new custom component, leveraging design system tokens for typography, spacing, and color.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Test\u2011Driven Development (TDD) with 60+ unit tests to ensure quality and coverage before implementation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Adopt XP and PDD practices: incremental refactoring, continuous integration, single entity per file, and no @todo puzzles left.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxMetadataRow Component", + "description": "A SwiftUI view that wraps FoundationUI's DS.KeyValueRow to display metadata key-value pairs with optional copy-to-clipboard, horizontal/vertical layout, dark\u2011mode support and WCAG 2.1 AA accessibility.", + "source_line": null + }, + { + "name": "ParseTreeDetailView Metadata Refactor", + "description": "Updates ParseTreeDetailView to use BoxMetadataRow for all metadata rows, replacing Grid/GridRow patterns and adding copyable actions where needed.", + "source_line": null + }, + { + "name": "ComponentTestApp Showcase Screen", + "description": "An interactive screen in ComponentTestApp that demonstrates the BoxMetadataRow component with layout options, copyable toggle, real\u2011world ISO metadata examples, dark mode, and accessibility features.", + "source_line": null + }, + { + "name": "BoxMetadataRow Test Suite", + "description": "A comprehensive XCTest suite covering initialization, layout, copyability, content variations, real\u2011world metadata scenarios, agent describable conformance, integration, accessibility, dark mode, design system tokens, snapshot/layout consistency, and performance of the BoxMetadataRow component.", + "source_line": null + }, + { + "name": "Navigation Integration for Showcase", + "description": "Adds a new destination case (.boxMetadataRow) to ComponentTestApp's navigation enum and links it from the Components section, enabling users to navigate to the showcase screen.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 19443, + "line_count": 567 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display_metrics.json b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display_metrics.json new file mode 100644 index 00000000..873db67b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display_metrics.json @@ -0,0 +1,148 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/218_I1_3_Key_Value_Rows_Metadata_Display.md", + "n_spec": 16, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Migrate metadata display patterns across the ISOInspector UI to use the FoundationUI DS.KeyValueRow component via a new BoxMetadataRow wrapper that supports label, value, and optional copyable action.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Audit all current metadata display patterns (row heights, spacing, font sizes, colors).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Create BoxMetadataRow wrapper around DS.KeyValueRow supporting label, value, optional copyable action, inheriting dark mode and accessibility from FoundationUI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Refactor all metadata field displays to use BoxMetadataRow for ISO box metadata, parse results, issue summaries, codec/track info, file header details.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests for BoxMetadataRow component with \u226590% coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests validating layout, colors, dark mode adaptation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests confirming WCAG 2.1 AA compliance (\u226598% score).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests with copyable action behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests ensuring existing metadata displays still function correctly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add BoxMetadataRow to ComponentTestApp showcase screen.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update Design System Guide with migration patterns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verify zero SwiftLint violations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Maintain test coverage \u226580% across affected targets.", + "source_line": null + }, + { + "type": "invariant", + "description": "All Phase 0 tasks must be complete before starting this task.", + "source_line": null + }, + { + "type": "invariant", + "description": "I1.1 and I1.2 must be completed before starting this task.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxMetadataRow will wrap DS.KeyValueRow to provide consistent styling, dark mode inheritance, accessibility, and optional copyable action.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxMetadataRow Component", + "description": "A reusable UI component that wraps FoundationUI's DS.KeyValueRow to display a label and value pair with optional copy-to-clipboard action, inheriting dark mode and accessibility features.", + "source_line": null + }, + { + "name": "Metadata Display Audit Tool", + "description": "An internal process or script that inventories all current metadata display patterns across ISOInspector UI, documenting spacing, fonts, colors, and accessibility attributes.", + "source_line": null + }, + { + "name": "CopyableAction Integration", + "description": "Implementation of a copy-to-clipboard action for metadata values, providing visual/haptic feedback and supporting iOS, iPadOS, and macOS platforms.", + "source_line": null + }, + { + "name": "Metadata Migration Workflow", + "description": "A refactoring workflow that replaces existing metadata field displays with BoxMetadataRow across screens such as Box Details, Parse Results, Codec/Track info, and File Header details.", + "source_line": null + }, + { + "name": "Unit Test Suite for BoxMetadataRow", + "description": "Automated tests ensuring component behavior, state management, and API surface meet 90%+ coverage requirements.", + "source_line": null + }, + { + "name": "Snapshot Testing for Layout & Dark Mode", + "description": "Tests that capture UI snapshots of BoxMetadataRow in various states to validate layout, colors, and dark mode adaptation against approved baselines.", + "source_line": null + }, + { + "name": "Accessibility Compliance Tests", + "description": "Automated checks confirming WCAG\u202f2.1\u202fAA compliance with \u226598% score for the metadata display components.", + "source_line": null + }, + { + "name": "Integration Test Suite for Copyable Action", + "description": "Tests that simulate user interactions with the copy button, verifying clipboard behavior and feedback across platforms.", + "source_line": null + }, + { + "name": "Regression Test Suite for Existing Metadata Displays", + "description": "Tests ensuring that refactored metadata displays continue to function correctly without breaking existing UI behavior.", + "source_line": null + }, + { + "name": "ComponentTestApp Showcase Screen", + "description": "A screen in ComponentTestApp that demonstrates BoxMetadataRow usage within the design system showcase.", + "source_line": null + }, + { + "name": "Design System Guide Update", + "description": "Documentation updates that describe the migration patterns, component API, and styling guidelines for BoxMetadataRow.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6121, + "line_count": 119 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Complete Issue Description_metrics.json b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Complete Issue Description_metrics.json new file mode 100644 index 00000000..1e88636e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Complete Issue Description_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Complete Issue Description.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 560, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work_I1_3_metrics.json b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work_I1_3_metrics.json new file mode 100644 index 00000000..a93ced64 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work_I1_3_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/Summary_of_Work_I1_3.md", + "n_spec": 10, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user of ISOInspector UI, I want metadata display patterns to use FoundationUI DS.KeyValueRow via BoxMetadataRow so that the UI is consistent, accessible, and testable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All metadata displays in ParseTreeDetailView, EncryptionSubsection, and other views must be refactored to use BoxMetadataRow with correct layout, copyable behavior, and design system tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxMetadataRow component must expose label, value, layout, and copyable properties as defined, support horizontal/vertical layouts, and provide copy-to-clipboard functionality when enabled.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Component must pass 60+ unit tests covering initialization, layout, copyable, content variations, real\u2011world metadata, agent describable conformance, integration, accessibility, dark mode, design system tokens, snapshot, and performance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility compliance: WCAG\u202f2.1\u202fAA, VoiceOver labels, dynamic type support, minimum touch target size, reduce motion, high contrast, and copyable hints.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dark mode support: correct color adaptation for light/dark schemes, button visibility, layout preservation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Design system integration: use DS.Typography, DS.Spacing, DS.Color tokens consistently across the component and previews.", + "source_line": null + }, + { + "type": "invariant", + "description": "BoxMetadataRow must be a single entity per file and file size <400 lines.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wrap FoundationUI DS.KeyValueRow in a new SwiftUI view (BoxMetadataRow) to provide ISOInspector\u2011specific API, layout options, and copyable action instead of custom Grid/GridRow implementations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use TDD with 60+ tests, XP incremental refactoring, PDD puzzle\u2011driven approach, and single-entity file structure for maintainability.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxMetadataRow Component", + "description": "A SwiftUI view that wraps FoundationUI's DS.KeyValueRow to display metadata key-value pairs with optional copy-to-clipboard functionality and support for horizontal or vertical layout.", + "source_line": null + }, + { + "name": "ParseTreeDetailView Metadata Refactor", + "description": "Updates to ParseTreeDetailView that replace custom Grid/GridRow patterns with BoxMetadataRow components for displaying ISO box metadata, status rows, and encryption subsections.", + "source_line": null + }, + { + "name": "ComponentTestApp Showcase Screen", + "description": "An interactive screen in ComponentTestApp demonstrating the BoxMetadataRow component with various layouts, copyable options, dark mode, accessibility features, and real\u2011world ISO metadata examples.", + "source_line": null + }, + { + "name": "Navigation Integration for BoxMetadataRow", + "description": "Adds a new destination case to the ComponentTestApp navigation enum and links it from the Components section, enabling users to navigate to the showcase screen.", + "source_line": null + }, + { + "name": "BoxMetadataRow Test Suite", + "description": "A comprehensive XCTest suite covering initialization, layout, copyable behavior, content variations, real\u2011world metadata scenarios, agent describability, integration, accessibility, dark mode, design system tokens, snapshot/layout consistency, and performance of the BoxMetadataRow component.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 19443, + "line_count": 567 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/blocked_metrics.json b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/blocked_metrics.json new file mode 100644 index 00000000..866ad6f3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/blocked_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/blocked.md", + "n_spec": 11, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blockers change to maintain day-to-day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real-world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be granted before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark once macOS hardware with the 1\u202fGiB performance fixture is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must run with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, collect runtime and RSS metrics, and archive them under Documentation/Performance/.", + "source_line": null + }, + { + "type": "invariant", + "description": "The todo.md entry \"Execute the macOS 1 GiB lenient\u2011v\u2026\" should remain open until benchmark run completes and metrics published.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines in PERFORMANCE.md after manual profiling with Xcode Instruments on macOS developer machine.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Time Profiler must measure render times <100\u202fms, Allocations instrument memory profiling <5\u202fMB, Core Animation 60\u202fFPS on device, and tests run on iOS\u00a017 and macOS\u00a014 devices.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines after manual benchmark testing across multiple platforms (iOS\u00a017..iPadOS\u00a017) once the required hardware is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time <10s for clean build, binary size <500\u202fKB release; memory footprint <5\u202fMB per screen; 60\u202fFPS on all platforms during interactions; BoxTreePattern with 1000+ nodes performance tested and baseline documented.", + "source_line": null + }, + { + "type": "user_story", + "description": "Compile cross\u2011platform test results and create a report after testing on iOS\u00a0\u2026..\u00a0iPad\u2011?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Media Assets", + "description": "Imports licensed Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H media assets into the system and refreshes regression baselines for tolerant parsing and export validation.", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Runs a lenient\u2011vs\u2011strict performance benchmark on macOS with a 1\u202fGiB payload, collects runtime and RSS metrics, and archives results in Documentation/Performance.", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publishes collected performance baseline data for FoundationUI Phase\u00a05.2 into PERFORMANCE.md after manual profiling or benchmarking.", + "source_line": null + }, + { + "name": "Generate Manual Performance Report", + "description": "Documents findings from Xcode Instruments (Time Profiler, Allocations, Core Animation) and other manual profiling tasks into a performance report.", + "source_line": null + }, + { + "name": "Compile Cross\u2011Platform Test Results", + "description": "Aggregates results from device and simulator tests across iOS, macOS, and iPadOS, including dark mode, RTL, and locale checks, into a cross\u2011platform report.", + "source_line": null + }, + { + "name": "Finalize Accessibility Sign\u2011off", + "description": "Completes manual accessibility validation (VoiceOver, keyboard navigation, dynamic type, contrast, etc.) and issues final accessibility sign\u2011off.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4468, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/next_tasks_metrics.json new file mode 100644 index 00000000..916f5dad --- /dev/null +++ b/DOCS/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/next_tasks_metrics.json @@ -0,0 +1,128 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/219_I1_3_Key_Value_Rows_Metadata_Display/next_tasks.md", + "n_spec": 14, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create SDK Tolerant Parsing Documentation for ISOInspectorKit", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation includes DocC article TolerantParsingGuide.md in specified path", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add code examples for tolerant parsing setup and ParseIssueStore usage", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update inline documentation for ParsePipeline.Options, .strict, .tolerant", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Link new guide from main Documentation.md Topics section", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verify examples with test file in Tests/ISOInspectorKitTests/", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate FoundationUI dependency into ISOInspectorKit project", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI dependency is added and builds successfully", + "source_line": null + }, + { + "type": "invariant", + "description": "Zero SwiftLint violations, \u226580% test coverage after integration", + "source_line": null + }, + { + "type": "user_story", + "description": "Create 123 comprehensive integration tests for FoundationUI components", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests cover Badge, Card, KeyValueRow and other components with 33/43/40/7 tests", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility compliance \u226598% WCAG 2.1 AA for badge component", + "source_line": null + }, + { + "type": "user_story", + "description": "Migrate Badge & Status Indicators to DS.Badge", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Migrate?\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Tolerant Parsing Documentation", + "description": "DocC article explaining SDK tolerant parsing setup and ParseIssueStore usage, including code examples and inline documentation updates for ParsePipeline.Options", + "source_line": null + }, + { + "name": "FoundationUI Dependency Integration", + "description": "Adds FoundationUI as a dependency to the project and ensures it builds successfully", + "source_line": null + }, + { + "name": "Integration Test Suite", + "description": "A comprehensive suite of 123 integration tests covering Badge, Card, KeyValueRow, and Integration components", + "source_line": null + }, + { + "name": "Component Showcase App", + "description": "Live ComponentTestApp providing over 14 screens showcasing FoundationUI components", + "source_line": null + }, + { + "name": "Badge & Status Indicators Migration", + "description": "Migrates CorruptionBadge, SeverityBadge, ParseStateBadge to DS.Badge with unit tests and accessibility compliance", + "source_line": null + }, + { + "name": "Card Containers & Sections Implementation", + "description": "Implements Card container and section components in FoundationUI", + "source_line": null + }, + { + "name": "Key-Value Rows & Metadata Display Wrapper", + "description": "Creates BoxMetadataRow wrapper around DS.KeyValueRow for metadata display with extensive testing", + "source_line": null + }, + { + "name": "Floating Settings Panel Shell", + "description": "Implements SettingsPanelScene with FoundationUI cards, macOS NSPanel host, iPad/iOS sheet presentation and accessibility hooks", + "source_line": null + }, + { + "name": "Settings Persistence and Reset Wiring", + "description": "Threads permanent changes through UserPreferencesStore, updates session settings, adds reset actions and logs", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5229, + "line_count": 98 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/C2_Integrate_Outline_Explorer_With_Streaming_metrics.json b/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/C2_Integrate_Outline_Explorer_With_Streaming_metrics.json new file mode 100644 index 00000000..191a801a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/C2_Integrate_Outline_Explorer_With_Streaming_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/C2_Integrate_Outline_Explorer_With_Streaming.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Connect the SwiftUI outline explorer to the existing Combine session bridge so that live parse events populate and update the tree view without manual refresh.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tree view subscribes to the session publisher and displays root and nested boxes as soon as events arrive, preserving order.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting nodes triggers detail/hex requests using identifiers without blocking incoming updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming updates remain responsive (target <200\u202fms latency) and keep the outline in sync with parser completion states.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline search/filter controls continue to operate against the live data set without crashing or stale content.", + "source_line": null + }, + { + "type": "invariant", + "description": "Memory usage stays bounded when handling large (>10k node) trees\u2014prefer incremental append over full array rebuilds.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing Combine stores to drive a view model that batches updates for SwiftUI diffing; consider @MainActor isolation for UI mutations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Verify compatibility with forthcoming detail/hex stores (task C3) to avoid conflicting data ownership.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add lightweight instrumentation/logging to observe event-to-UI latency during integration testing.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Outline Explorer Tree View", + "description": "Displays a hierarchical tree of parsed nodes in SwiftUI, rendering >10k nodes smoothly and updating live as parse events arrive.", + "source_line": null + }, + { + "name": "Session Publisher Subscription", + "description": "Subscribes to Combine session publisher to receive parse events and materialize them into UI view model updates.", + "source_line": null + }, + { + "name": "Node Selection Handler", + "description": "Handles user selection of tree nodes, triggering detail and hex data requests via identifiers without blocking incoming updates.", + "source_line": null + }, + { + "name": "Live Update Batching Engine", + "description": "Batches incoming parse events for SwiftUI diffing, using @MainActor isolation to batch updates efficiently and keep latency <200\u202fms.", + "source_line": null + }, + { + "name": "Incremental Tree Builder", + "description": "Appends new nodes incrementally to the existing tree structure instead of rebuilding full arrays, ensuring bounded memory usage with large trees.", + "source_line": null + }, + { + "name": "Search/Filter Control for Live Data", + "description": "Provides search and filter UI controls that operate against the live outline data set without crashing or showing stale content.", + "source_line": null + }, + { + "name": "Instrumentation & Logging Module", + "description": "Logs event-to-UI latency and other metrics to observe integration performance during testing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2070, + "line_count": 49 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/Summary_of_Work_metrics.json new file mode 100644 index 00000000..02ff202c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/Summary_of_Work.md", + "n_spec": 5, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate Outline Explorer with Streaming Sessions to display parse events immediately", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeOutlineViewModel must be bound to Combine-backed ParseTreeStore snapshots so that streaming parse events materialize in the outline explorer", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Latency instrumentation using Logger signposts and timestamp propagation on ParseTreeSnapshot must be implemented to observe event-to-UI timing", + "source_line": null + }, + { + "type": "invariant", + "description": "SwiftUI explorer wiring must rely on the new binding path and not use preview-only sample data injection", + "source_line": null + }, + { + "type": "user_story", + "description": "Add additional outline filters for box categories and streaming metadata (tracked under @todo #6)", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeOutlineViewModel Binding to ParseTreeStore Snapshots", + "description": "Binds the outline view model to Combine-backed parse tree snapshots so streaming parse events are immediately reflected in the outline explorer.", + "source_line": null + }, + { + "name": "Latency Instrumentation for Outline Explorer", + "description": "Adds Logger signposts and timestamp propagation on ParseTreeSnapshot to measure event-to-UI timing for outline updates.", + "source_line": null + }, + { + "name": "SwiftUI Explorer Wiring Update", + "description": "Updates SwiftUI wiring to use new binding path and removes preview-only sample data injection, ensuring the explorer uses live data.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 798, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/next_tasks_metrics.json new file mode 100644 index 00000000..484fa504 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/21_C2_Integrate_Outline_Explorer_With_Streaming/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Draft C3 detail/hex stores that subscribe to the Combine bridge for payload slices and metadata panels.", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate the outline explorer with real file ingestion so streaming parse sessions drive live snapshots.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend outline filters to cover box categories and streaming metadata (tracked via @todo #6).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "C3 Detail/Hex Stores Subscription", + "description": "Subscribe to the Combine bridge for payload slices and metadata panels", + "source_line": null + }, + { + "name": "Outline Explorer Integration with Real File Ingestion", + "description": "Integrate outline explorer with real file ingestion so streaming parse sessions drive live snapshots", + "source_line": null + }, + { + "name": "Extended Outline Filters for Box Categories and Streaming Metadata", + "description": "Extend outline filters to cover box categories and streaming metadata", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 342, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/220_I1_4_Form_Controls_Input_Wrappers_metrics.json b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/220_I1_4_Form_Controls_Input_Wrappers_metrics.json new file mode 100644 index 00000000..cf8d5384 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/220_I1_4_Form_Controls_Input_Wrappers_metrics.json @@ -0,0 +1,153 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/220_I1_4_Form_Controls_Input_Wrappers.md", + "n_spec": 18, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Wrap FoundationUI form components (DS.TextInput, DS.Toggle, DS.Picker) and migrate existing input patterns in settings and configuration dialogs to use these standardized controls.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxTextInputView wrapper component created with ISO-specific styling, placeholder, validation, keyboard types, and accessibility support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxToggleView wrapper component created with label, disabled state, and accessibility labels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxPickerView wrapper component created with custom selection logic, binding to Codable enums, and accessibility support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Audit existing form inputs across codebase (settings panel, configuration dialogs, search/filter controls) and document findings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Migrate at least 3 critical form locations to use new wrappers, prioritizing settings panel inputs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests for all three wrapper components covering input validation, state binding, accessibility attributes with \u226590% coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests (light/dark modes) for empty, filled, error, and disabled states of all three components on macOS, iOS, iPadOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests ensuring VoiceOver labels, focus management, keyboard interaction with \u226598% audit score.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update Component Showcase with form control examples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add DocC documentation for wrapper components and update Technical Spec with Form Controls subsection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update MIGRATION.md with old\u2192new form control mapping.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftLint violations: 0; no force unwraps or implicitly unwrapped optionals; all components marked @MainActor where appropriate.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI Swift Package must be available in ISOInspectorApp before integration.", + "source_line": null + }, + { + "type": "invariant", + "description": "Integration test infrastructure must be in place prior to component implementation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxTextInputView public API includes @Binding var text, placeholder, validationError, keyboardType, onEditingChanged.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxToggleView public API includes @Binding var isOn, label, disabled.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxPickerView generic over selection type T: Hashable with @Binding var selection, label, options.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxTextInputView", + "description": "Wrapper component exposing a styled text input field with placeholder, validation error display, keyboard type support, and binding to external text state.", + "source_line": null + }, + { + "name": "BoxToggleView", + "description": "Wrapper component providing a styled toggle switch with label, disabled state handling, accessibility labeling, and binding to an external boolean state.", + "source_line": null + }, + { + "name": "BoxPickerView", + "description": "Generic wrapper for a picker control that binds to a selectable value, presents options with labels, supports Codable enums or hashable types, and adapts platform-specific presentation.", + "source_line": null + }, + { + "name": "FormControlAudit", + "description": "Process of locating and cataloging existing form inputs across the codebase for migration purposes.", + "source_line": null + }, + { + "name": "MigrationPathDocumentation", + "description": "Documented mapping from legacy input patterns to new wrapper components, including migration steps and affected UI locations.", + "source_line": null + }, + { + "name": "UnitTestsForFormControls", + "description": "Automated tests verifying interaction behavior, state binding, validation, and accessibility of each wrapper component.", + "source_line": null + }, + { + "name": "SnapshotTestsForFormControls", + "description": "Visual regression tests capturing light/dark mode appearances for various states (empty, filled, error, disabled) of the form control wrappers.", + "source_line": null + }, + { + "name": "AccessibilityTestsForFormControls", + "description": "Automated checks ensuring VoiceOver labels, focus management, keyboard navigation, and audit scores meet accessibility standards.", + "source_line": null + }, + { + "name": "ComponentShowcaseUpdates", + "description": "Updated showcase pages displaying examples of the new form control wrappers in use.", + "source_line": null + }, + { + "name": "DocCDocumentationForWrappers", + "description": "Generated documentation for each wrapper component\u2019s public API and usage examples.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9322, + "line_count": 260 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs_metrics.json b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs_metrics.json new file mode 100644 index 00000000..36ae762d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_Resolve_Indicator_TODOs.md", + "n_spec": 8, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate DS.Indicator component into ISOInspectorApp views to provide compact visual status cues alongside existing badges.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Indicator component must be added in ParseTreeDetailView.swift at lines 143-179 with size .small and spacing DS.Spacing.s, including accessibility label and tooltip.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Indicator component must be added in ParseTreeOutlineView.swift at lines 550-654 with size .mini and spacing DS.Spacing.xs, including accessibility label and tooltip.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Both indicators use descriptorBadgeLevel() helper to map status levels to BadgeLevel equivalents (info, warning, error, success).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All @todo #I1.1 markers are removed from the source files.", + "source_line": null + }, + { + "type": "invariant", + "description": "Indicator component must not increase row height or alter layout beyond specified spacing.", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility labels and tooltips must be fully configured for VoiceOver support.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing FoundationUI Indicator component instead of creating a new one, reusing design tokens DS.Spacing.s/xs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeDetailView Metadata Status Row", + "description": "Displays metadata rows in the parse tree detail view with a small DS.Indicator dot and a ParseTreeStatusBadge, providing compact visual status cues, accessibility labels, and tooltips.", + "source_line": null + }, + { + "name": "ParseTreeOutlineView Tree Node Status", + "description": "Shows tree nodes in the parse tree outline view with a mini DS.Indicator dot next to a ParseTreeStatusBadge, offering ultra-compact status indicators, minimal spacing, accessibility support, and tooltips.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7284, + "line_count": 201 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1344bb7f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_of_Work_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/Summary_of_Work.md", + "n_spec": 15, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create a BoxToggleView wrapper component that wraps native SwiftUI Toggle and supports custom accessibility labels, disabled state, and future DS.Toggle integration.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create a BoxTextInputView wrapper component that wraps native SwiftUI TextField with built\u2011in validation error display, platform\u2011adaptive keyboard types, copyable text support, and future DS.TextInput integration.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create a BoxPickerView wrapper component that wraps native SwiftUI Picker with generic type support, platform\u2011adaptive styles (segmented vs. menu), accessibility labels including selected option, and future DS.Picker integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All three components must be implemented in separate files under 300 lines each following One File = One Entity principle.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests covering all code paths with \u226590% coverage must exist for each component.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot test placeholders for light/dark modes and all component states must be present, pending snapshot library integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests achieving \u226598% WCAG 2.1 AA compliance score must be written.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Components must expose no magic numbers in public APIs and use design token placeholders for future styling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All incomplete FoundationUI integration work is marked with @todo #220 comments.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Concurrency annotations: all view creation and test code must be annotated with @MainActor.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system shall never use force unwraps; all optionals are safely handled.", + "source_line": null + }, + { + "type": "invariant", + "description": "SwiftLint violations must be zero once the build environment is available.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use native SwiftUI components as placeholders until DS components are integrated, allowing functional prototypes and test coverage.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Adopt PDD (Puzzle\u2011Driven Development) to track incomplete work via @todo #220 markers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Apply design tokens (DS.Spacing, DS.Radius, DS.Color\u2026 ) for future consistency across components.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxToggleView", + "description": "A SwiftUI wrapper component that exposes a toggle control with custom accessibility labels, disabled state support, and placeholder for DS.Toggle integration.", + "source_line": null + }, + { + "name": "BoxTextInputView", + "description": "A SwiftUI wrapper component that exposes a text input field with built\u2011in validation error display, platform\u2011adaptive keyboard types, copyable text support, and accessibility announcements for errors.", + "source_line": null + }, + { + "name": "BoxPickerView", + "description": "A SwiftUI wrapper component that exposes a picker control supporting generic types (enum, string, integer), platform\u2011adaptive styles (segmented vs. menu), and accessibility labels including the selected option.", + "source_line": null + }, + { + "name": "FormControlsUnitTests", + "description": "A comprehensive unit test suite for the form control components covering initialization, property handling, accessibility, disabled state, validation, keyboard type, generic type support, style overrides, and component composition.", + "source_line": null + }, + { + "name": "FormControlsSnapshotTests", + "description": "Placeholder snapshot tests for the form control components across light/dark modes, all states (eaw?\u2026", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 11879, + "line_count": 328 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/blocked_metrics.json b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/blocked_metrics.json new file mode 100644 index 00000000..46000844 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/blocked_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/blocked.md", + "n_spec": 12, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be obtained before importing licensed assets and refreshing regression baselines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After unblocking, import the licensed assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real-world payloads.", + "source_line": null + }, + { + "type": "invariant", + "description": "macOS hardware with the 1 GiB performance fixture must be available before executing the lenient-versus-strict benchmark.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After unblocking, execute the benchmark with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824, collect runtime and RSS metrics, and archive them under Documentation/Performance/.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI Phase 5.2 performance profiling tasks require manual execution with Xcode Instruments on macOS developer machine.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After unblocking, publish performance baselines in PERFORMANCE.md.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI Phase 5.2 performance benchmarks require multi-platform testing on actual hardware (iOS 17, macOS 14, iPadOS 17).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After unblocking, integrate CI with performance gates.", + "source_line": null + }, + { + "type": "invariant", + "description": "Cross\u2011platform testing requires testing on actual devices and simulators across iOS/macOS/iPadOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After unblocking, compile test results and create cross\u2011platform report.", + "source_line": null + }, + { + "type": "invariant", + "description": "Manual accessibility testing requires VoiceOver and accessibility features testing on real devices.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After unblocking, final accessibility sign\u2011off.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Media Assets", + "description": "Import licensed Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H media assets into the system and refresh regression baselines for tolerant parsing and export scenarios.", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run a lenient\u2011vs\u2011strict performance benchmark on macOS using a 1\u202fGiB payload, collect runtime and RSS metrics, and archive results in Documentation/Performance.", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish collected performance baselines for FoundationUI Phase\u202f5.2 into PERFORMANCE.md after profiling or benchmarking tasks are completed.", + "source_line": null + }, + { + "name": "Generate Cross\u2011Platform Test Report", + "description": "Compile test results from iOS, macOS, and iPadOS device testing (including dark mode, RTL, locale) into a cross\u2011platform report.", + "source_line": null + }, + { + "name": "Finalize Accessibility Sign\u2011off", + "description": "Complete manual accessibility validation (VoiceOver, keyboard navigation, dynamic type, contrast, etc.) and produce final accessibility sign\u2011off documentation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4468, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/next_tasks_metrics.json new file mode 100644 index 00000000..f4ed74b8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/next_tasks_metrics.json @@ -0,0 +1,133 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/220_I1_4_Form_Controls_Input_Wrappers/next_tasks.md", + "n_spec": 16, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI components for form controls and input wrappers (I1.4) including wrapping DS.TextInput, DS.Toggle, DS.Picker, migrating existing patterns, ensuring \u226590% test coverage, WCAG 2.1 AA accessibility.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test suite coverage for I1.4 must be at least 90%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility validation for I1.4 must meet WCAG 2.1 AA standards.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement advanced layouts and navigation using FoundationUI grid and spacing system (I1.5), migrate sidebar and detail view layouts, validate responsive behavior across device sizes, support accessibility and dark mode.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Responsive behavior must be validated across all target device sizes for I1.5.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create SDK tolerant parsing documentation (T6.3) including DocC article, code examples, inline docs updates, linking guide from main Documentation.md, and verifying examples with test file.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocC article TolerantParsingGuide.md must be created in specified path.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Code examples for tolerant parsing setup and ParseIssueStore usage must be included.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Inline documentation for ParsePipeline.Options .strict and .tolerant must be updated.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Guide must be linked from main Documentation.md Topics section.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Examples verified with test file in Tests/ISOInspectorKitTests.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement Floating Settings Panel Shell (C21) with FoundationUI cards, macOS NSPanel host, remembered frame, keyboard shortcut \u2318,, iPad/iOS sheet detents, VoiceOver focus start at selected section, snapshot and accessibility tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot and accessibility tests must validate both macOS and iPad/iOS presentations for C21.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement Persistence + Reset Wiring (C22) threading permanent changes through UserPreferencesStore, updating DocumentSessionController with SessionSettingsPayload mutations, adding reset actions, logging, and DocC documentation of layered persistence behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reset actions must include \"Reset Global\" and \"Reset Session\" options.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI integration tasks must only proceed after Phase 0 is complete.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Badge & Status Indicators", + "description": "Provides badge and status indicator components for UI", + "source_line": null + }, + { + "name": "FoundationUI Card Containers & Sections", + "description": "Offers card container and section layout components", + "source_line": null + }, + { + "name": "FoundationUI Key-Value Rows & Metadata Display", + "description": "Displays key-value rows and metadata in the UI", + "source_line": null + }, + { + "name": "FoundationUI Form Controls & Input Wrappers", + "description": "Wraps FoundationUI form components (TextInput, Toggle, Picker) for settings and configuration dialogs with testing and accessibility compliance", + "source_line": null + }, + { + "name": "FoundationUI Advanced Layouts & Navigation", + "description": "Implements grid-based layout patterns, responsive behavior, dark mode and navigation support", + "source_line": null + }, + { + "name": "SDK Tolerant Parsing Documentation", + "description": "DocC article and code examples documenting tolerant parsing options in the SDK", + "source_line": null + }, + { + "name": "User Settings Panel Floating Preferences Shell", + "description": "Implements a floating settings panel with FoundationUI cards for macOS and iPad/iOS, including keyboard shortcuts and VoiceOver focus", + "source_line": null + }, + { + "name": "User Settings Persistence & Reset Wiring", + "description": "Handles persistence of permanent and session settings via UserPreferencesStore and provides reset actions", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3231, + "line_count": 70 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/221_I1_5_Advanced_Layouts_Navigation_metrics.json b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/221_I1_5_Advanced_Layouts_Navigation_metrics.json new file mode 100644 index 00000000..d48455a6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/221_I1_5_Advanced_Layouts_Navigation_metrics.json @@ -0,0 +1,148 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/221_I1_5_Advanced_Layouts_Navigation.md", + "n_spec": 17, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement layout patterns and navigation structures using FoundationUI's grid system, spacing tokens, and responsive design capabilities.", + "source_line": null + }, + { + "type": "user_story", + "description": "Migrate the app's sidebar and detail view layouts to use FoundationUI patterns while ensuring accessibility, dark mode support, and responsive behavior across all platform sizes (iPhone SE, iPhone 15 Pro Max, iPad, macOS).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All manual padding/margins replaced with DS.Spacing tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Sidebar layout uses DS.SidebarPattern or compatible patterns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail panels use DS.Card for visual hierarchy.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Responsive layout tested on iPhone SE, iPhone 15 Pro Max, iPad, macOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dark mode adaptation validated across all layouts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit test coverage \u226580% for new/modified components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests pass for all device/platform variants.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests pass (VoiceOver, keyboard, Dynamic Type).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero SwiftLint violations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updated in technical spec and design guide.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DOCS/MIGRATION.md includes layout refactoring notes.", + "source_line": null + }, + { + "type": "invariant", + "description": "All existing app functionality remains operational (no breaking changes).", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI components coexist with native SwiftUI during transition.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use FoundationUI grid system, spacing tokens, and responsive design capabilities for layout patterns.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement SidebarLayoutContainer, DetailPanelLayout, ResponsiveGrid as new pattern components.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SidebarLayoutContainer", + "description": "FoundationUI grid-based container for the app sidebar using DS.SidebarPattern and spacing tokens", + "source_line": null + }, + { + "name": "DetailPanelLayout", + "description": "Card\u2011based layout for detail panels, applying DS.Card and DS.KeyValueRow components with spacing tokens", + "source_line": null + }, + { + "name": "ResponsiveGrid", + "description": "Wrapper around FoundationUI\u2019s grid system to provide responsive column layouts across device sizes", + "source_line": null + }, + { + "name": "ContentView Refactor", + "description": "Main content view updated to use FoundationUI patterns, spacing tokens, and platform adaptation contexts", + "source_line": null + }, + { + "name": "Sidebar View Refactor (BoxesSidebar.swift)", + "description": "Refactored sidebar using FoundationUI grid, DS.Spacing, and responsive breakpoints for iPhone/iPad", + "source_line": null + }, + { + "name": "Detail View Refactor (BoxDetailView.swift)", + "description": "Replaced manual padding with DS.Spacing tokens, used DS.Card for sections, ensured dark mode adaptation", + "source_line": null + }, + { + "name": "LayoutPatternTests", + "description": "Unit tests validating layout components behavior and spacing token usage", + "source_line": null + }, + { + "name": "LayoutSnapshotTests", + "description": "Snapshot tests for all device sizes, light/dark modes, orientations", + "source_line": null + }, + { + "name": "ResponsiveLayoutTests", + "description": "Tests for size\u2011class adaptation and breakpoint behavior across platforms", + "source_line": null + }, + { + "name": "LayoutAccessibilityTests", + "description": "VoiceOver, keyboard navigation, dynamic type and contrast compliance tests", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 11189, + "line_count": 283 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1e823a39 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/Summary_of_Work_metrics.json @@ -0,0 +1,133 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/Summary_of_Work.md", + "n_spec": 12, + "n_func": 12, + "intent_atoms": [ + { + "type": "user_story", + "description": "Migrate app layout components to use FoundationUI design system tokens for consistent spacing, radius, and responsive design across all platform sizes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All hardcoded spacing values in AppShellView.swift, ParseTreeOutlineView.swift, and core layout of ParseTreeDetailView.swift are replaced with DS.Spacing tokens (xxs, xs, s, m, l, xl).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All hardcoded corner radius values in the same files are replaced with DS.Radius tokens or expressions using DS.Radius.card + 4.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Token validation tests cover new tokens and verify ordering, positivity, uniqueness, and platform-agnostic behavior.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Responsive layout is verified on iPhone SE, iPhone 15 Pro Max, iPad portrait/landscape, macOS variable window sizes, dark mode, VoiceOver navigation flow, and Dynamic Type support XS-XXXL.", + "source_line": null + }, + { + "type": "invariant", + "description": "Design system tokens must be used exclusively for spacing and corner radius; no magic numbers allowed.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "FoundationUI design tokens are extended with DS.Spacing.xxs (4pt) and DS.Spacing.xs (6pt) to replace frequent hardcoded values.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "DS.Radius.card + 4 is used for custom large radius where needed instead of a raw numeric value.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "@todo markers are added for remaining spacing:2 instances to defer migration until later puzzles.", + "source_line": null + }, + { + "type": "user_story", + "description": "Complete migration of ParseTreeDetailView.swift sections (encryptionSection, userNotesSection etc.) to use DS.Spacing and DS.Radius tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All section functions in ParseTreeDetailView.swift must use DS.Spacing and DS.Radius tokens instead of hardcoded values.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider adding DS.Spacing.xxxs (2pt) token if usage justifies it, as part of optional puzzle I1.5.2.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DS.Spacing.xxs Token", + "description": "Design system token representing 4pt spacing for extra tight layout elements.", + "source_line": null + }, + { + "name": "DS.Spacing.xs Token", + "description": "Design system token representing 6pt spacing for dense UI elements.", + "source_line": null + }, + { + "name": "AppShellView Layout Component", + "description": "UI component that defines the overall app shell layout using FoundationUI spacing and radius tokens.", + "source_line": null + }, + { + "name": "Sidebar Layout", + "description": "Section of AppShellView responsible for rendering the sidebar with consistent spacing.", + "source_line": null + }, + { + "name": "CorruptionWarningRibbon Component", + "description": "UI element displaying a warning ribbon, styled with DS.Spacing and DS.Radius tokens.", + "source_line": null + }, + { + "name": "DocumentLoadFailureBanner Component", + "description": "Banner component shown when document loading fails, using Foundation UI tokens.", + "source_line": null + }, + { + "name": "OnboardingView Layout", + "description": "Component that presents onboarding screens with standardized spacing.", + "source_line": null + }, + { + "name": "RecentRow Component", + "description": "UI row in the sidebar or list showing recent items; currently has a TODO for spacing token.", + "source_line": null + }, + { + "name": "ParseTreeExplorerView", + "description": "VStack and HStack layout for exploring parse trees, using DS.Spacing tokens.", + "source_line": null + }, + { + "name": "ParseTreeOutlineFilterBar", + "description": "Filter bar UI with severity and category filters, styled with Foundation tokens.", + "source_line": null + }, + { + "name": "ParseTreeOutlineRowView", + "description": "Row view in the outline tree displaying individual parse tree nodes.", + "source_line": null + }, + { + "name": "ParseTreeDetailView Layout", + "description": "Main layout for detailed view of a parsed tree node, using DS.Spacing and DS.Radius.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9541, + "line_count": 241 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/blocked_metrics.json b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/blocked_metrics.json new file mode 100644 index 00000000..69568bd2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/blocked_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/blocked.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "Import Licensed Media Assets", + "description": "Import licensed Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H media assets into the system and refresh regression baselines for tolerant parsing and export scenarios.", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run a lenient\u2011vs\u2011strict performance benchmark on macOS using a 1\u202fGiB payload, collect runtime and RSS metrics, and archive results in Documentation/Performance.", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish collected performance baselines for FoundationUI Phase\u00a05.2 into PERFORMANCE.md after profiling or benchmarking tasks are completed.", + "source_line": null + }, + { + "name": "Generate Cross\u2011Platform Test Report", + "description": "Compile test results from iOS, macOS, and iPadOS devices/simulators into a cross\u2011platform report covering size classes, dark mode, RTL, locale, and orientation.", + "source_line": null + }, + { + "name": "Finalize Accessibility Sign\u2011off", + "description": "Complete manual accessibility testing (VoiceOver, keyboard navigation, dynamic type, contrast, etc.) and provide final sign\u2011off for the system.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4468, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/next_tasks_metrics.json new file mode 100644 index 00000000..97d3941d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/next_tasks_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/221_I1_5_Advanced_Layouts_Navigation/next_tasks.md", + "n_spec": 14, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI components for Badge & Status Indicators", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate FoundationUI components for Card Containers & Sections", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate FoundationUI components for Key-Value Rows & Metadata Display", + "source_line": null + }, + { + "type": "user_story", + "description": "Integrate FoundationUI components for Form Controls & Input Wrappers", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI component integration replaces native SwiftUI with DS components", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot testing library integration", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Form migration in settings/dialogs", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement Advanced Layouts & Navigation using FoundationUI grid and spacing system", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Migrate sidebar and detail view layouts", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validate responsive behavior across device sizes", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility and dark mode support", + "source_line": null + }, + { + "type": "user_story", + "description": "Create SDK Tolerant Parsing Documentation", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Create DocC article \"TolerantParsingGuide.md\" in specified path", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add code examples for tolerant parsing setup..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Badge & Status Indicators", + "description": "Provides badge and status indicator components for UI", + "source_line": null + }, + { + "name": "FoundationUI Card Containers & Sections", + "description": "Offers card container and section layout components", + "source_line": null + }, + { + "name": "FoundationUI Key-Value Rows & Metadata Display", + "description": "Displays key-value rows and metadata in the interface", + "source_line": null + }, + { + "name": "FoundationUI Form Controls & Input Wrappers", + "description": "Wraps form controls with FoundationUI styling and behavior", + "source_line": null + }, + { + "name": "FoundationUI Advanced Layouts & Navigation", + "description": "Implements advanced layout patterns, navigation, responsive design, accessibility and dark mode support using FoundationUI grid and spacing system", + "source_line": null + }, + { + "name": "SDK Tolerant Parsing Documentation", + "description": "DocC article and code examples for tolerant parsing setup and ParseIssueStore usage in the SDK", + "source_line": null + }, + { + "name": "User Settings Panel Floating Preferences Shell", + "description": "Implements a floating settings panel scene with FoundationUI cards, separate permanent and session groups, platform-specific presentation", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3243, + "line_count": 69 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/222_C21_Floating_Settings_Panel_metrics.json b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/222_C21_Floating_Settings_Panel_metrics.json new file mode 100644 index 00000000..88c0c4bb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/222_C21_Floating_Settings_Panel_metrics.json @@ -0,0 +1,163 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/222_C21_Floating_Settings_Panel.md", + "n_spec": 17, + "n_func": 13, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build a floating or modal user settings panel that consolidates preference management across macOS, iPadOS, and iOS platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SettingsPanelView implemented with FoundationUI cards and clearly labeled sections for permanent vs. session settings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Platform-adaptive presentation: macOS floating NSPanel or detent-based sheet anchored to current document window; iPadOS/iOS modal sheet with drag-to-dismiss, full-screen on iPhone.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard shortcut support (\u2318,) toggles panel open/closed consistently across platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Permanent settings persist correctly across app relaunch (verified by unit + UI tests).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session settings survive document reopen but do not leak to other sessions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver focus starts on the first control in the previously active section; all interactive elements have accessible labels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reset affordances: \"Reset to Global\" clears all permanent settings overrides and reloads from defaults; \"Reset Session\" clears only the current session-scoped payload.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot tests pass for light/dark modes and all platform variants.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero SwiftLint violations; code coverage \u226580%.", + "source_line": null + }, + { + "type": "invariant", + "description": "Permanent settings are stored in Application Support/ISOInspector/UserPreferences.json via UserPreferencesStore.", + "source_line": null + }, + { + "type": "invariant", + "description": "Session settings are stored in DocumentSessionController snapshots via SessionSettingsPayload.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define SettingsPanelViewModel to bridge UserPreferencesStore (permanent) and DocumentSessionController (session).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create a SettingsPanelState struct capturing permanent, session, and UI state (search filter, active section).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Document concurrency model (async preference loads, debounced writes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use shared SwiftUI view with platform-aware modifiers; snapshot tests to ensure parity.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a single\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SettingsPanelView", + "description": "SwiftUI view rendering the floating/settings panel UI using FoundationUI cards and sections for permanent and session settings.", + "source_line": null + }, + { + "name": "SettingsPanelScene", + "description": "Platform\u2011specific presentation layer that wraps SettingsPanelView in an NSPanel, sheet, or full\u2011screen cover with appropriate detents and modifiers.", + "source_line": null + }, + { + "name": "SettingsPanelViewModel", + "description": "Actor/bridge coordinating data between UserPreferencesStore (permanent) and DocumentSessionController (session), exposing state and handling updates.", + "source_line": null + }, + { + "name": "SettingsPanelState", + "description": "Struct holding current permanent settings, session settings, UI state such as search filter and active section.", + "source_line": null + }, + { + "name": "UserPreferencesStore.reset() integration", + "description": "Reset to Global button functionality that clears all permanent overrides and reloads defaults from UserPreferencesStore.", + "source_line": null + }, + { + "name": "SessionSettingsReset", + "description": "Reset Session button functionality that clears the current document\u2019s session\u2011scoped payload via DocumentSessionController.", + "source_line": null + }, + { + "name": "KeyboardShortcutHandler", + "description": "Global Command+Comma (or platform equivalent) binding to toggle the settings panel open/closed across macOS, iPadOS, and iOS.", + "source_line": null + }, + { + "name": "AccessibilityFocusManager", + "description": "VoiceOver focus logic that sets initial focus on first control in previously active section and provides accessible labels for all interactive elements.", + "source_line": null + }, + { + "name": "PersistenceLayerIntegration", + "description": "Mechanism ensuring permanent settings persist across launches via UserPreferencesStore and session settings survive document reopen without leaking to other sessions.", + "source_line": null + }, + { + "name": "SnapshotTestingSuite", + "description": "Tests capturing light/dark mode renders of SettingsPanelView on macOS, iPadOS, and iPhone for visual regression.", + "source_line": null + }, + { + "name": "UnitTestSuite", + "description": "Tests verifying state mutations, persistence calls, reset logic, and concurrency behavior in SettingsPanelViewModel.", + "source_line": null + }, + { + "name": "AccessibilityTestSuite", + "description": "Automated tests checking VoiceOver focus order, keyboard navigation, WCAG 2.1 AA compliance.", + "source_line": null + }, + { + "name": "UIKeyboardShortcutTest", + "description": "UI test confirming keyboard shortcut opens/closes the panel and synchronizes state after reopening.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7597, + "line_count": 134 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/Summary_of_Work_metrics.json new file mode 100644 index 00000000..942bc066 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/Summary_of_Work_metrics.json @@ -0,0 +1,158 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/Summary_of_Work.md", + "n_spec": 13, + "n_func": 16, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user, I want to open a floating settings panel that displays Permanent, Session, and Advanced sections so I can configure application preferences.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I need a SettingsPanelViewModel that manages state for the settings panel, including active section, search filter, and loading status.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The SettingsPanelView must render three distinct sections: Permanent Settings, Session Settings, and Advanced Settings, each with appropriate FoundationUI Card components.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The view model must expose @Published properties for activeSection, searchFilter, and isLoading, and provide methods selectSection(_:), updateSearchFilter(_:) that correctly mutate state.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All interactive UI elements (sidebar sections, search field, reset buttons, cards) must have unique accessibility identifiers following the NestedA11yIDs pattern.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests verify initial state of SettingsPanelViewModel, section navigation, search filter updates, and Combine publication.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests confirm that SettingsPanelView renders without crashes, contains sidebar and content panes, and synchronizes with the view model.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility tests ensure presence of identifiers, readable labels, SF Symbol icons, and hierarchical naming conventions.", + "source_line": null + }, + { + "type": "invariant", + "description": "The SettingsPanelState must always be Equatable and its properties (activeSection, searchFilter, isLoading) must remain consistent with the view model's published values.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Main Actor isolation for SettingsPanelViewModel to ensure SwiftUI compatibility and thread safety.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement SettingsPanelSection as an enum with cases Permanent, Session, Advanced to represent sidebar navigation options.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Adopt FoundationUI design system components (Card, DS.Spacing tokens) for consistent styling across the panel.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Apply PDD principles by marking incomplete work with @todo #222 and synchronizing todo.md to maintain traceability.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SettingsPanelViewModel", + "description": "ObservableObject managing settings panel state including active section, search filter, and loading indicator.", + "source_line": null + }, + { + "name": "SettingsPanelState", + "description": "Equatable model representing the current state of the settings panel.", + "source_line": null + }, + { + "name": "SettingsPanelSection", + "description": "Enumeration defining Permanent, Session, and Advanced sections of the panel.", + "source_line": null + }, + { + "name": "selectSection", + "description": "Method to navigate between sidebar sections.", + "source_line": null + }, + { + "name": "updateSearchFilter", + "description": "Method to update the search query for filtering settings.", + "source_line": null + }, + { + "name": "SettingsPanelView", + "description": "SwiftUI view rendering the floating settings panel with navigation split view, sidebar, and detail panes.", + "source_line": null + }, + { + "name": "Permanent Settings Section View", + "description": "Section displaying global preferences that persist across launches.", + "source_line": null + }, + { + "name": "Session Settings Section View", + "description": "Section displaying document-scoped preferences.", + "source_line": null + }, + { + "name": "Advanced Settings Section View", + "description": "Power\u2011user options section.", + "source_line": null + }, + { + "name": "Searchable Interface", + "description": "UI component allowing users to search for specific settings within the panel.", + "source_line": null + }, + { + "name": "Card Component Usage", + "description": "FoundationUI Card used to visually group settings within each section.", + "source_line": null + }, + { + "name": "Accessibility Identifier System", + "description": "Hierarchical dot notation identifiers for all interactive UI elements.", + "source_line": null + }, + { + "name": "VoiceOver Support", + "description": "Accessibility labels and SF Symbol icons for VoiceOver compatibility.", + "source_line": null + }, + { + "name": "Unit Tests for ViewModel", + "description": "Tests verifying initialization, state changes, and Combine publication.", + "source_line": null + }, + { + "name": "Integration Tests for View", + "description": "Tests ensuring view renders correctly and syncs with the ViewModel.", + "source_line": null + }, + { + "name": "Accessibility Tests", + "description": "Tests checking accessibility identifiers, voice\u2011over labels, and icon presence.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 13037, + "line_count": 388 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/blocked_metrics.json b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/blocked_metrics.json new file mode 100644 index 00000000..7e79fb64 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/blocked_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/blocked.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "Import Licensed Media Assets", + "description": "Import licensed Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H media assets into the system and refresh regression baselines for tolerant parsing and export scenarios.", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run a lenient\u2011vs\u2011strict performance benchmark on macOS using a 1\u202fGiB payload, collect runtime and RSS metrics, and archive results in Documentation/Performance.", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish collected performance baselines for FoundationUI Phase\u00a05.2 into PERFORMANCE.md after profiling or benchmarking tasks are completed.", + "source_line": null + }, + { + "name": "Generate Cross\u2011Platform Test Report", + "description": "Compile test results from iOS, macOS, and iPadOS devices/simulators (including dark mode, RTL, locale) into a cross\u2011platform report.", + "source_line": null + }, + { + "name": "Finalize Accessibility Sign\u2011off", + "description": "Complete manual VoiceOver, keyboard, dynamic type, contrast, and other accessibility checks to achieve final accessibility approval.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4468, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/next_tasks_metrics.json new file mode 100644 index 00000000..ecaf6532 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/next_tasks_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/222_C21_Floating_Settings_Panel/next_tasks.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate FoundationUI components into the application by replacing native SwiftUI elements with DS components and ensuring snapshot testing integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All Phase 1 tasks (I1.1\u2013I1.5) must be completed and verified on 2025-11-14, including badge & status indicators, card containers, key-value rows, form controls, advanced layouts, responsive behavior, accessibility, and dark mode support.", + "source_line": null + }, + { + "type": "invariant", + "description": "FoundationUI integration tasks cannot begin until Phase 0 is complete.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use FoundationUI grid and spacing system for layout patterns in Advanced Layouts & Navigation (I1.5).", + "source_line": null + }, + { + "type": "user_story", + "description": "Create SDK Tolerant Parsing Documentation with DocC article, code examples, and inline documentation updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation must be verified against test file in Tests/ISOInspectorKitTests/ and linked from main Documentation.md Topics section.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement Floating Settings Panel Shell (C21) using FoundationUI cards and macOS NSPanel or iPad/iOS .sheet detents.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot and accessibility tests must validate both macOS and iOS presentations.", + "source_line": null + }, + { + "type": "invariant", + "description": "C22 cannot be thread permanent changes through UserPreferencesStore only after C21 is completed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FoundationUI Badge & Status Indicators", + "description": "UI component for displaying badges and status indicators using FoundationUI", + "source_line": null + }, + { + "name": "FoundationUI Card Containers & Sections", + "description": "Reusable card container UI components for grouping content", + "source_line": null + }, + { + "name": "FoundationUI Key-Value Rows & Metadata Display", + "description": "Component to display key-value pairs and metadata in a structured row format", + "source_line": null + }, + { + "name": "FoundationUI Form Controls & Input Wrappers", + "description": "Form control wrappers integrating FoundationUI components with SwiftUI forms", + "source_line": null + }, + { + "name": "FoundationUI Advanced Layouts & Navigation", + "description": "Layout patterns using FoundationUI grid, spacing, responsive behavior, dark mode and navigation", + "source_line": null + }, + { + "name": "SDK Tolerant Parsing Documentation", + "description": "DocC article and inline docs for tolerant parsing options in ISOInspectorKit", + "source_line": null + }, + { + "name": "Floating Settings Panel Shell", + "description": "SettingsPanelScene UI presenting settings in a floating panel on macOS and sheet detents on iPad/iOS", + "source_line": null + }, + { + "name": "Floating Settings Panel Persistence & Reset Wiring", + "description": "Persistence logic for permanent and session settings, reset actions, and documentation", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3626, + "line_count": 71 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/223_C22_User_Settings_Persistence_and_Reset_metrics.json b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/223_C22_User_Settings_Persistence_and_Reset_metrics.json new file mode 100644 index 00000000..977c5264 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/223_C22_User_Settings_Persistence_and_Reset_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/223_C22_User_Settings_Persistence_and_Reset.md", + "n_spec": 12, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement floating user settings panel with persistence for permanent and session-scoped settings, reset affordances, keyboard shortcut support, and platform-specific presentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Thread permanent settings changes through UserPreferencesStore, load global preferences on app startup, save changes immediately with optimistic writes and diagnostics, and verify persistence across relaunch via automated tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update DocumentSessionController to support session settings mutations, bind session changes from SettingsPanelViewModel, implement dirty tracking for session scope (badge indicators), and ensure session snapshots serialize/deserialize with SessionSettingsPayload.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Implement Reset Global button that restores permanent defaults via UserPreferencesStore.reset(), reset session button that restores session defaults by reloading snapshot, add confirmation dialogs, and verify reset behavior across platform-specific presentations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bind keyboard shortcut (\u2318,) to toggle panel visibility, register across macOS, iPad, and iPhone targets, ensure it works throughout app lifecycle, and test focus restoration when panel toggles open.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Implement platform-specific presentation: macOS uses NSPanel with remembered frame/position, iPad presents via .sheet with 2-3 detents, iPhone full-screen cover or modal card, with platform detection and conditional rendering.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test all platforms (iOS 17+, macOS 14+, iPadOS 17+), color schemes, responsive behavior across screen sizes, and capture state transitions (empty, loading, with errors) via snapshot tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Perform advanced accessibility tests: dynamic type scaling XS\u2013XXXL, reduce motion compliance, VoiceOver focus order, keyboard-only navigation across all sections.", + "source_line": null + }, + { + "type": "invariant", + "description": "No cross-device sync; iCloud/CloudKit out of scope per PRD.", + "source_line": null + }, + { + "type": "invariant", + "description": "No new validation rules added; C22 reuses existing presets from B7/C19.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use UserPreferencesStore for permanent settings persistence and DocumentSessionController for session-scoped settings, integrating with ValidationConfiguration and preset registry.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Persistently store user preferences including frame rect for macOS NSPanel to remember size/position.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SettingsPanelViewModel", + "description": "Manages state for the floating settings panel, including section navigation and published properties for permanent, session, and advanced settings.", + "source_line": null + }, + { + "name": "SettingsPanelView", + "description": "UI component rendering three sections (Permanent, Session, Advanced) with controls, accessibility identifiers, and snapshot test support.", + "source_line": null + }, + { + "name": "UserPreferencesStore Integration", + "description": "Persists permanent user preferences, loads defaults on startup, performs optimistic writes, and handles reset to defaults.", + "source_line": null + }, + { + "name": "DocumentSessionController Session Settings Mutations", + "description": "Handles session-scoped settings mutations, updates snapshots, tracks dirty state, and serializes/deserializes via SessionSettingsPayload.", + "source_line": null + }, + { + "name": "Reset Global Action", + "description": "Button that triggers confirmation dialog and resets permanent preferences using UserPreferencesStore.reset().", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7258, + "line_count": 162 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1bd61622 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/Summary_of_Work_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/Summary_of_Work.md", + "n_spec": 14, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "User can view and modify permanent settings via the Settings Panel UI.", + "source_line": null + }, + { + "type": "user_story", + "description": "User can view and modify session-specific validation settings via the Settings Panel UI.", + "source_line": null + }, + { + "type": "user_story", + "description": "User can reset permanent settings to defaults using a \"Reset Global\" button with confirmation dialog.", + "source_line": null + }, + { + "type": "user_story", + "description": "User can reset session settings to defaults using a \"Reset Session\" button with confirmation dialog.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Permanent settings are loaded from UserPreferencesStore on app startup and persisted immediately upon change, with optimistic UI updates and revert on failure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session settings mutations (reset, preset selection, rule setting) are applied through DocumentSessionController and persist in WorkspaceSessionSnapshot.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reset actions trigger native alert dialogs that explain impact and require confirmation before proceeding.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI badges indicate when session overrides exist (\"orange warning icon\".", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Settings Panel view renders both permanent and session sections.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Permanent changes persist across app re\u2011launches; session changes survive workspace reloads.", + "source_line": null + }, + { + "type": "invariant", + "description": "UserPreferencesStore must always read/write JSON file with atomic operations.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always maintain a Combine publisher for event\u2011based updates to the ViewModel.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use\u00a0UserPreferences\u00a0struct and one JSON file (UserPreferences.json) for permanent settings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Optimistic writes with reverts\u00a0\u2013\u00a0i.e.,\u00a0..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "UserPreferencesStore", + "description": "Persistently stores permanent user settings in a JSON file and provides load/save/reset operations.", + "source_line": null + }, + { + "name": "SettingsPanelViewModel", + "description": "Manages UI state for the Settings panel, including loading/saving permanent settings via UserPreferencesStore and session settings via DocumentSessionController.", + "source_line": null + }, + { + "name": "SessionSettingsPayload Mutations", + "description": "Provides methods to reset session settings, select validation presets, and set individual validation rules within a workspace session.", + "source_line": null + }, + { + "name": "Reset Actions with Confirmation Dialogs", + "description": "UI actions for resetting to defaults or global settings, including destructive alerts and badge indicators for overridden session settings.", + "source_line": null + }, + { + "name": "Keyboard Shortcut Integration Stub", + "description": "Documentation and NotificationCenter-based stub for toggling the Settings panel via \u2318, with @todo markers for full CommandGroup wiring.", + "source_line": null + }, + { + "name": "Platform-Specific Presentation Logic", + "description": "Conditional rendering of the Settings panel as a sheet on macOS/iPad/iPhone, with size constraints and detent hints; NSPanel and frame persistence are deferred.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 16181, + "line_count": 443 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/blocked_metrics.json b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/blocked_metrics.json new file mode 100644 index 00000000..2bac11d3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/blocked_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/blocked.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads once licensing approvals are obtained.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG\u2011H fixtures must be granted before importing licensed assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark once macOS hardware with the 1\u202fGiB performance fixture becomes available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS hardware with the 1\u202fGiB performance fixture must be available in the automation environment before running the benchmark.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines for FoundationUI Phase\u00a05.2 after manual profiling and benchmarking tasks are completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All manual profiling steps (render time <100\u202fms, memory allocation <5\u202fMB, 60\u202fFPS on device) must be documented in a performance report before publishing baselines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All benchmark metrics (build time <10s, binary size <500KB, memory footprint <5MB per screen, 60\u202fFPS during interactions, BoxTreePattern with 1000+ nodes) must be recorded and documented before CI integration with performance gates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Cross\u2011platform test results (iOS\u00a017+, macOS\u00a014+, iPadOS\u00a017+ devices, dark mode, RTL, locale/region) must be compiled into a cross\u2011platform report before the next step.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility testing must achieve 98% score via automated tests and manual edge\u2011case validation before final accessibility sign\u2011off.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Assets and Refresh Baselines", + "description": "Imports licensed media assets (Dolby Vision, AV1, VP9, Dolby AC-4, MPEG\u2011H) into the system and refreshes regression baselines to validate tolerant parsing and export scenarios against real-world payloads.", + "source_line": null + }, + { + "name": "Execute macOS 1\u202fGiB Benchmark", + "description": "Runs a lenient\u2011vs\u2011strict performance benchmark on macOS using a 1\u202fGiB payload, collects runtime and RSS metrics, and archives the results in Documentation/Performance.", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publishes collected performance baseline data (e.g., render times, memory usage, FPS) into PERFORMANCE.md after profiling with Xcode Instruments.", + "source_line": null + }, + { + "name": "CI Integration with Performance Gates", + "description": "Integrates manual benchmark results into continuous\u2011integration pipelines to enforce performance thresholds for build time, binary size, memory footprint, FPS, and large\u2011node layout tests.", + "source_line": null + }, + { + "name": "Compile Cross\u2011Platform Test Report", + "description": "Aggregates test outcomes from iOS, macOS, and iPadOS devices/simulators (including dark mode, RTL, locale) into a comprehensive cross\u2011platform compatibility report.", + "source_line": null + }, + { + "name": "Final Accessibility Sign\u2011Off", + "description": "Completes manual accessibility validation (VoiceOver, keyboard navigation, dynamic type, contrast, etc.) and signs off the product for accessibility compliance.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4494, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/next_tasks_metrics.json new file mode 100644 index 00000000..5426df0f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/next_tasks_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/223_C22_User_Settings_Persistence_and_Reset/next_tasks.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "User Settings Panel: Phase 2 \u2013 Persistence + Reset Wiring", + "source_line": null + }, + { + "type": "invariant", + "description": "Settings panel must persist user preferences via UserPreferencesStore and reset actions must confirm before execution", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All 5 of the 7 puzzles (#222.1\u2013#222.5) are fully implemented, with #222.4 and #222.5 documented but partially completed; #222.6 and #222.7 remain deferred", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integration of FileBackedUserPreferencesStore into SettingsPanelViewModel via dependency injection", + "source_line": null + }, + { + "type": "user_story", + "description": "SDK Documentation \u2013 Tolerant Parsing Guide for ISOInspectorKit", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Create DocC article TolerantParsingGuide.md with code examples, update inline docs for ParsePipeline.Options, link guide from Documentation.md, and verify examples with test file", + "source_line": null + } + ], + "functional_units": [ + { + "name": "UserPreferencesStore Integration", + "description": "File-backed store for user preferences with load, save, and reset capabilities, integrated via dependency injection into SettingsPanelViewModel.", + "source_line": null + }, + { + "name": "SessionSettingsPayload Mutations", + "description": "Session-scoped settings management including resetSessionSettings, selectValidationPreset, setValidationRule, with dirty tracking and badge indicators.", + "source_line": null + }, + { + "name": "Reset Actions", + "description": "UI actions for resetting settings to defaults or global values, featuring native confirmation alerts and session override badges.", + "source_line": null + }, + { + "name": "Keyboard Shortcut (\u2318,)", + "description": "Stub implementation of a keyboard shortcut handler using NotificationCenter, documented for future CommandGroup integration.", + "source_line": null + }, + { + "name": "Platform-Specific Presentation", + "description": "Presentation logic for the settings panel: macOS sheet with size constraints, iPad/iPhone sheet presentation; pending NSPanel window controller and detents.", + "source_line": null + }, + { + "name": "SDK Tolerant Parsing Documentation", + "description": "DocC article and inline docs explaining tolerant parsing setup, ParseIssueStore usage, and options for strict vs tolerant parsing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4536, + "line_count": 93 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/224_A9_Automate_Strict_Concurrency_Checks_metrics.json b/DOCS/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/224_A9_Automate_Strict_Concurrency_Checks_metrics.json new file mode 100644 index 00000000..b2303888 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/224_A9_Automate_Strict_Concurrency_Checks_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/224_A9_Automate_Strict_Concurrency_Checks.md", + "n_spec": 10, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automate strict concurrency checks via Swift's --strict-concurrency=complete flag across build and test phases to enforce thread-safe concurrent design patterns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-push hook executes swift build and swift test with --strict-concurrency=complete, logs are published to Documentation/Quality with timestamps, and exits with status 1 if either command fails.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions CI runs strict concurrency checks on every pull request and push to main; workflow fails if either build or test command returns non-zero exit code.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build and test logs show zero strict concurrency diagnostics (suppressed diagnostics do not count; all must be resolved).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI uploads concurrency logs as workflow artifacts for historical tracking and failure investigation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation PRD is updated with links to passing logs, status transition from \"Proposed\" to \"Automation Gate Established\", and any deviations or special exemptions noted with justification.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All open items in the PRD's \"Automation Alignment\" section are resolved.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No regressions: existing CI gates (from A2, A6, A7, A8) remain operational; no breaking changes to build matrix or timeout settings.", + "source_line": null + }, + { + "type": "invariant", + "description": "Swift version must be 5.9+ for --strict-concurrency=complete flag support.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Strict concurrency checks are enforced via pre-push hook and GitHub Actions CI, but the existing Store implementation is not refactored; future changes must maintain thread safety without altering current architecture.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Pre-Push Strict Concurrency Build Check", + "description": "Runs swift build --strict-concurrency=complete before a git push and logs output to Documentation/Quality with timestamped filename", + "source_line": null + }, + { + "name": "Pre-Push Strict Concurrency Test Check", + "description": "Runs swift test --strict-concurrency=complete before a git push and logs output to Documentation/Quality with timestamped filename", + "source_line": null + }, + { + "name": "Pre-Push Hook Exit Status Enforcement", + "description": "Exits with status 1 if either build or test command fails, preventing the push", + "source_line": null + }, + { + "name": "Human-Readable Pre-Push Summary", + "description": "Prints a summary message indicating success or failure of strict concurrency checks", + "source_line": null + }, + { + "name": "CI Strict Concurrency Build Job", + "description": "GitHub Actions job that runs swift build --strict-concurrency=complete on CI runners", + "source_line": null + }, + { + "name": "CI Strict Concurrency Test Job", + "description": "GitHub Actions job that runs swift test --strict-concurrency=complete on CI runners", + "source_line": null + }, + { + "name": "CI Log Artifact Upload", + "description": "Uploads strict concurrency build and test logs as artifacts for historical tracking", + "source_line": null + }, + { + "name": "CI Failure Handling", + "description": "Automatically fails the workflow if either build or test command exits non-zero, blocking PR merge", + "source_line": null + }, + { + "name": "Documentation Update for PRD", + "description": "Updates DOCS/AI/PRD_SwiftStrictConcurrency_Store.md with links to passing logs and status transition", + "source_line": null + }, + { + "name": "Todo List Completion Marker", + "description": "Marks strict concurrency item as Completed in todo.md with link to CI artifact", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7205, + "line_count": 111 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/COMPLETED_metrics.json b/DOCS/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/COMPLETED_metrics.json new file mode 100644 index 00000000..9170350d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/COMPLETED_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/224_A9_Automate_Strict_Concurrency_Checks/COMPLETED.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automate strict concurrency checks across all build and test targets", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All targets compile with strict concurrency enabled (zero warnings)", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-push hook verifies concurrency compliance before every push", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow runs dedicated strict concurrency job with artifact uploads", + "source_line": null + }, + { + "type": "invariant", + "description": "Strict concurrency checks must always be enforced during build and test phases", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Strict Concurrency Build Target Configuration", + "description": "Enables strict concurrency checks for all build and test targets via .enableUpcomingFeature(\"StrictConcurrency\") in Package.swift", + "source_line": null + }, + { + "name": "Pre-Push Hook for Concurrency Compliance", + "description": "A Git hook that verifies strict concurrency compliance before every push", + "source_line": null + }, + { + "name": "CI Workflow Strict Concurrency Job", + "description": "GitHub Actions workflow that runs a dedicated job to check strict concurrency and uploads artifacts", + "source_line": null + }, + { + "name": "Documentation Update for Automation Gate", + "description": "Updates PRD and related docs to reflect the established automation gate for strict concurrency checks", + "source_line": null + }, + { + "name": "Quality Logs Directory with .gitignore Rules", + "description": "Creates a directory for quality logs and configures .gitignore rules to manage log files", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1293, + "line_count": 43 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b118dae0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/Summary_of_Work_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/Summary_of_Work.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automate strict concurrency checks across all build and test phases to enforce thread-safe concurrent design patterns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All platform-independent targets compile and test successfully with zero strict concurrency warnings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-push hook executes build and test with strict concurrency, logs published to Documentation/Quality/.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow runs strict concurrency checks on every PR and push to main, failing automatically on any concurrency warnings or errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Strict concurrency logs are uploaded as workflow artifacts with 14-day retention.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updated to reflect automation gate status and completion date.", + "source_line": null + }, + { + "type": "invariant", + "description": "Swift 6.0+ has strict concurrency enabled by default; .enableUpcomingFeature(\"StrictConcurrency\") is redundant and should not be used in targets.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Conditional package dependencies for iOS/macOS-only libraries to avoid unused dependency warnings on Linux builds.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Separate cache key for strict concurrency checks in CI to prevent interference with main build cache.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Pre-push hook logs are timestamped and separated by build/test phases for easier debugging.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Package.swift Strict Concurrency Configuration", + "description": "Enables Swift's StrictConcurrency feature for all platform\u2011independent targets via .enableUpcomingFeature(\"StrictConcurrency\")", + "source_line": null + }, + { + "name": "Pre\u2011Push Hook Quality Gate", + "description": "Runs SwiftLint, strict concurrency build/test verification, large file detection, and secret scanning before a push; logs output to Documentation/Quality/", + "source_line": null + }, + { + "name": "GitHub Actions CI Strict Concurrency Job", + "description": "Builds and tests all platform\u2011independent targets with strict concurrency enabled on ubuntu-22.04 using Swift 6.0.1; uploads logs as artifacts", + "source_line": null + }, + { + "name": "Documentation Quality README", + "description": "Provides guidance on quality assurance logs and their usage", + "source_line": null + }, + { + "name": "Conditional Package Dependencies Update", + "description": "Moves iOS/macOS\u2011only dependencies into conditional blocks to avoid unused dependency warnings on Linux builds", + "source_line": null + }, + { + "name": "Removal of Redundant StrictConcurrency Flags", + "description": "Strips .enableUpcomingFeature(\"StrictConcurrency\") from targets after Swift 6.0 makes it default", + "source_line": null + }, + { + "name": "CI Environment Alignment", + "description": "Standardizes CI workflows to use Swift 6.0.x across all platforms and updates .swift-version and README", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 13312, + "line_count": 362 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/blocked_metrics.json b/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/blocked_metrics.json new file mode 100644 index 00000000..1809c78e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/blocked_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/blocked.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "Blocked tasks must be updated whenever blockers change to maintain day\u2011to\u2011day visibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed real\u2011world assets and refresh regression baselines so tolerant parsing and export scenarios can validate against real\u2011world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be obtained before importing assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the macOS 1 GiB lenient\u2011vs\u2011strict benchmark, collect runtime and RSS metrics, and archive them under Documentation/Performance/.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS hardware with the 1 GiB performance fixture must be available in the automation environment before running the benchmark.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines for FoundationUI Phase\u00a05.2 in PERFORMANCE.md after manual profiling with Xcode Instruments on macOS developer machine.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Render times measured by Time Profiler must be less than 100\u202fms, allocations must be under 5\u202fMB, and Core Animation must verify 60\u202fFPS on device.", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish performance baselines for FoundationUI Phase\u00a05.2 after manual benchmarks across iOS\u00a017, macOS\u00a014, and iPadOS\u00a017.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Build time must be less than 10s for a clean build, binary size under 500\u202fKB, memory footprint under 5\u202fMB per screen, 60\u202fFPS during interactions, and BoxTreePattern with 1000+ nodes must perform acceptably.", + "source_line": null + }, + { + "type": "user_story", + "description": "Compile cross\u2011platform test results and create a cross\u2011platform report after manual testing on iOS\u00a017+ devices, macOS\u00a014+ devices..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Import Licensed Assets", + "description": "Import licensed media assets and refresh regression baselines for tolerant parsing and export scenarios", + "source_line": null + }, + { + "name": "Execute macOS 1 GiB Benchmark", + "description": "Run lenient vs strict benchmark on macOS with 1 GiB payload, collect runtime and RSS metrics, archive results", + "source_line": null + }, + { + "name": "Publish Performance Baselines", + "description": "Publish performance baseline data in PERFORMANCE.md after profiling", + "source_line": null + }, + { + "name": "Publish Benchmarks CI Integration", + "description": "Integrate performance benchmarks into CI with gates", + "source_line": null + }, + { + "name": "Compile Cross-Platform Test Report", + "description": "Compile test results from iOS, macOS, iPadOS devices and create a cross\u2011platform report", + "source_line": null + }, + { + "name": "Final Accessibility Sign-Off", + "description": "Complete manual accessibility testing and sign off on accessibility compliance", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4494, + "line_count": 77 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/next_tasks_metrics.json new file mode 100644 index 00000000..cfacb3d5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/next_tasks_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/225_A9_Swift6_Concurrency_Cleanup/next_tasks.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "User can persist and reset settings in the Settings Panel via UserPreferencesStore and DocumentSessionController.", + "source_line": null + }, + { + "type": "invariant", + "description": "Settings persistence must be thread\u2011safe and consistent across sessions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reset actions require confirmation dialogs before clearing settings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Persistence is threaded through UserPreferencesStore and DocumentSessionController.", + "source_line": null + }, + { + "type": "user_story", + "description": "Automate strict concurrency checks during build and test phases using --strict-concurrency=complete flag.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre\u2011push hooks must enforce strict concurrency checks before code is pushed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions CI workflows must include jobs that run strict concurrency checks.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Strict concurrency checks are integrated into .githooks/pre-push and .github/workflows/ci.yml.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "User Settings Panel Persistence", + "description": "Stores user preferences in UserPreferencesStore and DocumentSessionController, ensuring settings persist across sessions.", + "source_line": null + }, + { + "name": "User Settings Reset Action", + "description": "Provides reset actions with confirmation dialogs to revert settings to defaults.", + "source_line": null + }, + { + "name": "Strict Concurrency Check Hook", + "description": "Automates strict concurrency checks using --strict-concurrency=complete flag during pre-push Git hooks.", + "source_line": null + }, + { + "name": "CI Strict Concurrency Job", + "description": "Extends GitHub Actions CI workflow to run strict concurrency jobs on every build and test phase.", + "source_line": null + }, + { + "name": "Concurrency Documentation & Rollout", + "description": "Documents and rolls out the strict concurrency enforcement, updating PRD with passing logs.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4069, + "line_count": 79 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/226_A6_Enforce_SwiftFormat_Formatting_metrics.json b/DOCS/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/226_A6_Enforce_SwiftFormat_Formatting_metrics.json new file mode 100644 index 00000000..6b3b81e1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/226_A6_Enforce_SwiftFormat_Formatting_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/226_A6_Enforce_SwiftFormat_Formatting.md", + "n_spec": 9, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate SwiftFormat enforcement into the project's pre-push hook and GitHub Actions CI workflow to maintain consistent code style across all Swift sources.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftFormat integration added to .pre-commit-config.yaml with the swift-format hook", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftFormat hook runs swift format --in-place on staged Swift files before commit", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions workflow includes a swift format --mode lint step that checks all Swift files for formatting violations and fails the workflow if unformatted code is detected", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions workflow provides diff output for debugging", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All existing Swift sources pass the formatting check (format entire codebase if needed)", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "README.md updated with SwiftFormat tooling section explaining how to run formatting locally, what the pre-commit hook does, and CI behavior for unformatted code", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow logs show successful swift format --mode lint pass on sample PRs/pushes", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation is consistent with project markdown standards", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Pre-commit SwiftFormat Hook", + "description": "Runs swift format --in-place on staged *.swift files before commits to auto-format code", + "source_line": null + }, + { + "name": "GitHub Actions SwiftFormat Lint Step", + "description": "Executes swift format --mode lint during CI to detect formatting violations, fails workflow if unformatted code is found, and provides diff output for debugging", + "source_line": null + }, + { + "name": "README SwiftFormat Tooling Section", + "description": "Documentation section in README.md explaining local formatting commands, pre-commit hook behavior, and CI lint expectations", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4562, + "line_count": 87 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/Summary_of_Work_metrics.json new file mode 100644 index 00000000..4093bf31 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/Summary_of_Work_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/226_A6_Enforce_SwiftFormat_Formatting/Summary_of_Work.md", + "n_spec": 10, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate SwiftFormat enforcement into the development workflow to automatically format Swift code before commits and validate formatting in CI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-commit hook runs swift format --in-place on all staged Swift files and fails commit if formatter modifies files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow includes a swift-format-check job that lints Sources and Tests directories, failing with clear error message when unformatted code is detected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All Swift files in Sources/ and Tests/ are formatted to 2-space indentation, consistent spacing, trailing commas, line length adjustments, and whitespace normalization.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation includes a Code Formatting section with local formatting instructions, lint-only verification command, pre-commit hook setup guide, CI enforcement behavior explanation, and examples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftLint violations are resolved to zero by disabling conflicting rules (opening_brace, closure_parameter_position, trailing_comma) and aligning .swift-format configuration with SwiftLint expectations.", + "source_line": null + }, + { + "type": "invariant", + "description": "The pre-commit hook must not break existing swiftlint and build checks.", + "source_line": null + }, + { + "type": "invariant", + "description": "CI workflow must run on Ubuntu 22.04 using Swift 6.0 toolchain.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Rename existing swift-format-foundationui hook to swift-build-foundationui for clarity.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add new swift-format-all hook that runs swift format --in-place on all staged Swift (i.e.,\u00a0the\u00a0..???)", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftFormat Pre-commit Hook", + "description": "Automatically formats staged Swift files before commit using swift format --in-place", + "source_line": null + }, + { + "name": "SwiftFormat CI Check Job", + "description": "Runs swift format lint on Sources and Tests directories during CI to detect formatting violations and fail the workflow if unformatted code is found", + "source_line": null + }, + { + "name": "Codebase Formatting Process", + "description": "Applies swift format --in-place recursively to all Swift files in Sources/ and Tests/, standardizing indentation, spacing, commas, line length, and whitespace", + "source_line": null + }, + { + "name": "README Code Formatting Documentation", + "description": "Provides local formatting instructions, lint-only verification command, pre-commit hook setup guide, CI enforcement behavior explanation, and examples for manual and automated workflows", + "source_line": null + }, + { + "name": "SwiftLint Compatibility Configuration", + "description": "Disables conflicting SwiftLint rules (opening_brace, closure_parameter_position, trailing_comma) and sets swift-format configuration to align with SwiftLint expectations, enabling both tools to coexist without conflicts", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7763, + "line_count": 203 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/001_Design_System_Color_Token_Migration_metrics.json b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/001_Design_System_Color_Token_Migration_metrics.json new file mode 100644 index 00000000..c4e486d8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/001_Design_System_Color_Token_Migration_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/001_Design_System_Color_Token_Migration.md", + "n_spec": 9, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a developer, I want all SwiftUI views in ISOInspectorApp to use FoundationUI design system tokens instead of manual color definitions so that the app adheres to the design system architecture and Phase 5.2 can be completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All manual `.accentColor` usages are replaced with `DS.Color.*` tokens across all view files listed in the specification (ParseTreeOutlineView.swift, ParseTreeDetailView.swift, ValidationSettingsView.swift, IntegritySummaryView.swift, ISOInspectorAppTheme.swift).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All hardcoded opacity values (0.08, 0.12, 0.15, 0.18, 0.25) are replaced with semantic token values from FoundationUI or custom tokens defined in the app theme.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Asset Catalog color definitions `AccentColor.colorset` and `SurfaceBackground.colorset` are removed after confirming no code references them.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI integration tests (123) and full test suite (751) pass with no failures related to color usage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New design token compliance tests are added, passing, and detect any remaining manual color or opacity usage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No references to `.accentColor` remain in the app codebase (excluding test files).", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always use FoundationUI `DS.Color.*` tokens for all UI colors; manual color definitions are disallowed.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "FoundationUI design system tokens will be used as the single source of truth for all UI colors, replacing both Asset Catalog entries and custom brand palette definitions in ISOInspectorAppTheme.swift.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorApp Theme Configuration", + "description": "Provides app-wide color palette using FoundationUI design tokens or brand-specific colors", + "source_line": null + }, + { + "name": "ParseTreeOutlineView SwiftUI Component", + "description": "Displays tree outline with accent colors and opacity applied to UI elements", + "source_line": null + }, + { + "name": "ParseTreeDetailView SwiftUI Component", + "description": "Shows detailed view of selected parse tree nodes, uses accent colors for highlighting", + "source_line": null + }, + { + "name": "ValidationSettingsView SwiftUI Component", + "description": "User interface for configuring validation settings, includes color styling for controls", + "source_line": null + }, + { + "name": "IntegritySummaryView SwiftUI Component", + "description": "Summarizes integrity checks with colored status indicators", + "source_line": null + }, + { + "name": "FoundationUI Design Token Mapping Layer", + "description": "Maps semantic design tokens (DS.Color.*) to actual color values used in the app", + "source_line": null + }, + { + "name": "Asset Catalog Color Definitions", + "description": "Legacy color sets such as AccentColor and SurfaceBackground stored in .xcassets", + "source_line": null + }, + { + "name": "Design Token Compliance Test Suite", + "description": "Automated tests ensuring all views use FoundationUI tokens instead of manual colors", + "source_line": null + }, + { + "name": "FoundationUI Integration Tests", + "description": "Tests verifying correct integration of FoundationUI components within ISOInspectorApp", + "source_line": null + }, + { + "name": "Color Contrast Validation Tests", + "description": "Checks that color combinations meet WCAG AA contrast ratios", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 13594, + "line_count": 335 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/BUG_Manual_Color_Usage_vs_FoundationUI_metrics.json b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/BUG_Manual_Color_Usage_vs_FoundationUI_metrics.json new file mode 100644 index 00000000..71fa05cc --- /dev/null +++ b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/BUG_Manual_Color_Usage_vs_FoundationUI_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/BUG_Manual_Color_Usage_vs_FoundationUI.md", + "n_spec": 8, + "n_func": 10, + "intent_atoms": [ + { + "type": "invariant", + "description": "The application must use FoundationUI design system tokens as the single source of truth for all color definitions.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want to audit existing manual SwiftUI color usages so that I can map them to equivalent FoundationUI design tokens.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All hardcoded Color.accentColor and opacity values (0.08, 0.12, 0.15, 0.18, 0.25) across the specified files are replaced with corresponding DS.Color.* tokens.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want to update ParseTreeOutlineView.swift, ParseTreeDetailView.swift, ValidationSettingsView.swift, IntegritySummaryView.swift, ISOInspectorAppTheme.swift, and Tree/ParseTreeOutlineView.swift to use FoundationUI tokens instead of manual colors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "After the update, no file contains direct usage of Color.accentColor or .foregroundColor(.accentColor) outside of FoundationUI context.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a QA engineer, I want to validate consistency by running UI integration tests that verify FoundationUI token compliance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All existing 123 FoundationUI integration tests pass and new linting rules detect any direct .accentColor usage.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Remove the ISOInspectorAppTheme.swift color functions and Asset Catalog colorsets (AccentColor.colorset & SurfaceBackground..).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeOutlineView", + "description": "UI component displaying parse tree outline with filter button, search match text, bookmark icon, and row highlighting using color tokens", + "source_line": null + }, + { + "name": "ParseTreeDetailView", + "description": "UI component showing detailed parse tree items with selection and highlight backgrounds/borders", + "source_line": null + }, + { + "name": "ValidationSettingsView", + "description": "UI component for enabling/disabling validation rules with foreground color styling", + "source_line": null + }, + { + "name": "IntegritySummaryView", + "description": "UI component displaying integrity summary text styled with foreground color", + "source_line": null + }, + { + "name": "ISOInspectorAppTheme", + "description": "Centralized theme providing app-wide tint and surface background colors via custom functions", + "source_line": null + }, + { + "name": "FoundationUI Design Token Audit Tool", + "description": "Process to review FoundationUI documentation, map existing opacity values to semantic tokens, and document mappings", + "source_line": null + }, + { + "name": "View Color Migration Process", + "description": "Procedure to replace manual color usage in views with FoundationUI design system tokens", + "source_line": null + }, + { + "name": "Manual Color Cleanup Procedure", + "description": "Steps to remove legacy color definitions from theme files and asset catalog", + "source_line": null + }, + { + "name": "FoundationUI Compliance Validation Tests", + "description": "UI integration tests that verify components use only FoundationUI tokens and enforce linting rules", + "source_line": null + }, + { + "name": "Design Token Usage Documentation", + "description": "Guide documenting how to use design tokens in future development", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5534, + "line_count": 115 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/Summary_Color_Theme_Resolution_metrics.json b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/Summary_Color_Theme_Resolution_metrics.json new file mode 100644 index 00000000..4d22c4e7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/Summary_Color_Theme_Resolution_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/Summary_Color_Theme_Resolution.md", + "n_spec": 4, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Color values must be derived from ISOInspectorBrandPalette.production to ensure consistency across app and tests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Replace Asset Catalog color initialization with direct Color(red:green:blue:) using palette values in ISOInspectorAppTheme.swift.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All tests that previously failed due to black accent colors now pass (0 failures).", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want the app\u2019s accent and surface background colors to be correctly resolved so that UI elements display the intended brand palette instead of defaulting to black.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorAppTheme.accentColor", + "description": "Provides the accent color for a given ColorScheme by returning a SwiftUI Color constructed from brand palette values.", + "source_line": null + }, + { + "name": "ISOInspectorAppTheme.surfaceBackground", + "description": "Provides the surface background color for a given ColorScheme using brand palette values to construct a SwiftUI Color.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3071, + "line_count": 81 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/blocked_metrics.json b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/blocked_metrics.json new file mode 100644 index 00000000..b22e85ea --- /dev/null +++ b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/blocked_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/blocked.md", + "n_spec": 10, + "n_func": 1, + "intent_atoms": [ + { + "type": "invariant", + "description": "Manual color usage must be migrated to FoundationUI design tokens before Phase 5.2 can be finalized.", + "source_line": null + }, + { + "type": "user_story", + "description": "Audit FoundationUI design tokens and map current opacity values to semantic tokens, then update all views to use DS.* tokens exclusively.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All affected view files must use DS.* tokens for color and opacity instead of hardcoded .accentColor and manual values.", + "source_line": null + }, + { + "type": "invariant", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be obtained before importing assets and refreshing regression baselines.", + "source_line": null + }, + { + "type": "user_story", + "description": "Import licensed assets and refresh regression baselines to validate tolerant parsing and export scenarios against real-world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression baselines are refreshed after asset import and validated with real-world payloads.", + "source_line": null + }, + { + "type": "invariant", + "description": "macOS hardware with 1 GiB performance fixture must be available before running lenient-vs\u2011strict benchmark.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS 1 GiB benchmark, collect runtime and RSS metrics, and archive them under Documentation/Performance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results are recorded in Documentation/Performance with specified environment variables.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Performance profiling and benchmarks will be manually executed using Xcode Instruments and CI integration will only after manual baseline creation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Design Token Migration", + "description": "Update view files to replace hardcoded colors and opacity values with FoundationUI design tokens (DS.*)", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5356, + "line_count": 87 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/next_tasks_metrics.json new file mode 100644 index 00000000..00c7c638 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/next_tasks_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/227_Bug001_Design_System_Color_Token_Migration/next_tasks.md", + "n_spec": 4, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add SwiftFormat enforcement to pre-push hook and CI workflow to maintain consistent code style across the project.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftFormat must be run on all files before push and during CI; failures block merge.", + "source_line": null + }, + { + "type": "invariant", + "description": "All code must pass SwiftFormat checks in pre\u2011push and CI environments.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a pre\u2011push hook and GitHub Actions workflow to enforce SwiftFormat across the repository.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Strict Concurrency Checks Automation", + "description": "Automated enforcement of Swift StrictConcurrency across all build and test phases via pre-push hooks and CI.", + "source_line": null + }, + { + "name": "SwiftFormat Formatting Enforcement", + "description": "Pre\u2011push hook and CI workflow that enforces consistent code style using SwiftFormat.", + "source_line": null + }, + { + "name": "SwiftLint Complexity Thresholds Reinforcement", + "description": "Restoration and enforcement of SwiftLint complexity thresholds (cyclomatic, function length, type length) to maintain code quality.", + "source_line": null + }, + { + "name": "Test Coverage Gate", + "description": "Integration of coverage_analysis.py into CI to enforce minimum test coverage thresholds.", + "source_line": null + }, + { + "name": "Duplication Detection Guard", + "description": "CI workflow using jscpd to detect and block copy/paste regressions in Swift code.", + "source_line": null + }, + { + "name": "FoundationUI Interactive Components", + "description": "Implementation of interactive SwiftUI components such as buttons, sliders, toggles, and other user input controls.", + "source_line": null + }, + { + "name": "ParseIssueStore Concurrency Migration", + "description": "Migration of ParseIssueStore from GCD queues to @MainActor or custom actor isolation for Swift concurrency.", + "source_line": null + }, + { + "name": "Removal of @unchecked Sendable", + "description": "Elimination of @unchecked Sendable conformance after actor isolation is complete.", + "source_line": null + }, + { + "name": "Other Stores Migration", + "description": "Migrate remaining stores to Swift Concurrency following the ParseIssueStore pattern.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4533, + "line_count": 113 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/228_A7_Reinstate_SwiftLint_Complexity_Thresholds_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/228_A7_Reinstate_SwiftLint_Complexity_Thresholds_metrics.json new file mode 100644 index 00000000..c5e401fd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/228_A7_Reinstate_SwiftLint_Complexity_Thresholds_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/228_A7_Reinstate_SwiftLint_Complexity_Thresholds.md", + "n_spec": 11, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Restore and enforce SwiftLint complexity thresholds across the ISOInspector codebase to prevent code quality regressions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`.swiftlint.yml` is updated with cyclomatic_complexity, function_body_length, type_body_length, nesting depth limits tuned to current codebase state.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-commit hook runs `swiftlint lint --strict` and fails pushes on violations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow includes a SwiftLint analyzer step that runs `swiftlint lint --strict`, publishes an analyzer report artifact on violation, and fails the workflow when thresholds exceeded.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All existing code in Sources/ and Tests/ passes the reinstated thresholds (no violations).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updated to reflect complexity limits and guidance on checking locally and refactoring strategy.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verification by running `swiftlint lint --strict` locally shows zero violations and CI workflow passes SwiftLint step.", + "source_line": null + }, + { + "type": "invariant", + "description": "Complexity thresholds must always be enforced in pre-commit and CI to prevent regressions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate SwiftLint complexity checks into the pre-commit hook (`.githooks/pre-push`) and CI workflow (`.github/workflows/ci.yml`).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use `swiftlint lint --strict` with sarif reporter for automated analysis and artifact upload on failure.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Enable/restore four complexity rules in `.swiftlint.yml` with chosen thresholds based on current codebase metrics.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftLint Complexity Configuration", + "description": "Defines cyclomatic complexity, function body length, nesting depth, and type body length thresholds in .swiftlint.yml", + "source_line": null + }, + { + "name": "Pre-commit SwiftLint Hook", + "description": "Runs swiftlint lint --strict during pre-push to block pushes with violations", + "source_line": null + }, + { + "name": "CI SwiftLint Analyzer Step", + "description": "Executes swiftlint lint --strict in CI workflow, publishes SARIF report on failure and fails the job if thresholds exceeded", + "source_line": null + }, + { + "name": "Codebase Complexity Audit Tool", + "description": "Runs swiftlint with permissive thresholds to capture current complexity metrics for setting new limits", + "source_line": null + }, + { + "name": "Refactoring Guidance Workflow", + "description": "Provides instructions for refactoring high-complexity code and documenting exceptions via swiftlint:disable pragmas", + "source_line": null + }, + { + "name": "Documentation Update Process", + "description": "Updates README/CONTRIBUTING with complexity limits, local check guidance, and exception handling notes", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4209, + "line_count": 97 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_A8_Gate_Test_Coverage_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_A8_Gate_Test_Coverage_metrics.json new file mode 100644 index 00000000..5a3c0a97 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_A8_Gate_Test_Coverage_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_A8_Gate_Test_Coverage.md", + "n_spec": 9, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure test coverage stays above the agreed 67% threshold by running coverage_analysis.py in pre-push hook and GitHub Actions workflow, blocking merges or pushes that fall below the target and publishing the report artifact.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "coverage_analysis.py --threshold 0.67 runs automatically after swift test --enable-code-coverage in the pre-push hook; pushes abort with a clear error if the ratio drops below 67%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions adds a coverage job that executes the script against generated .build/debug/codecov/ data, fails the workflow when coverage <67%, and uploads the textual report under Documentation/Quality/ as an artifact.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation explains how to run the script locally, interpret the output, and update thresholds if requirements change.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The task is removed from next_tasks.md candidates and tracked by this document until archived.", + "source_line": null + }, + { + "type": "invariant", + "description": "coverage_analysis.py must read repo-relative paths; hardcoded path /home/user/ISOInspector/FoundationUI replaced with dynamic resolution.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update or create automation scripts so coverage_analysis.py reads repo-relative paths.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend .git/hooks/pre-push (or equivalent) to run swift test --enable\u2011code\u2011coverage and python coverage gate.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create/modify GitHub Actions workflow (ci.yml) to cache build artifacts, invoke tests with coverage flags..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Pre-push Coverage Gate", + "description": "Runs swift test with code coverage and executes coverage_analysis.py to enforce a minimum 67% threshold before allowing pushes", + "source_line": null + }, + { + "name": "GitHub Actions Coverage Job", + "description": "Automated CI job that runs tests with coverage, executes coverage_analysis.py, fails workflow if below threshold, and uploads a textual report artifact", + "source_line": null + }, + { + "name": "Dynamic Path Configuration for Coverage Script", + "description": "Modifies coverage_analysis.py to resolve repository-relative paths instead of hardcoded absolute paths", + "source_line": null + }, + { + "name": "Threshold Parameterization", + "description": "Allows the minimum coverage percentage to be set via an environment variable or command-line argument", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3051, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_BUG_Docc_Warnings_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_BUG_Docc_Warnings_metrics.json new file mode 100644 index 00000000..907b18c5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_BUG_Docc_Warnings_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/229_BUG_Docc_Warnings.md", + "n_spec": 10, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Eliminate DocC and Swift compilation warnings emitted while building ISOInspector documentation so the doc archive can be generated cleanly and the documentation site preserves credibility for downstream reviewers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocC build completes without warnings originating from ISOInspector repositories (FoundationUI, ISOInspectorKit, ISOInspectorApp).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tutorials validate without syntax warnings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Compiler warnings tied to @ViewBuilder misuse are eliminated.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "External package warnings are documented (if unavoidable) so CI filters know what remains.", + "source_line": null + }, + { + "type": "invariant", + "description": "DocC build must not emit unresolved symbol links for project-owned modules.", + "source_line": null + }, + { + "type": "invariant", + "description": "Documentation articles link only to valid symbols and tutorials render cleanly.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Export all FoundationUI modifiers that documentation referenced (BadgeChipStyle, CardStyle, InteractiveStyle, SurfaceStyle) and reword cross-target doc links to avoid unresolved symbol warnings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Modernize ISOInspectorApp documentation by updating tutorial steps to use DocC-supported directives and adding a table-of-contents with a bundle image.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Fix SwiftUI result-builder warning in SettingsPanelView by removing explicit returns and AnyView wrapping.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DocC Build Process", + "description": "Command or Xcode action that compiles documentation archives for ISOInspectorKit, FoundationUI, and ISOInspectorApp-macOS.", + "source_line": null + }, + { + "name": "Swift Compilation of ISOInspectorApp-macOS", + "description": "Build phase that compiles Swift source files, including SettingsPanelView, emitting compiler warnings.", + "source_line": null + }, + { + "name": "DocC Symbol Link Validation", + "description": "Mechanism that checks referenced symbols in documentation (e.g., BadgeChipStyle) against exported API surface to prevent unresolved symbol warnings.", + "source_line": null + }, + { + "name": "SwiftUI @ViewBuilder Usage Enforcement", + "description": "Rule or lint that ensures @ViewBuilder blocks do not contain explicit return statements or AnyView wrappers, eliminating related compiler warnings.", + "source_line": null + }, + { + "name": "DocC Tutorial Syntax Validation", + "description": "Parser that validates tutorial directives (e.g., Step(title:)) against supported DocC syntax to avoid syntax warnings.", + "source_line": null + }, + { + "name": "Documentation Article Structure Management", + "description": "Process for organizing and formatting documentation articles, including topics, sections, and link lists to satisfy DocC formatting rules.", + "source_line": null + }, + { + "name": "External Package Warning Suppression", + "description": "Feature that allows selective suppression of DocC warnings originating from third\u2011party SourcePackages such as Yams and NestedA11yIDs.", + "source_line": null + }, + { + "name": "Documentation Build Test Automation", + "description": "Automated test that runs xcodebuild docbuild to verify warning-free documentation generation.", + "source_line": null + }, + { + "name": "Swift Package Build Test Automation", + "description": "Automated test that builds ISOInspectorKit or FoundationUI packages to ensure source code compiles without errors.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8188, + "line_count": 87 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/README_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/README_metrics.json new file mode 100644 index 00000000..73a8c25b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/README_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/README.md", + "n_spec": 6, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Remove or relocate large log files (>1MB) from the repository to prevent committing them.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Large log files must be deleted if not needed, moved to a local-only location, or added to .gitignore if regenerated frequently.", + "source_line": null + }, + { + "type": "invariant", + "description": "The check-added-large-files pre-commit hook is temporarily disabled to allow commits to proceed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Re-enable the swift-build-foundationui pre-push hook after resolving test compilation failures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The swift-build-foundationui pre-push hook must be re-enabled once test compilation issues are fixed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Fix incorrect usage of YAMLValidator.validate() in tests and use the correct API methods validateComponent() or validateComponents().", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1603, + "line_count": 40 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_A7_SwiftLint_Complexity_Thresholds_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_A7_SwiftLint_Complexity_Thresholds_metrics.json new file mode 100644 index 00000000..9c87abed --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_A7_SwiftLint_Complexity_Thresholds_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_A7_SwiftLint_Complexity_Thresholds.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Restore and enforce SwiftLint complexity thresholds across the ISOInspector codebase to prevent code quality regressions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`.swiftlint.yml` updated with cyclomatic_complexity warning 30 error 55, function_body_length warning 250 error 350, type_body_length warning 1200 error 1500, nesting type_level warning 5 error 7.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-commit hook runs `swiftlint lint --strict --quiet` and fails pushes on violations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow includes a swiftlint-complexity job that runs `swiftlint lint --strict` on macos-latest and publishes SARIF report on failure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All existing code passes thresholds: 10 files exceed limits but have disable pragmas with rationale and @todo #A7 comments.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updated with a Code Quality Gates section in README.md explaining thresholds, enforcement mechanisms, and guidance for exceeding them.", + "source_line": null + }, + { + "type": "invariant", + "description": "Zero violations when running `swiftlint lint --strict` across the codebase.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Complexity rules are enforced via pre-commit hook and CI job to block pushes/PRs with violations.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftLint Complexity Threshold Configuration", + "description": "Defines cyclomatic complexity, function body length, type body length, and nesting depth limits in .swiftlint.yml", + "source_line": null + }, + { + "name": "Pre-commit SwiftLint Hook", + "description": "Runs swiftlint lint --strict --quiet before pushing code to enforce rules locally", + "source_line": null + }, + { + "name": "CI SwiftLint Complexity Job", + "description": "GitHub Actions job that installs SwiftLint, runs it in strict mode, and uploads SARIF report on failure", + "source_line": null + }, + { + "name": "Code Quality Gates Documentation", + "description": "README section explaining complexity thresholds, enforcement mechanisms, and how to fix violations", + "source_line": null + }, + { + "name": "Exception Pragmas in Source Files", + "description": "swiftlint:disable:next pragmas with rationale and @todo markers for files that exceed thresholds", + "source_line": null + }, + { + "name": "Build and Test Verification Scripts", + "description": "Commands to build ISOInspectorKit target and run tests ensuring no lint or test failures", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8212, + "line_count": 233 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion_metrics.json new file mode 100644 index 00000000..47ce5ebb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_TODO_to_PDD_Conversion.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Convert all TODO comments added during task A7 (SwiftLint complexity thresholds) from standard format (`// TODO:`) to Puzzle-Driven Development (PDD) format (`@todo #A7`) to enable automated task tracking and synchronization with `todo.md`.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All TODO comments have been successfully converted to PDD format: 9 files with `@todo #A7` markers, 0 remaining old-style TODOs.", + "source_line": null + }, + { + "type": "invariant", + "description": "No old-style TODO comments remain in the codebase (`// TODO:`).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Puzzle-Driven Development (PDD) format for task tracking by converting `// TODO:` to `@todo #A7` markers, linking refactoring work to originating task A7.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorKit", + "description": "Core library providing ISO file parsing and utilities", + "source_line": null + }, + { + "name": "ISOInspectorApp", + "description": "Application layer managing document sessions and UI interactions", + "source_line": null + }, + { + "name": "ISOInspectorCLI", + "description": "Command-line interface for event console formatting", + "source_line": null + }, + { + "name": "JSONParseTreeExporter", + "description": "Exports parsed ISO structures to JSON format", + "source_line": null + }, + { + "name": "ParsePipelineLiveTests", + "description": "Live tests validating the parse pipeline functionality", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4268, + "line_count": 139 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_Workflow_YAML_Validation_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_Workflow_YAML_Validation_metrics.json new file mode 100644 index 00000000..76d7a2d9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_Workflow_YAML_Validation_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/Summary_Workflow_YAML_Validation.md", + "n_spec": 12, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement comprehensive multi-layer validation system for GitHub Actions workflows to prevent broken workflows in main branch.", + "source_line": null + }, + { + "type": "user_story", + "description": "Fix YAML syntax errors in performance-regression.yml by correcting heredoc indentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Original YAML error fixed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All workflow files validate successfully.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-commit hooks configured.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI validation workflow created.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation written.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Changes committed and pushed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ready for PR review.", + "source_line": null + }, + { + "type": "invariant", + "description": "YAML files must use 2 spaces per indentation level, no tabs, and heredoc content must match parent block indentation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use pre-commit hooks (check-yaml, check-added-large-files, trailing-whitespace, end-of-file-fixer, validate-github-workflows) for local validation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement CI validation workflow with jobs: validate-yaml-syntax (PyYAML), validate-with-actionlint (actionlint), report-validation (summary).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "GitHub Actions Workflow YAML Validation CI", + "description": "A GitHub Actions workflow that validates all workflow YAML files for syntax and best practices using PyYAML and actionlint.", + "source_line": null + }, + { + "name": "Pre-commit Hook: check-yaml", + "description": "Local pre-commit hook that checks basic YAML syntax for any committed file, including .github/workflows/*.yml.", + "source_line": null + }, + { + "name": "Pre-commit Hook: check-added-large-files", + "description": "Hook preventing commits of files larger than 1MB.", + "source_line": null + }, + { + "name": "Pre-commit Hook: trailing-whitespace", + "description": "Hook that removes or flags trailing whitespace in committed files.", + "source_line": null + }, + { + "name": "Pre-commit Hook: end-of-file-fixer", + "description": "Ensures a newline at the end of file for all committed files.", + "source_line": null + }, + { + "name": "Pre-commit Hook: validate-github-workflows", + "description": "Custom local hook that validates GitHub Actions workflow YAML files for proper structure and heredoc indentation.", + "source_line": null + }, + { + "name": "Documentation: WORKFLOW_VALIDATION.md", + "description": "Guide detailing setup, common errors, heredoc indentation rules, IDE settings, and quick\u2011relevant commands.", + "source_line": null + }, + { + "name": "Python script for manual validation", + "description": "Command line snippet that loads YAML via PyYAML to check syntax of a specific workflow file.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7889, + "line_count": 319 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/blocked_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/blocked_metrics.json new file mode 100644 index 00000000..137b0730 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/blocked_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/blocked.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "invariant", + "description": "FoundationUI design tokens must be used exclusively in all view files; hardcoded .accentColor and manual opacity values are disallowed.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want to migrate ISOInspectorApp\u2019s color usage from hardcoded values to FoundationUI design tokens so that the app follows the centralized design system.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All affected view files (ParseTreeOutlineView.swift, ParseTreeDetailView.swift, ValidationSettingsView.swift, IntegritySummaryView.swift, ISOInspectorAppTheme.swift) must reference DS.* tokens for color and opacity; no hardcoded .accentColor or manual opacity remains.", + "source_line": null + }, + { + "type": "invariant", + "description": "Licensing approvals for Dolby Vision, AV1, VP9, Dolby AC-4, and MPEG-H fixtures must be obtained before importing assets and updating regression baselines.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a QA engineer, I want to import licensed media assets and refresh regression baselines so that tolerant parsing and export scenarios can validate against real-world payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Licensed assets are imported and regression baselines are refreshed; tests pass against the new payloads.", + "source_line": null + }, + { + "type": "invariant", + "description": "macOS hardware with 1 GiB performance fixture must be available before running the lenient\u2011vs\u2011strict benchmark.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a performance engineer, I want to execute the macOS 1 GiB benchmark and collect runtime and RSS metrics so that we can publish them in Documentation/Performance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark runs with ISOINSPECTOR_BENCHMARK_PAYLOAD_BYTES=1073741824 produce runtime and RSS metrics;\u00a0the results are archived\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Design System Color Token Migration", + "description": "Migrates hardcoded accent colors and opacity values in view files to use FoundationUI design tokens (DS.*) for consistency.", + "source_line": null + }, + { + "name": "Real-World Assets Acquisition", + "description": "Imports licensed media assets (Dolby Vision, AV1, VP9, Dolby AC-4, MPEG-H) and refreshes regression baselines for tolerant parsing and export scenarios.", + "source_line": null + }, + { + "name": "macOS Benchmark Execution", + "description": "Runs a 1 GiB lenient\u2011vs\u2011strict benchmark on macOS, collects runtime and RSS metrics, and archives results in Documentation/Performance.", + "source_line": null + }, + { + "name": "FoundationUI Performance Profiling with Instruments", + "description": "Manually profiles rendering, memory, and animation performance using Xcode Instruments across iOS 17 and macOS 14 devices to meet target thresholds.", + "source_line": null + }, + { + "name": "FoundationUI Performance Benchmarks", + "description": "Measures build time, binary size, memory footprint, FPS, and large\u2011node tree performance across platforms, documenting baseline metrics.", + "source_line": null + }, + { + "name": "Cross-Platform Testing", + "description": "Manually tests ComponentTestApp on iOS, macOS, and iPadOS devices/simulators for UI consistency, dark mode, RTL, locale, and orientation.", + "source_line": null + }, + { + "name": "Manual Accessibility Testing", + "description": "Verifies VoiceOver, keyboard navigation, dynamic type, contrast, and other accessibility features across iOS and macOS to achieve final sign\u2011off.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5433, + "line_count": 87 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/code_review_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/code_review_metrics.json new file mode 100644 index 00000000..43da0a20 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/code_review_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/code_review.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "YAMLParser.errorDescription", + "description": "Provides human\u2011readable error messages for YAML parsing failures such as invalid syntax, missing component type, structure errors, or file read issues.", + "source_line": null + }, + { + "name": "YAMLValidator.schema(for:)", + "description": "Returns a ComponentSchema object that defines the expected structure for a given component type (e.g., Badge).", + "source_line": null + }, + { + "name": "AccessibilityHelpers.gammaCorrect", + "description": "Applies gamma correction to a color component value to adjust luminance for accessibility calculations.", + "source_line": null + }, + { + "name": "AccessibilityFocusPriority.rawValue", + "description": "Maps an AccessibilityFocusPriority enum case to its corresponding Double sort priority used by SwiftUI's accessibility system.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4407, + "line_count": 88 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/lint_issue_index_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/lint_issue_index_metrics.json new file mode 100644 index 00000000..c0d99a47 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/lint_issue_index_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/lint_issue_index.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 22057, + "line_count": 349 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/next_tasks_metrics.json new file mode 100644 index 00000000..45691fa4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/next_tasks_metrics.json @@ -0,0 +1,143 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/228_A7_A8_SwiftLint_and_Coverage_Gates/next_tasks.md", + "n_spec": 14, + "n_func": 12, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement SwiftFormat enforcement in pre-push hook and CI workflow to maintain consistent code style across the project.", + "source_line": null + }, + { + "type": "invariant", + "description": "SwiftFormat must be enforced before any push is allowed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All commits must pass SwiftFormat checks; failing commits are rejected by pre-push hook and CI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reinstate SwiftLint complexity thresholds in the codebase to enforce coding standards.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftLint complexity thresholds are re-enabled and validated against existing code.", + "source_line": null + }, + { + "type": "user_story", + "description": "Gate test coverage using coverage_analysis.py to ensure minimum coverage levels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test coverage must meet the defined threshold; otherwise CI fails.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add Swift duplication detection to CI using jscpd in a new workflow file swift-duplication.yml.", + "source_line": null + }, + { + "type": "user_story", + "description": "Fix shellcheck style warnings in GitHub Actions workflows by removing suppression flags and re-enabling full validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All GitHub Actions workflows pass actionlint and shellcheck without suppressed warnings.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement interactive SwiftUI components (buttons, sliders, toggles) as part of Foundation UI Phase 2.", + "source_line": null + }, + { + "type": "user_story", + "description": "Migrate manual .accentColor usage to Foundation UI design tokens DS.Color.*.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The application uses only DS.Color* tokens for color and opacity values.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Move ParseIssueStore from GCD queues to @MainActor or custom actor isolation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftFormat Enforcement Hook", + "description": "Enforces SwiftFormat code style via pre-push hook and CI workflow", + "source_line": null + }, + { + "name": "Design System Color Token Migration", + "description": "Migrates hardcoded accent colors and opacity values to FoundationUI design tokens in the app views", + "source_line": null + }, + { + "name": "FoundationUI Phase 1 Completion", + "description": "Provides foundational design system components and utilities completed in Phase 1", + "source_line": null + }, + { + "name": "User Settings Panel Phase 1", + "description": "Floating settings panel UI for user preferences", + "source_line": null + }, + { + "name": "User Settings Panel Phase 2", + "description": "Persistence and reset functionality for user settings", + "source_line": null + }, + { + "name": "Strict Concurrency Checks Automation", + "description": "Automates Swift 6 concurrency cleanup checks in CI", + "source_line": null + }, + { + "name": "SDK Tolerant Parsing Documentation", + "description": "Documents tolerant parsing behavior for the SDK", + "source_line": null + }, + { + "name": "SwiftLint Complexity Thresholds Reinstate", + "description": "Reinstates complexity thresholds in SwiftLint configuration", + "source_line": null + }, + { + "name": "Test Coverage Gate", + "description": "Gates test coverage using a Python script to enforce coverage thresholds", + "source_line": null + }, + { + "name": "Swift Duplication Detection CI", + "description": "Adds jscpd-based duplication detection to CI workflow", + "source_line": null + }, + { + "name": "Shellcheck Style Warning Fixes", + "description": "Fixes shellcheck style warnings in GitHub Actions workflows", + "source_line": null + }, + { + "name": "FoundationUI Phase 2 Interactive Components", + "description": "Implements interactive SwiftUI components such as buttons, sliders\u00a0and\u00a0t\u2011\u00a0..", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5722, + "line_count": 142 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/A7_SwiftLint_Complexity_Thresholds_metrics.json b/DOCS/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/A7_SwiftLint_Complexity_Thresholds_metrics.json new file mode 100644 index 00000000..b7ee27fa --- /dev/null +++ b/DOCS/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/A7_SwiftLint_Complexity_Thresholds_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/A7_SwiftLint_Complexity_Thresholds.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Restore SwiftLint's complexity-related rules (cyclomatic complexity, function/type body length, and nesting) so that local hooks and CI block merges when the limits are exceeded.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": ".swiftlint.yml re-introduces the agreed cyclomatic_complexity, function_body_length, type_body_length, and nesting thresholds with any necessary per-target overrides documented inline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": ".githooks/pre-push executes swiftlint lint --strict (or the shared lint helper) so contributors cannot push when complexity rules fail.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": ".github/workflows/swiftlint.yml (and any aggregated CI workflow) surfaces the same rule set and publishes the analyzer artifact to PRs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation or developer notes mention how to adjust thresholds when parser generators expand, keeping the design tokens and FoundationUI workstreams aware of the guardrail.", + "source_line": null + }, + { + "type": "invariant", + "description": "SwiftLint must be installed on CI images; if not, bootstrap steps are documented in scripts/bootstrap_swiftlint.sh and caching is added to keep workflow within timeout limits.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend .swiftlint.yml comments so downstream tasks (A8, A10) understand why the thresholds differ between app and CLI targets, and note how the analyzer artifact gets attached via actions/upload-artifact.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftLint Complexity Threshold Configuration", + "description": "Defines cyclomatic complexity, function/body length, type/body length, and nesting limits in .swiftlint.yml with per-target overrides.", + "source_line": null + }, + { + "name": "Pre-commit SwiftLint Hook", + "description": "Runs swiftlint lint --strict via .githooks/pre-push to block pushes that violate complexity rules.", + "source_line": null + }, + { + "name": "CI SwiftLint Workflow", + "description": "Executes SwiftLint during CI (e.g., .github/workflows/swiftlint.yml) and publishes analyzer artifacts to PRs.", + "source_line": null + }, + { + "name": "SwiftLint Bootstrap Script", + "description": "Installs SwiftLint on CI images, caches binaries, and provides bootstrap steps in scripts/bootstrap_swiftlint.sh.", + "source_line": null + }, + { + "name": "Documentation for Threshold Adjustments", + "description": "Notes how to adjust thresholds when parser generators expand, including design token and FoundationUI guardrail awareness.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2917, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/Summary_of_Work_metrics.json new file mode 100644 index 00000000..97d3b8c2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/Summary_of_Work_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/229_A7_SwiftLint_Complexity_Thresholds/Summary_of_Work.md", + "n_spec": 9, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Restore SwiftLint complexity thresholds to enforce guardrails on parser and UI code growth.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Complexity thresholds for cyclomatic_complexity, function_body_length, type_body_length, and nesting are re\u2011introduced in .swiftlint.yml with documentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Local pre\u2011push Git hook runs swiftlint lint --strict --quiet and fails when violations exist.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions workflow runs SwiftLint on pull requests and pushes for Sources, Tests, FoundationUI, shared config, and ComponentTestApp, producing JSON artifacts per target.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FoundationUI and ComponentTestApp phases must fail the job if violations are found; main project phase is informational only until large files shrink below 1,500 lines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "PR comment summarizes errors/warnings and links to artifacts.", + "source_line": null + }, + { + "type": "invariant", + "description": "Main-project strict mode remains off until oversized files drop below 1,500 lines.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Git hook uses swiftlint --strict --quiet before push; GitHub Actions installs SwiftLint on macOS-15 runners and runs three scoped analyses with JSON reporters.", + "source_line": null + }, + { + "type": "invariant", + "description": "Automation backlog dependencies (A2/A8/A10) are documented to coordinate future adjustments.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftLint Configuration File", + "description": "Defines complexity thresholds for cyclomatic_complexity, function_body_length, type_body_length, and nesting in .swiftlint.yml", + "source_line": null + }, + { + "name": "Git Pre-Push Hook", + "description": "Runs swiftlint lint --strict before every push, failing if violations exist", + "source_line": null + }, + { + "name": "GitHub Actions SwiftLint Workflow", + "description": "Automated CI job that runs SwiftLint on pull requests and pushes for specified directories and publishes JSON reports", + "source_line": null + }, + { + "name": "Main Project Linting Step", + "description": "Informational-only SwiftLint run on Sources & Tests with tolerant errors and artifact upload", + "source_line": null + }, + { + "name": "FoundationUI Linting Step", + "description": "Strict SwiftLint run on FoundationUI directory, failures block job", + "source_line": null + }, + { + "name": "ComponentTestApp Linting Step", + "description": "Strict SwiftLint run inside Examples/ComponentTestApp, failures block\u00a0the\u00a0job", + "source_line": null + }, + { + "name": "PR Comment Summary", + "description": "Adds a PR comment summarizing per-target errors/warnings and links to artifacts", + "source_line": null + }, + { + "name": "Quality Gate Step", + "description": "Blocks pipeline only when FoundationUI or ComponentTestApp phases fail", + "source_line": null + }, + { + "name": "Documentation of Guardrails", + "description": "Notes in config comments, workflow\u00a0@todos\u00a0and repo\u00a0todo.md\u00a0for future adjustments", + "source_line": null + }, + { + "name": "Strict Mode Enablement Tracker", + "description": "Tracks when the main\u2011project strict flag should re\u2011enable after large files shrink below 1500 lines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3574, + "line_count": 41 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/C2_Extend_Outline_Filters_metrics.json b/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/C2_Extend_Outline_Filters_metrics.json new file mode 100644 index 00000000..69af5321 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/C2_Extend_Outline_Filters_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/C2_Extend_Outline_Filters.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement outline explorer filters that allow analysts to toggle visibility of MP4 box categories and streaming metadata indicators alongside existing validation-severity controls.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline filter UI exposes switches/chips for at least the defined box categories (e.g., metadata, media, index) and streaming-specific markers, allowing combinations with severity filters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Filtering operates on the current ParseTreeSnapshot without breaking virtualization performance targets (10k+ nodes) and keeps latency instrumentation within acceptable bounds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Filter state persists during live streaming updates from the Combine bridge and survives snapshot refreshes without resetting user selections.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit or UI tests cover category/streaming filtering logic, ensuring boxes enter/exit the visible set as expected.", + "source_line": null + }, + { + "type": "invariant", + "description": "Filtering must not break virtualization performance targets of 10k+ nodes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseTreeOutlineFilter to model category and streaming toggles while maintaining backward compatibility with severity filters and search matching.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate Combine snapshot publishers so filter recalculations remain responsive, reusing or extending existing latency probes for regression detection.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Outline Explorer Filters UI", + "description": "UI component that exposes switches or chips to toggle visibility of MP4 box categories (e.g., metadata, media, index) and streaming metadata indicators, allowing combinations with existing severity filters.", + "source_line": null + }, + { + "name": "ParseTreeOutlineFilter Model", + "description": "Data model representing filter state for category, streaming markers, and validation severity, used by the outline view to determine which nodes are visible.", + "source_line": null + }, + { + "name": "ParseTreeSnapshot Filtering Logic", + "description": "Algorithm that applies current filter settings to a ParseTreeSnapshot, producing a filtered set of nodes while maintaining virtualization performance for large trees.", + "source_line": null + }, + { + "name": "Filter State Persistence Mechanism", + "description": "Logic ensuring that user-selected filter toggles survive live streaming updates from the Combine bridge and snapshot refreshes without resetting selections.", + "source_line": null + }, + { + "name": "Unit Tests for Category/Streaming Filtering", + "description": "Test suite validating that boxes enter or exit the visible set correctly when category or streaming filters are applied, covering various combinations with severity filters.", + "source_line": null + }, + { + "name": "UI Tests for Filter Controls", + "description": "Automated UI tests verifying that the filter switches/chips in the outline explorer behave as expected and reflect the underlying model state.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2713, + "line_count": 53 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/Summary_of_Work_metrics.json new file mode 100644 index 00000000..64a24aa3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/Summary_of_Work_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/Summary_of_Work.md", + "n_spec": 2, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend outline filters to support box categories and streaming metadata for UI consumers", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Added reusable box classification helpers in ISOInspectorKit exposing BoxCategory and streaming indicator detection", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Box Category Classification Helper", + "description": "Provides reusable helpers to expose box categories for UI consumers", + "source_line": null + }, + { + "name": "Streaming Metadata Detection Helper", + "description": "Detects streaming indicators within boxes and exposes them for UI consumption", + "source_line": null + }, + { + "name": "Outline View Model Filter Extension", + "description": "Extends the outline view model filter to support category chips, a streaming toggle, and maintains severity filtering compatibility", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 770, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/next_tasks_metrics.json new file mode 100644 index 00000000..2494eee4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/22_C2_Extend_Outline_Filters/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Draft C3 detail and hex inspectors that subscribe to the Combine bridge for payload slices and metadata panes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend outline filters to surface box categories and streaming metadata.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "C3 Detail and Hex Inspectors", + "description": "API endpoints or UI components that subscribe to the Combine bridge for payload slices and metadata panes.", + "source_line": null + }, + { + "name": "Outline Filters Extension", + "description": "Feature that surfaces box categories and streaming metadata in outline filters.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 241, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/230_A8_Gate_Test_Coverage_metrics.json b/DOCS/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/230_A8_Gate_Test_Coverage_metrics.json new file mode 100644 index 00000000..64bc3b07 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/230_A8_Gate_Test_Coverage_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/230_A8_Gate_Test_Coverage.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ensure test coverage stays above the agreed 67% threshold by running coverage_analysis.py in pre-push hook and GitHub Actions workflow, blocking merges or pushes that fall below the target and publishing the report artifact.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "coverage_analysis.py --threshold 0.67 runs automatically after swift test --enable-code-coverage in the pre-push hook.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pushes abort with a clear error if the coverage ratio drops below 67%.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions adds a coverage job that executes the script against generated .build/debug/codecov/ data, fails the workflow when coverage <67%, and uploads the textual report under Documentation/Quality/ as an artifact.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation explains how to run the script locally, interpret the output, and update thresholds if requirements change.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The task is removed from next_tasks.md candidates and archived once complete.", + "source_line": null + }, + { + "type": "invariant", + "description": "coverage_analysis.py must correctly resolve repository-relative paths instead of hardcoded /home/user/ISOInspector/FoundationUI.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Pre-push hook will run swift test --enable-code-coverage before invoking coverage_analysis.py with threshold 0.67, capturing exit code and aborting push if non-zero.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "GitHub Actions workflow will cache .build/debug/codecov/ across runs, execute swift test --enable-code-coverage, run coverage_analysis.py with report path, fail workflow on non-zero exit, and upload artifact.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Environment variable ISOINSPECTOR_MIN_TEST_COVERAGE=0.67 will be used for future flexibility in threshold configuration.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Coverage Analysis Script", + "description": "Python script that calculates test coverage ratio from source and test files and reports if below threshold", + "source_line": null + }, + { + "name": "Pre-Push Hook for Coverage Gating", + "description": "Git hook that runs Swift tests with code coverage enabled, then executes the coverage analysis script and aborts push if coverage is insufficient", + "source_line": null + }, + { + "name": "GitHub Actions Coverage Job", + "description": "CI workflow step that runs Swift tests with code coverage, invokes the coverage analysis script, fails the job if coverage < 67%, and uploads a textual report as an artifact", + "source_line": null + }, + { + "name": "Dynamic Path Resolution Fix", + "description": "Modification to the coverage analysis script to use repository-relative paths instead of hardcoded absolute paths", + "source_line": null + }, + { + "name": "Coverage Report Artifact Upload", + "description": "Mechanism in CI to store the generated coverage report under Documentation/Quality/ for later reference", + "source_line": null + }, + { + "name": "Documentation Updates for Coverage Gating", + "description": "README and Docc guide updates explaining how to run the script locally, interpret output, and adjust thresholds", + "source_line": null + }, + { + "name": "Threshold Configuration Parameterization", + "description": "Use of environment variable ISOINSPECTOR_MIN_TEST_COVERAGE to allow dynamic threshold setting in scripts and CI", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4686, + "line_count": 106 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1f2e9abb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/Summary_of_Work_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/230_A8_Gate_Test_Coverage/Summary_of_Work.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a test coverage gating system that enforces a minimum of 67% coverage for the ISOInspector repository via pre-push hooks and GitHub Actions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The script `coverage_analysis.py` must dynamically locate the repository root, accept a threshold argument, output to stdout or file, and return exit code 0 when coverage meets or exceeds the threshold, otherwise 1.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-push hook `.githooks/pre-push` must detect changes in FoundationUI sources/tests, run `coverage_analysis.py --threshold 0.67`, respect an optional environment variable for custom thresholds, and block pushes with a clear error message if coverage is below the threshold.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub Actions workflow `.github/workflows/coverage-gate.yml` must run on PRs and pushes to main, execute tests with code coverage, invoke `coverage_analysis.py`, fail the job when coverage < 67%, upload coverage reports as artifacts, and comment on PRs with a summary.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation must include a guide explaining how to run tests locally, interpret coverage analysis output, update thresholds, and provide troubleshooting information.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always enforce the 67% coverage threshold unless overridden by the environment variable `ISOINSPECTOR_MIN_TEST_COVERAGE`.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a single Python script (`coverage_analysis.py`) with CLI arguments for dynamic path resolution and reporting, rather than hardcoded paths or multiple scripts.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement pre-push hook logic in `.githooks/pre-push` to perform the coverage check before any push is allowed, ensuring local enforcement.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Deploy GitHub Actions workflow to automate coverage checks on CI for PRs and main branch, providing artifacts and PR comments.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "coverage_analysis.py", + "description": "Script that calculates test coverage for the repository, supports dynamic path resolution, CLI arguments for threshold, report file, and verbose output; exits with code 0 if coverage meets threshold, 1 otherwise.", + "source_line": null + }, + { + "name": "Pre-push Hook", + "description": "Git hook that runs before pushes, detects changes to FoundationUI sources/tests, executes coverage_analysis.py with a 67% threshold (or env variable), blocks push if coverage is below threshold, provides error message and remediation guidance, skips when no relevant changes.", + "source_line": null + }, + { + "name": "GitHub Actions Coverage Workflow", + "description": "CI workflow triggered on PRs and main pushes that checks out code, sets up Swift 6.0, runs tests with coverage for FoundationUI and main project, executes coverage_analysis.py, generates markdown summary, uploads coverage reports as artifacts, comments on PRs with results.", + "source_line": null + }, + { + "name": "TestingAndCoverage.md Guide", + "description": "DocC guide detailing the coverage gating system, how to run tests locally, understand the script output, pre-push hook and workflow details, updating thresholds, best practices, troubleshooting, and examples.", + "source_line": null + }, + { + "name": "README Test Coverage Gating Section", + "description": "Quick reference in README that explains the 67% threshold enforcement, pre-push hook workflow, GitHub Actions automation, local analysis instructions, threshold updates, and links to the comprehensive guide.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 10073, + "line_count": 281 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/231_SwiftUI_Publishing_Changes_Warning_Fix/233_SwiftUI_Publishing_Changes_Warning_Fix_metrics.json b/DOCS/TASK_ARCHIVE/231_SwiftUI_Publishing_Changes_Warning_Fix/233_SwiftUI_Publishing_Changes_Warning_Fix_metrics.json new file mode 100644 index 00000000..ee064519 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/231_SwiftUI_Publishing_Changes_Warning_Fix/233_SwiftUI_Publishing_Changes_Warning_Fix_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/231_SwiftUI_Publishing_Changes_Warning_Fix/233_SwiftUI_Publishing_Changes_Warning_Fix.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a SwiftUI view model that updates displayed issues based on sort order and severity filter without causing runtime warnings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The view model must not publish changes to @Published properties during an active SwiftUI view update cycle.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Updates to displayedIssues should be deferred asynchronously using Task with @MainActor and await Task.yield().", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Any pending update tasks must be cancellable to avoid stale updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests interacting with the view model must be async and await waitForPendingUpdates() after property changes.", + "source_line": null + }, + { + "type": "invariant", + "description": "The updateDisplayedIssues method should only modify displayedIssues after the current run loop iteration completes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Swift Concurrency Task { @MainActor } instead of GCD DispatchQueue.main.async for scheduling derived state updates.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a private updateTask property to track and cancel pending tasks.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add waitForPendingUpdates() helper for test support that awaits any pending task and yields once more.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "IntegritySummaryViewModel", + "description": "Manages and publishes issue data for the Integrity Summary view, including sorting and filtering logic.", + "source_line": null + }, + { + "name": "scheduleUpdate()", + "description": "Defers updates to displayedIssues using Swift Concurrency to avoid publishing during view updates.", + "source_line": null + }, + { + "name": "waitForPendingUpdates()", + "description": "Test helper that waits for any pending async updates in the view model.", + "source_line": null + }, + { + "name": "IntegritySummaryView", + "description": "SwiftUI view displaying a list of issues, allowing users to change sort order and severity filters.", + "source_line": null + }, + { + "name": "SortOrder enum", + "description": "Defines sorting criteria (e.g., severity, offset) used by IntegritySummaryViewModel.", + "source_line": null + }, + { + "name": "SeverityFilter set", + "description": "Set of ParseIssue.Severity values that filter which issues are shown.", + "source_line": null + }, + { + "name": "updateDisplayedIssues()", + "description": "Internal method that applies current sort and filter settings to compute displayedIssues.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 11117, + "line_count": 381 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/232_MacOS_iPadOS_MultiWindow_SharedState_Bug/231_MacOS_iPadOS_MultiWindow_SharedState_Bug_metrics.json b/DOCS/TASK_ARCHIVE/232_MacOS_iPadOS_MultiWindow_SharedState_Bug/231_MacOS_iPadOS_MultiWindow_SharedState_Bug_metrics.json new file mode 100644 index 00000000..0e32dd9f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/232_MacOS_iPadOS_MultiWindow_SharedState_Bug/231_MacOS_iPadOS_MultiWindow_SharedState_Bug_metrics.json @@ -0,0 +1,138 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/232_MacOS_iPadOS_MultiWindow_SharedState_Bug/231_MacOS_iPadOS_MultiWindow_SharedState_Bug.md", + "n_spec": 10, + "n_func": 15, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user of ISOInspector on macOS/iPadOS, I want each window to maintain its own independent state for file selection, detail views, and other session-specific properties so that actions in one window do not affect the others.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When multiple windows are open, changing the selected file in one window does not change the selection in any other window.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each window displays its own document and detail panel content independently of other windows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hex viewer scroll position, search state, and tree view selections are isolated per window.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Closing a window does not close the documents open in other windows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each window persists its own state on close and restores it correctly when reopened.", + "source_line": null + }, + { + "type": "invariant", + "description": "The application must never share mutable document or UI state between windows; all shared data is read\u2011only or isolated per window.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Replace the singleton DocumentSessionController with a per-window WindowState (WindowSessionController) that holds independent DocumentViewModel, TreeOutlineViewModel, DetailPanelViewModel, HexViewerViewModel, and SearchViewModel instances.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use @SceneStorage or per\u2011scene environment objects to persist window\u2011specific state across launches.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Keep a shared app-level controller (appSessionController) for global data such as recents, preferences, and export functionality, while delegating document-specific operations to the per-window controller.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorApp", + "description": "Application entry point initializing shared app-level state and window group.", + "source_line": null + }, + { + "name": "WindowGroup", + "description": "SwiftUI WindowGroup that creates a new window for each document session.", + "source_line": null + }, + { + "name": "DocumentView", + "description": "Main view hierarchy displaying ISO contents, tree outline, detail panel, hex viewer, and search UI.", + "source_line": null + }, + { + "name": "DocumentSessionController", + "description": "Shared singleton controller managing global app state such as recent documents and preferences.", + "source_line": null + }, + { + "name": "WindowSessionController", + "description": "Per-window controller holding independent document state, parse tree store, annotation session, and view models.", + "source_line": null + }, + { + "name": "DocumentViewModel", + "description": "Observable object representing the current ISO document, its parse tree, and UI selections within a window.", + "source_line": null + }, + { + "name": "TreeOutlineViewModel", + "description": "State for expanded/collapsed nodes in the file tree view.", + "source_line": null + }, + { + "name": "DetailPanelViewModel", + "description": "State for detail panel content, scroll position, and selected details.", + "source_line": null + }, + { + "name": "HexViewerViewModel", + "description": "State for hex viewer scroll position, selection, and rendering options.", + "source_line": null + }, + { + "name": "SearchViewModel", + "description": "State for search query, results, and navigation within a document.", + "source_line": null + }, + { + "name": "PreferencesStore", + "description": "Observable object storing user preferences such as theme, font size, and other UI settings.", + "source_line": null + }, + { + "name": "ExportJSONCommand", + "description": "Command to export the current document\u2019s data to JSON format.", + "source_line": null + }, + { + "name": "ExportIssueSummaryCommand", + "description": "Command to export a summary of issues found in the current document.", + "source_line": null + }, + { + "name": "AppShellView", + "description": "Wrapper view that injects per-window WindowSessionController and shared app-level controller into the UI hierarchy.", + "source_line": null + }, + { + "name": "UnitTests", + "description": "Automated tests verifying independent window state, parse tree isolation, and export functionality.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 14972, + "line_count": 377 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/233_Resolved_Tasks_Batch/Task_241_Selection_metrics.json b/DOCS/TASK_ARCHIVE/233_Resolved_Tasks_Batch/Task_241_Selection_metrics.json new file mode 100644 index 00000000..50920340 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/233_Resolved_Tasks_Batch/Task_241_Selection_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/233_Resolved_Tasks_Batch/Task_241_Selection.md", + "n_spec": 16, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create NavigationSplitScaffold wrapper pattern that integrates NavigationSplitViewKit.NavigationModel with FoundationUI's design system for cross-platform navigation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Core API implemented with ViewBuilder support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NavigationModelKey environment integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Design token compliance (spacing, colors, animation, typography).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "35+ unit and integration tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "6+ SwiftUI previews including ISO Inspector reference.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "100% DocC API coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Zero SwiftLint violations.", + "source_line": null + }, + { + "type": "invariant", + "description": "All layout constants use DS tokens (no magic numbers).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a generic struct over Sidebar/Content/Detail view types.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Environment key for navigation state propagation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Platform support: iOS 17+, iPadOS 17+, macOS 14+.", + "source_line": null + }, + { + "type": "user_story", + "description": "Select Task 241 over Bug #232 and Task A7 based on priority, dependencies, and strategic value.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Task 241 selected because all dependencies satisfied (Task 240 complete).", + "source_line": null + }, + { + "type": "invariant", + "description": "No permanent blockers for Task 241.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Task selection follows rules in DOCS/COMMANDS/SELECT_NEXT.md and DOCS/RULES/03_Next_Task_Selection.md.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NavigationSplitScaffold API", + "description": "Generic SwiftUI wrapper struct that integrates NavigationSplitViewKit\u2019s NavigationModel with FoundationUI design system, exposing a view builder interface for sidebar, content, and detail views.", + "source_line": null + }, + { + "name": "EnvironmentKey for NavigationState", + "description": "An EnvironmentKey that propagates the navigation state throughout the view hierarchy, enabling child views to access and modify navigation context.", + "source_line": null + }, + { + "name": "DesignToken Integration", + "description": "All layout constants within NavigationSplitScaffold are derived from FoundationUI design system tokens (spacing, colors, animation, typography), ensuring zero magic numbers.", + "source_line": null + }, + { + "name": "Unit & Integration Tests", + "description": "A suite of 35+ automated tests covering core API behavior, environment propagation, token usage, and platform-specific functionality across iOS, iPadOS, macOS.", + "source_line": null + }, + { + "name": "SwiftUI Previews", + "description": "Six comprehensive SwiftUI previews demonstrating typical use cases, including an ISO Inspector mockup and platform comparison variants.", + "source_line": null + }, + { + "name": "DocC Documentation", + "description": "Full DocC API reference and usage guide for NavigationSplitScaffold, providing 100% coverage of public interfaces.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8071, + "line_count": 242 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/240_NavigationSplitViewKit_Integration_metrics.json b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/240_NavigationSplitViewKit_Integration_metrics.json new file mode 100644 index 00000000..7adcbc27 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/240_NavigationSplitViewKit_Integration_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/234_Resolved_Tasks_Batch/240_NavigationSplitViewKit_Integration.md", + "n_spec": 10, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate NavigationSplitViewKit Swift Package into FoundationUI module to enable modern navigation split view patterns across the application.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NavigationSplitViewKit dependency added to FoundationUI/Package.swift with version \u22651.0.0.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dependency mirrored in FoundationUI/Project.swift (Tuist).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Lockfiles regenerated successfully.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflows updated to cache the dependency.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All targets build successfully with the new dependency.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No build time regressions (or documented if any).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All existing tests pass.", + "source_line": null + }, + { + "type": "invariant", + "description": "SPM and Tuist configurations must remain consistent for NavigationSplitViewKit dependency.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use version pinning \u22651.0.0 for NavigationSplitViewKit to ensure stability.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SPM Dependency Addition", + "description": "Adds NavigationSplitViewKit as a Swift Package Manager dependency to FoundationUI's Package.swift with version pinning and documentation.", + "source_line": null + }, + { + "name": "Tuist Manifest Integration", + "description": "Mirrors the SPM dependency in Tuist's Project.swift and regenerates lockfiles to include the new package.", + "source_line": null + }, + { + "name": "CI/CD Dependency Caching", + "description": "Updates GitHub Actions workflows to cache NavigationSplitViewKit, monitors build time impact, and ensures CI can fetch and build it.", + "source_line": null + }, + { + "name": "Target Linking Verification", + "description": "Verifies that all relevant targets (main, examples, tests) link against NavigationSplitViewKit without linker errors across macOS, iOS, and iPadOS.", + "source_line": null + }, + { + "name": "Build Success Validation", + "description": "Ensures all targets build successfully with the new dependency and no regressions in build time or test failures.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2843, + "line_count": 71 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/242_Update_Existing_Patterns_For_NavigationSplitScaffold_metrics.json b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/242_Update_Existing_Patterns_For_NavigationSplitScaffold_metrics.json new file mode 100644 index 00000000..b5aab06e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/242_Update_Existing_Patterns_For_NavigationSplitScaffold_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/234_Resolved_Tasks_Batch/242_Update_Existing_Patterns_For_NavigationSplitScaffold.md", + "n_spec": 8, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Update SidebarPattern to consume NavigationModel from environment and provide sidebar visibility control when inside NavigationSplitScaffold while maintaining backward compatibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update InspectorPattern to consume NavigationModel from environment, react to inspector column visibility and pinning state, and expose accessibility labels for toggle actions, with graceful degradation outside scaffold.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update ToolbarPattern to consume NavigationModel from environment, provide toolbar items for column visibility toggles, add keyboard shortcuts and VoiceOver labels when inside NavigationSplitScaffold, and hide/disable controls gracefully when outside.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SidebarPattern must access @Environment(\\.navigationModel) and use navigationModel.columnVisibility to determine sidebar visibility; if navigationModel is nil, it should fall back to internal state without errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "InspectorPattern must access @Environment(\\.?navigationModel), react to inspector column visibility changes via navigationModel.columnVisibility, support pinning state from NavigationModel, and provide accessibility labels for toggle actions; fallback to internal state when navigationModel is nil.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ToolbarPattern must access @Environment(\\.navigationModel) and conditionally display toolbar items for sidebar and inspector toggles with keyboard shortcuts (\u2318\u2303S, \u2318\u2325I), expose VoiceOver labels; if navigationModel is nil, toolbar items should be hidden or disabled.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests must cover six scenarios: Scaffold + SidebarPattern composition, Scaffold + InspectorPattern composition, Scaffold + ToolbarPattern composition, full three-pattern composition, NavigationModel synchronization across patterns, column visibility state propagation, accessibility label verification, and platform-specific behavior (compact vs regular).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests: 3 for SidebarPattern (environment access, backward compatibility, visibility sync), 3 for InspectorPattern (environment access, visibility binding, pinning coordination), 3 for ToolbarPattern (conditional items, keyboard shortcuts, accessibility labels).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SidebarPattern", + "description": "A SwiftUI component that displays a sidebar list of sections and handles selection. It can operate standalone or within NavigationSplitScaffold, accessing the shared NavigationModel to sync visibility and provide accessibility labels.", + "source_line": null + }, + { + "name": "InspectorPattern", + "description": "A SwiftUI component that shows an inspector panel. It reacts to column visibility changes from NavigationModel when inside a scaffold, supports pinning state, and falls back to internal state when used standalone.", + "source_line": null + }, + { + "name": "ToolbarPattern", + "description": "A SwiftUI toolbar providing navigation controls such as toggling sidebar and inspector columns, keyboard shortcuts, and VoiceOver labels. It conditionally shows items based on the presence of a NavigationModel in the environment.", + "source_line": null + }, + { + "name": "NavigationSplitScaffold", + "description": "A layout container that arranges three columns (sidebar, content, detail) using NavigationModel for state management across platforms. It supplies the navigationModel environment key to child patterns.", + "source_line": null + }, + { + "name": "NavigationModel", + "description": "An observable object representing the shared navigation state, including column visibility and pinning information, exposed via an environment key.", + "source_line": null + }, + { + "name": "IntegrationTests/NavigationScaffoldIntegrationTests", + "description": "A suite of XCTest cases that verify correct composition of SidebarPattern, InspectorPattern, and ToolbarPattern within NavigationSplitScaffold, ensuring state synchronization, accessibility, and platform behavior.", + "source_line": null + }, + { + "name": "AgentSupport YAML Schemas", + "description": "Configuration files defining component types such as navigationScaffold, specifying properties like column visibility bindings and documenting environment access for pattern integration.", + "source_line": null + }, + { + "name": "DocC Documentation & Migration Guide", + "description": "Documentation that explains how to use and migrate existing patterns to work with NavigationSplitScaffold, including examples, architecture diagrams and best\u2011practice guidelines.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 12595, + "line_count": 409 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_240_metrics.json b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_240_metrics.json new file mode 100644 index 00000000..7e66d2b4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_240_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_240.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate NavigationSplitViewKit as a foundational dependency for FoundationUI's navigation architecture modernization.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NavigationSplitViewKit dependency added to Package.swift with version \u22651.0.0.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dependency mirrored in Project.swift (Tuist) with same version constraint.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflows updated to cache the SPM dependency and invalidate on Package.resolved changes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updated: README.md and BUILD.md include a dependencies section listing NavigationSplitViewKit.", + "source_line": null + }, + { + "type": "invariant", + "description": "SPM and Tuist configurations must use identical version constraints for NavigationSplitViewKit to ensure consistent dependency resolution.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use semantic versioning with .from(\"1.0.0\") to pin major version 1.x of NavigationSplitViewKit, preventing breaking changes from major bumps.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Cache SPM dependencies in CI using actions/cache keyed on hash of Package.resolved for reproducible builds and performance.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SPM Dependency Integration", + "description": "Adds NavigationSplitViewKit as a Swift Package Manager dependency to FoundationUI's Package.swift", + "source_line": null + }, + { + "name": "Tuist Dependency Integration", + "description": "Mirrors the SPM dependency in Tuist's Project.swift and links it to the foundationUIFramework target", + "source_line": null + }, + { + "name": "CI Dependency Caching", + "description": "Configures GitHub Actions workflow to cache SPM dependencies for faster CI builds", + "source_line": null + }, + { + "name": "Documentation Dependencies Section", + "description": "Updates README.md and BUILD.md with a new Dependencies section listing NavigationSplitViewKit and its purpose", + "source_line": null + }, + { + "name": "Task Specification Document", + "description": "Creates DOCS/INPROGRESS/240_NavigationSplitViewKit_Integration.md outlining objectives, criteria, and steps", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 7835, + "line_count": 249 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_241_metrics.json b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_241_metrics.json new file mode 100644 index 00000000..5c8ee4ad --- /dev/null +++ b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_241_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_241.md", + "n_spec": 12, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a generic NavigationSplitScaffold pattern that wraps NavigationSplitViewKit and supports Sidebar, Content, and Detail views with design token integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NavigationSplitScaffold struct is implemented with generics over Sidebar, Content, and Detail view types.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Public initializer accepts ViewBuilder closures for sidebar, content, and detail.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration with NavigationSplitViewKit via a NavigationModel property wrapped in @Bindable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All layout constants use DS tokens (spacing, colors, typography, animation) and contain no magic numbers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Environment key NavigationModelKey is created with defaultValue nil and EnvironmentValues extension provides navigationModel property.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NavigationModel is propagated to sidebar, content, and detail views via .environment(\\.&navigationModel, navigationModel).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover initialization, navigation model state transitions, environment key defaults, column visibility transitions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integration tests verify environment propagation to all columns.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility labels support is tested and implemented.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Platform adaptation behavior for iOS, iPadOS, macOS is documented and tested.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Six comprehensive SwiftUI previews (i.e., 1..6)\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NavigationSplitScaffold View", + "description": "Generic SwiftUI view that composes a sidebar, content, and detail column using NavigationSplitViewKit and design system tokens.", + "source_line": null + }, + { + "name": "NavigationModel Environment Key", + "description": "Environment key exposing the navigation model to child views via \".navigationModel\".", + "source_line": null + }, + { + "name": "Public Initializer for Scaffold", + "description": "Initializer accepting a NavigationModel and ViewBuilder closures for sidebar, content, and detail.", + "source_line": null + }, + { + "name": "Binding of NavigationModel", + "description": "@Bindable property wrapper that provides two\u2011way binding of column visibility and preferred compact column.", + "source_line": null + }, + { + "name": "Design System Token Usage", + "description": "All spacing, colors, typography, and animations in the scaffold use DS tokens (e.g., DS.Spacing.m, DS.Colors.textSecondary).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 11859, + "line_count": 422 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_242_metrics.json b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_242_metrics.json new file mode 100644 index 00000000..a1d0b31d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_242_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/234_Resolved_Tasks_Batch/Summary_of_Work_Task_242.md", + "n_spec": 8, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Update SidebarPattern to support NavigationSplitScaffold integration while maintaining backward compatibility.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update InspectorPattern to support NavigationSplitScaffold integration and enhanced accessibility when inside a scaffold.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update ToolbarPattern to provide navigation controls (sidebar/inspector toggles) when inside a NavigationSplitScaffold, with keyboard shortcuts and accessibility labels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SidebarPattern must detect presence of $navigationModel via @Environment and render only sidebar content in scaffold mode, otherwise render full NavigationSplitView.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SidebarPattern must provide enhanced accessibility label \"File Browser in Navigation\" when inside a scaffold.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SidebarPattern must remain fully functional without a navigationModel (standalone) and not produce runtime errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "InspectorPattern must detect $navigationModel via @Environment and adjust accessibility labels to \"{title} Inspector\" with hint \"Detail inspector within navigation\" when inside scaffold.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Inspector\u00a0\u200b\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SidebarPattern View", + "description": "SwiftUI view that renders a sidebar; adapts to be inside or outside NavigationSplitScaffold, providing navigation split view when standalone.", + "source_line": null + }, + { + "name": "InspectorPattern View", + "description": "SwiftUI view presenting an inspector panel with header and scrollable content; adjusts accessibility labels based on scaffold context.", + "source_line": null + }, + { + "name": "ToolbarPattern View", + "description": "SwiftUI toolbar that conditionally shows navigation controls (sidebar/inspector toggles) when inside a NavigationSplitScaffold, including keyboard shortcuts.", + "source_line": null + }, + { + "name": "NavigationModel Environment Key", + "description": "Environment key exposing the current NavigationSplitViewKit navigation model to child views for context detection.", + "source_line": null + }, + { + "name": "isInScaffold Computed Property", + "description": "Boolean computed property used by patterns to determine if they are rendered within a NavigationSplitScaffold.", + "source_line": null + }, + { + "name": "toggleSidebar Function", + "description": "Method in ToolbarPattern that toggles sidebar visibility via the navigation model\u2019s columnVisibility state.", + "source_line": null + }, + { + "name": "toggleInspector Function", + "description": "Method in ToolbarPattern that manages inspector column visibility using the navigation model.", + "source_line": null + }, + { + "name": "NavigationScaffoldIntegrationTests Test Suite", + "description": "XCTest suite with 15 integration tests validating pattern behavior inside and outside a scaffold, accessibility, platform\u2011specific behavior, and backward compatibility.", + "source_line": null + }, + { + "name": "SwiftUI Previews for SidebarPattern", + "description": "Preview demonstrating SidebarPattern in both standalone and scaffold modes, including content and inspector columns.", + "source_line": null + }, + { + "name": "SwiftUI Previews for InspectorPattern", + "description": "Preview showing InspectorPattern within a three\u2011column layout inside NavigationSplitScaffold.", + "source_line": null + }, + { + "name": "SwiftUI Previews for ToolbarPattern", + "description": "Preview illustrating ToolbarPattern with navigation controls and keyboard shortcuts in a scaffolded environment.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 20176, + "line_count": 579 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/235_Resolved_Tasks_Batch/A7_SwiftLint_Complexity_Thresholds_metrics.json b/DOCS/TASK_ARCHIVE/235_Resolved_Tasks_Batch/A7_SwiftLint_Complexity_Thresholds_metrics.json new file mode 100644 index 00000000..479d46a4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/235_Resolved_Tasks_Batch/A7_SwiftLint_Complexity_Thresholds_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/235_Resolved_Tasks_Batch/A7_SwiftLint_Complexity_Thresholds.md", + "n_spec": 11, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Restore code quality gates by configuring SwiftLint complexity thresholds for cyclomatic complexity, function body length, nesting depth, and type body length across all Swift targets (ISOInspectorKit, ISOInspector UI, CLI).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`.swiftlint.yml` configuration file restores the following rules with agreed limits: cyclomatic_complexity max 10, function_body_length max 40 lines, nesting_level max 5 levels, type_body_length max 200 lines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pre-commit hook `.git/hooks/pre-commit` executes `swiftlint lint --strict` on staged Swift files and blocks commit if violations detected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow step runs complexity checks on every PR and push, fails build if violations exceed thresholds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftLint analyzer report artifact is generated and uploaded to GitHub Actions for each CI run.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All three targets pass without complexity violations: ISOInspectorKit, ISOInspector (SwiftUI app target), isoinspect (CLI target).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updated in README.md under Code Quality or Tooling section explaining how to run local checks, auto-fix simple violations, and interpret CI analyzer reports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests confirm that existing codebase passes new thresholds (no false positives blocking the build).", + "source_line": null + }, + { + "type": "invariant", + "description": "SwiftLint strict mode is fully enforced with no suppressions remaining for core files after refactoring.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Refactor large Swift files (e.g., BoxValidator.swift, DocumentSessionController.swift) into smaller modules to reduce type_body_length violations and improve maintainability.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use file-level swiftlint disable comments with PDD @todo #a7 markers for remaining violations that cannot be split further.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftLint Complexity Threshold Configuration", + "description": "Defines cyclomatic complexity, function body length, nesting depth, and type body length limits in .swiftlint.yml for all Swift targets.", + "source_line": null + }, + { + "name": "Pre-commit SwiftLint Hook", + "description": "Runs swiftlint lint --strict on staged Swift files before commit, blocking commits with violations.", + "source_line": null + }, + { + "name": "CI SwiftLint Step", + "description": "Executes swiftlint lint with JSON reporter during CI runs, failing the build if thresholds are exceeded and uploading a report artifact.", + "source_line": null + }, + { + "name": "SwiftLint Report Artifact Upload", + "description": "Generates and uploads swiftlint-report.json as an artifact in GitHub Actions for each CI run.", + "source_line": null + }, + { + "name": "Documentation Update \u2013 Code Quality Section", + "description": "Adds README.md section explaining how to run local SwiftLint checks, auto-fix, and interpret CI reports.", + "source_line": null + }, + { + "name": "Target-Specific Complexity Compliance", + "description": "Ensures ISOInspectorKit, ISOInspector UI, and isoinspect CLI targets meet complexity thresholds without violations.", + "source_line": null + }, + { + "name": "Local SwiftLint Execution Command", + "description": "Provides command swiftlint lint --strict for developers to run local checks.", + "source_line": null + }, + { + "name": "Auto-Fix Simple Violations Command", + "description": "Provides command swiftlint --fix for automatically fixing simple SwiftLint violations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9196, + "line_count": 144 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/236_Resolved_Tasks_Batch/A8_Test_Coverage_Gate_metrics.json b/DOCS/TASK_ARCHIVE/236_Resolved_Tasks_Batch/A8_Test_Coverage_Gate_metrics.json new file mode 100644 index 00000000..2049a5c2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/236_Resolved_Tasks_Batch/A8_Test_Coverage_Gate_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/236_Resolved_Tasks_Batch/A8_Test_Coverage_Gate.md", + "n_spec": 9, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add automated coverage enforcement so pushes and CI runs fail when overall Swift test coverage drops below the 0.67 threshold, and publish coverage artifacts for inspection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`.githooks/pre-push` runs `coverage_analysis.py --threshold 0.67` after `swift test --enable-code-coverage` and blocks pushes when coverage is below the threshold.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`.github/workflows/ci.yml` runs the same coverage gate post-tests and fails the workflow when the threshold is not met.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Coverage report artifacts (HTML or JSON) are uploaded under `Documentation/Quality/` for CI runs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Planning files (`todo.md`, Execution Workplan) are updated to reflect the enforced gate once implemented.", + "source_line": null + }, + { + "type": "invariant", + "description": "Pre-push hook changes preserve executable permissions and are mirrored in CI to avoid divergence.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the existing `coverage_analysis.py` utility; verify its invocation path matches repository layout.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "If coverage artifacts are large, consider pruning history or compressing before upload to keep CI artifacts lightweight.", + "source_line": null + }, + { + "type": "invariant", + "description": "Coverage data paths for both SwiftPM packages and workspace targets must be validated to avoid missing modules.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Pre-push Coverage Gate Hook", + "description": "Runs Swift tests with code coverage enabled and executes coverage_analysis.py to enforce a minimum coverage threshold before allowing pushes", + "source_line": null + }, + { + "name": "CI Coverage Gate Job", + "description": "Adds a macOS job in the CI workflow that runs Swift tests, performs coverage analysis, and fails the workflow if the threshold is not met", + "source_line": null + }, + { + "name": "Coverage Report Artifact Upload", + "description": "Uploads generated HTML or JSON coverage reports from Documentation/Quality/ as artifacts for inspection during CI runs", + "source_line": null + }, + { + "name": "Threshold Configuration Support", + "description": "Allows the coverage threshold to be overridden via ISOINSPECTOR_MIN_TEST_COVERAGE environment variable", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2857, + "line_count": 36 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/237_Resolved_Tasks_Batch/A10_Swift_Duplication_Detection_metrics.json b/DOCS/TASK_ARCHIVE/237_Resolved_Tasks_Batch/A10_Swift_Duplication_Detection_metrics.json new file mode 100644 index 00000000..092f3e67 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/237_Resolved_Tasks_Batch/A10_Swift_Duplication_Detection_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/237_Resolved_Tasks_Batch/A10_Swift_Duplication_Detection.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a Swift duplication guard workflow that fails CI when duplicated Swift code exceeds 1% overall or any single clone surpasses 45 lines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The workflow file .github/workflows/swift-duplication.yml must run on push to main and pull_request events, execute scripts/run_swift_duplication_check.sh, provision Node 20, and fail when thresholds are exceeded.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Console report is saved to artifacts/swift-duplication-report.txt (or similar) and uploaded via actions/upload-artifact for each CI run with at least 30\u2011day retention.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A pre\u2011push hook invokes the duplication check wrapper and stores its report under Documentation/Quality/, allowing developers to see duplication before pushing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation (todo.md, Execution Workplan row A10, PRD references) is updated to indicate live CI gate and pre\u2011push hook with remediation guidance.", + "source_line": null + }, + { + "type": "invariant", + "description": "The duplication check must ignore generated artifacts/Derived/, .build/, TestResults-* directories as specified in the jscpd flags.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a wrapper script scripts/run_swift_duplication_check.sh to encapsulate npx jscpd@3.5.10 invocation, enabling local execution and CI reuse.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provision Node 20 via actions/setup-node@v4 with caching to reduce install time and set npm config fund false to suppress logs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Deduplicate the InMemoryRandomAccessReader helper into Sources/ISOInspectorKit/TestSupport/ to centralize test support and remove last in\u2011repo clone.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Swift Duplication Guard Workflow", + "description": "GitHub Actions workflow that runs on push to main and pull_request, executing a duplication check script and failing if thresholds are exceeded.", + "source_line": null + }, + { + "name": "Duplication Check Script", + "description": "Shell wrapper `scripts/run_swift_duplication_check.sh` that invokes jscpd with Swift-specific flags and threshold settings.", + "source_line": null + }, + { + "name": "Artifact Upload", + "description": "Uploads the console report to GitHub Actions artifacts (`artifacts/swift-duplication-report.txt`) for each CI run.", + "source_line": null + }, + { + "name": "Pre\u2011push Hook Integration", + "description": "Local git pre\u2011push hook that runs the duplication check wrapper and stores the report under Documentation/Quality/ before allowing a push.", + "source_line": null + }, + { + "name": "Threshold Configuration", + "description": "Defines overall duplicate percentage limit (\u22641%) and maximum clone length (45 lines) used by jscpd.", + "source_line": null + }, + { + "name": "Ignore Path Rules", + "description": "Specifies directories to ignore during duplication scanning such as Derived, .build, TestResults, Documentation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3994, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/238_Summary_NEW_Command_Execution/243_Summary_NEW_Command_Execution_metrics.json b/DOCS/TASK_ARCHIVE/238_Summary_NEW_Command_Execution/243_Summary_NEW_Command_Execution_metrics.json new file mode 100644 index 00000000..18fe2ebe --- /dev/null +++ b/DOCS/TASK_ARCHIVE/238_Summary_NEW_Command_Execution/243_Summary_NEW_Command_Execution_metrics.json @@ -0,0 +1,168 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/238_Summary_NEW_Command_Execution/243_Summary_NEW_Command_Execution.md", + "n_spec": 17, + "n_func": 14, + "intent_atoms": [ + { + "type": "user_story", + "description": "Reorganize NavigationSplitView layout by moving Selection Details and Integrity Summary to the Inspector column with a toggle control in the Content panel header.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selection Details fully functional in third column (Inspector).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Integrity Summary toggleable via button on Box Tree panel header.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All 35+ NavigationSplitScaffold tests pass.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All 15+ Task 242 integration tests pass.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "25-30 new unit tests for Task 243.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "10-15 new integration tests for Task 243.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "4+ UI snapshot tests for responsive layouts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bug #232 fixed and verified.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver & keyboard navigation working.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NavigationSplitView_Guidelines.md updated.", + "source_line": null + }, + { + "type": "invariant", + "description": "Bug #232 must be fixed before Task 243 end\u2011to\u2011end testing begins.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing NavigationSplitScaffold pattern to implement three\u2011column layout; no new dependencies required.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "InspectorDetailView container will host Selection Details and Integrity Summary.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Toggle state management implemented via InspectorDetailState observable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Responsive design handled for 360\u2011700pt widths with compact/regular size classes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Accessibility features (VoiceOver, dynamic type, keyboard shortcuts) integrated in each phase.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NavigationSplitView three-column layout", + "description": "Provides a three\u2011column UI with Sidebar, Content and Inspector columns.", + "source_line": null + }, + { + "name": "InspectorDetailView container", + "description": "Container view that hosts Selection Details in the Inspector column.", + "source_line": null + }, + { + "name": "SelectionDetailsView components", + "description": "Seven sub\u2011components displaying detailed information about the selected item.", + "source_line": null + }, + { + "name": "ParseTreePanelHeaderView toggle button", + "description": "Toggle control in the Content panel header to show/hide Integrity Summary.", + "source_line": null + }, + { + "name": "SelectionIntegritySummaryView", + "description": "View that presents integrity summary data for the selected file.", + "source_line": null + }, + { + "name": "AppShellView three\u2011column configuration", + "description": "Updates AppShellView to use a three\u2011column layout across platforms.", + "source_line": null + }, + { + "name": "Responsive inspector column layout logic", + "description": "Handles compact/regular size classes and width ranges (360\u2011700pt) for Inspector column.", + "source_line": null + }, + { + "name": "Accessibility audit for Inspector components", + "description": "VoiceOver labels, dynamic type scaling, keyboard shortcuts for the new inspector features.", + "source_line": null + }, + { + "name": "State management for inspector toggle", + "description": "Observable state (InspectorDetailState) controlling visibility of Integrity Summary.", + "source_line": null + }, + { + "name": "Unit tests for SelectionDetailsView", + "description": "Automated unit tests covering functionality of the seven sub\u2011components.", + "source_line": null + }, + { + "name": "Unit tests for SelectionIntegritySummaryView", + "description": "Tests verifying integrity summary rendering and toggle behavior.", + "source_line": null + }, + { + "name": "Integration tests for NavigationSplitScaffold", + "description": "End\u2011to\u2011end tests ensuring new inspector layout works with existing navigation scaffold.", + "source_line": null + }, + { + "name": "UI snapshot tests for responsive layouts", + "description": "Snapshot tests validating Inspector column appearance across device sizes.", + "source_line": null + }, + { + "name": "Bug #232 fix", + "description": "Resolution of UI blank issue after file selection, enabling proper rendering of the new layout.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 12728, + "line_count": 312 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/239_Summary_of_Work_2025-12-17/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/239_Summary_of_Work_2025-12-17/Summary_of_Work_metrics.json new file mode 100644 index 00000000..487e3cdd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/239_Summary_of_Work_2025-12-17/Summary_of_Work_metrics.json @@ -0,0 +1,143 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/239_Summary_of_Work_2025-12-17/Summary_of_Work.md", + "n_spec": 16, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement Swift duplication detection gate for PRs and main branch pushes using npx jscpd with thresholds of \u22641% overall duplication and <45-line clones.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The duplication check wrapper script outputs a report to artifacts/swift-duplication-report.txt and ignores generated/Derived/.build/TestResults directories.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "GitHub workflow swift-duplication.yml runs on PRs and pushes to main, provisions Node 20, invokes the wrapper, and uploads the report as an artifact with 30\u2011day retention.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add a test coverage gate for macOS-only FoundationUI that enforces \u226567% code coverage using swift test --enable-code-coverage and a custom Python analysis script.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The pre\u2011push hook runs the coverage check locally on macOS and reports under Documentation/Quality/. The CI workflow mirrors this behavior and uploads coverage logs/reports as artifacts.", + "source_line": null + }, + { + "type": "invariant", + "description": "Coverage gate must only run on macOS runners; it fails on Linux due to missing SwiftUI SDK.", + "source_line": null + }, + { + "type": "user_story", + "description": "Refactor BoxValidator.swift into a coordinator with 12 separate validation rule types, reducing its size from 1748 to 66 lines and removing swiftlint type_body_length suppression.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All 12 validation rules are placed in Sources/ISOInspectorKit/Validation/ValidationRules/ and the main BoxValidator.swift contains only the coordinator struct and default rules list.", + "source_line": null + }, + { + "type": "user_story", + "description": "Refactor DocumentSessionController.swift into a thin coordinator by extracting 7 specialized services, reducing its size from 1652 to 347 lines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The extracted services are located in Sources/ISOInspectorApp/State/Services/ and include BookmarkService, etc., with the main controller acting only as a coordinator.", + "source_line": null + }, + { + "type": "invariant", + "description": "All refactor tasks for A7 must be tracked in todo.md and marked complete when finished.", + "source_line": null + }, + { + "type": "user_story", + "description": "Remove SwiftLint type_body_length suppressions from JSONParseTreeExporter.swift by splitting it into helper functions and using a baseline file to keep legacy violations documented.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A .swiftlint.baseline.json file is added for the project and updated workflows/hooks to consume it, ensuring new violations fail while legacy debt remains.", + "source_line": null + }, + { + "type": "user_story", + "description": "Make document-loading factories Sendable to prevent actor\u2011boundary breaches and enable smoke tests under strict concurrency.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Factories are marked as @unchecked Sendable where needed and the rest of the document loading code is restructured to avoid actor\u2011boundaries.", + "source_line": null + }, + { + "type": "invariant", + "description": "Smoke tests must only run with strict concurrency enabled.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Swift Duplication Check Wrapper", + "description": "Shell script that runs jscpd to detect Swift code duplication and outputs a report.", + "source_line": null + }, + { + "name": "GitHub Action for Swift Duplication", + "description": "Workflow that triggers on PRs/pushes, runs the duplication check, and uploads the report as an artifact.", + "source_line": null + }, + { + "name": "Pre\u2011push Duplication Gate Hook", + "description": "Git hook that executes the duplication check before pushes and writes a report to Documentation/Quality.", + "source_line": null + }, + { + "name": "InMemoryRandomAccessReader Deduplication", + "description": "Shared implementation used by tests for random access reading.", + "source_line": null + }, + { + "name": "Test Coverage Gate Script", + "description": "Shell script in pre\u2011push that runs swift test with code coverage and analyzes results against a threshold.", + "source_line": null + }, + { + "name": "Coverage\u2011Gate GitHub Action", + "description": "CI job that mirrors the coverage gate, uploads coverage logs/reports as artifacts.", + "source_line": null + }, + { + "name": "Box Validation Rules Set", + "description": "Collection of individual SwiftLint\u2011compliant validation rule files for ISO boxes.", + "source_line": null + }, + { + "name": "Document Session Coordinator Services", + "description": "Set of services (Bookmark, Recents, ParseCoordination, SessionPersistence, ValidationConfiguration, Export, DocumentOpening) that manage document session state and workflows.", + "source_line": null + }, + { + "name": "JSON Parse Tree Exporter", + "description": "Component that builds structured payloads for JSON export of parse trees.", + "source_line": null + }, + { + "name": "SwiftLint Baseline Management", + "description": "Files and workflow updates that handle SwiftLint baseline files to allow legacy violations to be ignored.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8086, + "line_count": 111 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/23_C3_Detail_and_Hex_Inspectors_metrics.json b/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/23_C3_Detail_and_Hex_Inspectors_metrics.json new file mode 100644 index 00000000..0699d326 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/23_C3_Detail_and_Hex_Inspectors_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/23_C3_Detail_and_Hex_Inspectors.md", + "n_spec": 8, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user, I want the detail pane stack to render metadata, validation issues, and hex slices for the selected box so that I can inspect information in a unified view.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting a node produces a metadata detail view populated from ParseTreeSnapshot descriptors, including MP4RA-backed field labels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation issues associated with the node render in a dedicated section with severity badges and copy\u2011to\u2011clipboard support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hex inspector shows a bounded payload window (configurable size) that stays synchronized with selection changes and shares snapshot timestamps for latency diagnostics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail + hex panes update within 200 ms of incoming events during live parsing, matching tree updates.", + "source_line": null + }, + { + "type": "invariant", + "description": "The detail pane stack must preserve separation between presentation (SwiftUI views) and derived state (view models).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse Combine snapshot models from C1/C2 and extend them with convenience accessors for metadata fields and payload slices.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with planned hex slice provider work by defining protocols now and backing with simple file range requests until dedicated caching lands.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Detail Pane Stack", + "description": "Renders metadata, validation issues, and hex slices for the selected box using Combine bridge snapshots.", + "source_line": null + }, + { + "name": "Metadata Detail View", + "description": "Displays node metadata populated from ParseTreeSnapshot descriptors, including MP4RA-backed field labels.", + "source_line": null + }, + { + "name": "Validation Issues Section", + "description": "Shows validation issues with severity badges and copy-to-clipboard support.", + "source_line": null + }, + { + "name": "Hex Inspector Pane", + "description": "Displays a bounded payload window (configurable size) synchronized with selection changes and shares snapshot timestamps for latency diagnostics.", + "source_line": null + }, + { + "name": "Live Parsing Update Mechanism", + "description": "Updates Detail + hex panes within 200 ms of incoming events during live parsing, matching tree updates.", + "source_line": null + }, + { + "name": "Combine Snapshot Models Extension", + "description": "Extends Combine snapshot models with convenience accessors for metadata fields and payload slices.", + "source_line": null + }, + { + "name": "Hex Slice Provider Protocols", + "description": "Defines protocols for providing hex slices via file range requests until dedicated caching is available.", + "source_line": null + }, + { + "name": "Presentation Layer Separation", + "description": "Separates SwiftUI views (presentation) from derived state (view models) to ease snapshot testing and previews.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2490, + "line_count": 58 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/Summary_of_Work_metrics.json new file mode 100644 index 00000000..cea21cc2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/Summary_of_Work.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "SwiftUI Detail Pane", + "description": "Displays metadata, validation issues, and hex sections for a selected ParseTreeSnapshot", + "source_line": null + }, + { + "name": "ParseTreeDetailViewModel", + "description": "Manages detail pane data, provides asynchronous HexSliceProvider support, propagates snapshot timestamps", + "source_line": null + }, + { + "name": "HexSliceProvider", + "description": "Asynchronously supplies hex slices of the parse tree data", + "source_line": null + }, + { + "name": "Selection Synchronization", + "description": "Highlights selected nodes in the tree explorer and syncs selection changes with the detail pane", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 607, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/next_tasks_metrics.json new file mode 100644 index 00000000..5afe5d7c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/23_C3_Detail_and_Hex_Inspectors/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Draft C3 detail and hex inspectors that subscribe to the Combine bridge for payload slices and metadata panes.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 249, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/07_Highlight_Field_Subranges_metrics.json b/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/07_Highlight_Field_Subranges_metrics.json new file mode 100644 index 00000000..7e13a39b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/07_Highlight_Field_Subranges_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/07_Highlight_Field_Subranges.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement synchronized highlighting between parsed field annotations and the hex viewer so that selecting a metadata field focuses the corresponding byte range and vice versa.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail view metadata fields expose selectable annotations describing byte ranges for each structure component.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selecting a metadata field highlights the associated subrange inside the hex viewer and scrolls it into view when needed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Clicking or dragging inside the hex viewer updates the active field selection and annotation state.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit/UI tests cover annotation-to-hex synchronization for at least one representative box (e.g., ftyp, mvhd).", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility (VoiceOver) communicates highlighted ranges when focus changes between metadata and hex views.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a payload annotation provider capable of mapping parsed field descriptors to byte offsets within HexSlice windows.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire annotation updates through ParseTreeDetailViewModel so SwiftUI views remain responsive as slices stream in.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Metadata Field Annotation Selection", + "description": "Allows users to select metadata fields in the detail view that expose byte range annotations for each structure component.", + "source_line": null + }, + { + "name": "Hex Viewer Highlighting Sync", + "description": "Highlights the corresponding subrange inside the hex viewer when a metadata field is selected and scrolls it into view if necessary.", + "source_line": null + }, + { + "name": "Hex Interaction Field Update", + "description": "Updates the active field selection and annotation state when users click or drag within the hex viewer.", + "source_line": null + }, + { + "name": "Annotation Provider Mapping", + "description": "Provides mapping from parsed field descriptors to byte offsets within HexSlice windows for synchronization.", + "source_line": null + }, + { + "name": "ParseTreeDetailViewModel Integration", + "description": "Wires annotation updates through ParseTreeDetailViewModel so SwiftUI views remain responsive as slices stream in.", + "source_line": null + }, + { + "name": "Accessibility VoiceOver Support", + "description": "Communicates highlighted ranges via VoiceOver when focus changes between metadata and hex views.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2410, + "line_count": 50 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1cbe97fd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/Summary_of_Work.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "BoxHeader memberwise initializer exposure", + "description": "Exposes BoxHeader's memberwise initializer to allow SwiftUI previews to compile in ISOInspectorApp.", + "source_line": null + }, + { + "name": "ParseTree preview data coverage", + "description": "Ensures preview sample snapshots build valid headers from outside the Kit module.", + "source_line": null + }, + { + "name": "Random-access payload annotation provider", + "description": "Provides annotations for ftyp and mvhd field ranges, enabling UI highlights with regression coverage.", + "source_line": null + }, + { + "name": "Detail pane refresh", + "description": "Lists selectable annotations and renders a synchronized hex grid with interactive byte selection.", + "source_line": null + }, + { + "name": "ParseTreeDetailViewModel orchestration", + "description": "Orchestrates annotation loading, selection state, and highlighted ranges shared with the hex viewer.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1246, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/next_tasks_metrics.json new file mode 100644 index 00000000..c9852324 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/next_tasks_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/24_C3_Highlight_Field_Subranges/next_tasks.md", + "n_spec": 0, + "n_func": 2, + "intent_atoms": [], + "functional_units": [ + { + "name": "Interactive Payload Annotation", + "description": "Provides interactive annotations for payloads and synchronizes hex highlighting across the UI.", + "source_line": null + }, + { + "name": "Hex Highlighting Synchronization", + "description": "Synchronizes hex highlighting between different views when payload annotations are available.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 239, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/2025-10-09-mp4ra-category-integration_metrics.json b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/2025-10-09-mp4ra-category-integration_metrics.json new file mode 100644 index 00000000..2d6c6055 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/2025-10-09-mp4ra-category-integration_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/25_B4_C2_Category_Filtering/2025-10-09-mp4ra-category-integration.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expose MP4RA category strings through the catalog so streaming parse events can surface human-readable metadata groupings.", + "source_line": null + }, + { + "type": "invariant", + "description": "Addition of category metadata to BoxDescriptor is additive and defaults to nil when absent, ensuring backward compatibility.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxDescriptor Category Metadata", + "description": "Adds an optional 'category' field to BoxDescriptor objects for MP4RA category strings", + "source_line": null + }, + { + "name": "MP4RACatalogRefresher Integration", + "description": "Updates the catalog loader and refresher pipelines to populate the new category property in descriptors", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 966, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/B4_Integrate_MP4RA_Metadata_Catalog_metrics.json b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/B4_Integrate_MP4RA_Metadata_Catalog_metrics.json new file mode 100644 index 00000000..740daa80 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/B4_Integrate_MP4RA_Metadata_Catalog_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/25_B4_C2_Category_Filtering/B4_Integrate_MP4RA_Metadata_Catalog.md", + "n_spec": 4, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Bundle the official MP4 Registration Authority (MP4RA) box metadata into the parser so box names, categories, and fallback descriptions are available during streaming parse operations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "MP4RA catalog JSON is bundled with the Swift package and can be loaded without network access.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser emits box events annotated with human-readable names and categories when entries exist.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unknown or missing entries log structured fallback records compatible with the existing research log (per VR-006 note in workplan).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RA Catalog Bundle", + "description": "Include the MP4 Registration Authority metadata catalog as a bundled JSON asset within the Swift package for offline access", + "source_line": null + }, + { + "name": "Runtime Catalog Loader", + "description": "Load and parse the bundled MP4RA JSON at application start without network calls", + "source_line": null + }, + { + "name": "Box Metadata Registry Service", + "description": "Provide a lightweight registry that maps fourcc box types to human\u2011readable names, categories, and summaries during streaming parsing", + "source_line": null + }, + { + "name": "Event Annotation Middleware", + "description": "Annotate parser box events with cataloged name, category, and summary when available", + "source_line": null + }, + { + "name": "Unknown Box Fallback Logger", + "description": "Log structured fallback records for boxes not found in the catalog, compatible with existing research log format", + "source_line": null + }, + { + "name": "Unit Test Suite for Catalog Operations", + "description": "Tests covering catalog loading, lookup hits, and unknown\u2011box fallback paths", + "source_line": null + }, + { + "name": "Dependency Injection Point for Catalog Updates", + "description": "Allow runtime configuration or injection to update the catalog without code changes (e.g., versioned JSON asset)", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3013, + "line_count": 59 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/C2_Tree_View_Virtualization_metrics.json b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/C2_Tree_View_Virtualization_metrics.json new file mode 100644 index 00000000..44f373dc --- /dev/null +++ b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/C2_Tree_View_Virtualization_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/25_B4_C2_Category_Filtering/C2_Tree_View_Virtualization.md", + "n_spec": 9, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Render a SwiftUI outline explorer that displays streaming ParseTreeStore snapshots with virtualization to keep scrolling smooth for MP4 structures exceeding 10k nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The tree view must render streaming ParseTreeStore snapshots with virtualization, ensuring scrolling remains smooth for structures over 10k nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Search input should narrow visible nodes instantly, honoring severity and category filters as described in archived spikes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Filter controls must display MP4RA category groupings and streaming metadata toggles without breaking existing severity filtering.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI tests or previews must verify that latency stays below the 200\u202fms streaming target during live updates.", + "source_line": null + }, + { + "type": "invariant", + "description": "The Combine-backed ParseTreeStore bridge from task 18 must be reused to feed SwiftUI state while minimizing main-thread work per update.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Apply virtualization strategies proven in archived spikes (batching, lazy stacks) and replace preview-only data with real parser events.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wire MP4RA-derived category metadata into filter chips, ensuring catalog lookups remain lightweight for streaming workloads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add instrumentation hooks (signposts or metrics) to allow future performance regression tests to assert <200\u202fms UI latency during large file inspection.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStore Bridge", + "description": "Provides streaming parse snapshots to SwiftUI state via Combine", + "source_line": null + }, + { + "name": "Virtualized Tree View Rendering", + "description": "Renders large parse trees (10k+ nodes) using virtualization techniques such as batching and lazy stacks for smooth scrolling", + "source_line": null + }, + { + "name": "Search Input with Instant Feedback", + "description": "Filters visible tree nodes in real time based on user search query while respecting severity/category filters", + "source_line": null + }, + { + "name": "Category Filter Chips", + "description": "UI controls that display MP4RA category groupings and allow users to toggle visibility of nodes by category", + "source_line": null + }, + { + "name": "Streaming Indicator Switch", + "description": "Toggle to show or hide nodes that are marked as streaming metadata", + "source_line": null + }, + { + "name": "Severity Filter Controls", + "description": "Existing filter UI for node severity levels, integrated with new category filters", + "source_line": null + }, + { + "name": "Instrumentation Hooks", + "description": "Signposts/metrics for measuring UI latency to ensure <200\u202fms during large file inspection", + "source_line": null + }, + { + "name": "Unit Tests for ViewModel", + "description": "Tests verifying that ParseTreeOutlineViewModel correctly surfaces category inventory and streaming presence from snapshots", + "source_line": null + }, + { + "name": "UI Tests / Previews for Latency", + "description": "Automated tests or SwiftUI previews that confirm scrolling and search latency stays below 200\u202fms", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4067, + "line_count": 74 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/Summary_of_Work_metrics.json new file mode 100644 index 00000000..cf8f4b2f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/25_B4_C2_Category_Filtering/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/25_B4_C2_Category_Filtering/Summary_of_Work.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate MP4RA Metadata Catalog to expose categories for streaming events", + "source_line": null + }, + { + "type": "user_story", + "description": "Preserve category values during catalog regeneration so future snapshots retain enriched fields without manual edits", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Minimal validator and regression tests must cover new metadata shape and keep workspace green", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement Tree View Virtualization & Search with category chips and streaming toggle for multi-facet filtering while maintaining lazy rendering", + "source_line": null + }, + { + "type": "invariant", + "description": "ParseTreeOutlineViewModel must track available MP4RA categories and streaming indicator presence to keep UI filters scoped to active snapshot", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RA Metadata Catalog Exposure", + "description": "Exposes MP4RA categories from bundled metadata via BoxDescriptor for streaming events to surface friendly groupings.", + "source_line": null + }, + { + "name": "MP4RACatalog Refresher", + "description": "Preserves category values when regenerating the catalog so future snapshots keep enriched fields without manual edits.", + "source_line": null + }, + { + "name": "Tree View Virtualization and Search", + "description": "Tracks MP4RA categories and streaming indicator presence in ParseTreeOutlineViewModel, enabling UI filters scoped to active snapshot while preserving virtualization.", + "source_line": null + }, + { + "name": "SwiftUI Outline Explorer Rendering", + "description": "Renders category chips and a streaming toggle beside severity controls for multi-facet filtering with lazy rendering.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1740, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/B4_Integrate_MP4RA_Metadata_Catalog_metrics.json b/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/B4_Integrate_MP4RA_Metadata_Catalog_metrics.json new file mode 100644 index 00000000..114dbd3a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/B4_Integrate_MP4RA_Metadata_Catalog_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/B4_Integrate_MP4RA_Metadata_Catalog.md", + "n_spec": 10, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Bundle MP4RA metadata catalog into parser so streaming events include human-readable names, categories, and structured fallbacks for unknown boxes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "MP4RA catalog JSON ships inside Swift package and loads without network access, covering known box types.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming parse events annotate boxes with names/categories when catalog entries exist and emit structured fallback data for unknown entries compatible with research log pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover catalog loading, lookup hits, fallback paths, and ensure streaming performance characteristics remain unaffected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation notes how to refresh the catalog and where fallback records appear for follow-up triage.", + "source_line": null + }, + { + "type": "invariant", + "description": "Catalog must be bundled inside Swift package and load without network access.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Normalize MP4RA dataset into lightweight JSON resource refreshed via script and bundled for use across CLI, UI, and app targets.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide lightweight BoxCatalog service for streaming lookups so metadata resolution remains constant time and allocations per box stay minimal.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing research log/fallback infrastructure (e.g., VR-006 logging) so unknown boxes are captured consistently for tooling consumers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose catalog metadata (names, categories, descriptions) through public API to unblock downstream filters and detail panes once UI tasks begin.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MP4RA Catalog Bundle", + "description": "Include the MP4 Registration Authority metadata catalog as a bundled JSON resource within the Swift package for offline access.", + "source_line": null + }, + { + "name": "Catalog Loading Service", + "description": "Provide functionality to load and parse the bundled MP4RA JSON catalog at runtime.", + "source_line": null + }, + { + "name": "BoxCatalog Lookup API", + "description": "Expose a lightweight service that performs constant\u2011time lookups of box type identifiers to retrieve name, category, and description metadata.", + "source_line": null + }, + { + "name": "Streaming Event Annotation", + "description": "Annotate streaming parse events with human\u2011readable names and categories when catalog entries exist.", + "source_line": null + }, + { + "name": "Unknown Box Fallback Handling", + "description": "Emit structured fallback data for unknown box types compatible with the research log pipeline.", + "source_line": null + }, + { + "name": "Research Log Integration", + "description": "Integrate with existing logging infrastructure to capture unknown boxes consistently for tooling consumers.", + "source_line": null + }, + { + "name": "Public API Exposure", + "description": "Expose catalog metadata (names, categories, descriptions) through a public API for downstream filters and detail panes.", + "source_line": null + }, + { + "name": "Unit Test Suite", + "description": "Provide unit tests covering catalog loading, lookup hits, fallback paths, and performance characteristics.", + "source_line": null + }, + { + "name": "Documentation Updates", + "description": "Document how to refresh the catalog and where fallback records appear for follow\u2011up triage in DocC/Markdown.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2582, + "line_count": 61 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/F1_Develop_Automated_Test_Fixtures_metrics.json b/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/F1_Develop_Automated_Test_Fixtures_metrics.json new file mode 100644 index 00000000..29e64381 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/F1_Develop_Automated_Test_Fixtures_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/F1_Develop_Automated_Test_Fixtures.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build a comprehensive automated fixture corpus that exercises nominal and malformed MP4/QuickTime structures for regression testing of validation and export behaviors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fixture set includes baseline MP4, MOV, fragmented fMP4, DASH segments, oversized mdat, and deliberately malformed files with clear metadata describing scenarios and expected validation outcomes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated scripts generate or ingest fixtures reproducibly and place them in version-controlled locations consumable by Swift tests and CLI smoke runs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests reference the new fixtures to cover box parsing, validation rules, and JSON export flows without manual setup.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation explains how to refresh or extend the fixture library and how each sample maps to validation coverage gaps.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use lightweight Python or Swift utilities to synthesize malformed headers, truncated payloads, and large-data placeholders while keeping repository size manageable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Store fixtures with sidecar JSON/YAML metadata (description, provenance, expected warnings) to aid automated assertions and research-log integrations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate fixture loading helpers into existing test targets so future rules or UI flows can reuse the corpus without duplicating IO setup.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider CI storage constraints; compress or programmatically generate large artifacts on demand when full binaries would bloat the repository.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Automated Fixture Corpus Generation", + "description": "Scripts that generate or ingest MP4/QuickTime test fixtures, including malformed and edge\u2011case files, and store them in version control.", + "source_line": null + }, + { + "name": "Fixture Metadata Management", + "description": "Sidecar JSON/YAML files describing each fixture\u2019s purpose, provenance, expected warnings, and validation coverage.", + "source_line": null + }, + { + "name": "Test Target Integration", + "description": "Helpers that load fixtures into Swift tests or CLI smoke runs, enabling reuse across unit tests and UI flows.", + "source_line": null + }, + { + "name": "Regression Test Reference", + "description": "Automated regression tests that use the fixture set to validate box parsing, rule enforcement, and JSON export behavior.", + "source_line": null + }, + { + "name": "Documentation for Fixture Library", + "description": "Guidance on refreshing, extending, and mapping fixtures to validation gaps.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2380, + "line_count": 57 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/Summary_of_Work_metrics.json new file mode 100644 index 00000000..005f01bd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/26_F1_Fixtures_and_B4_MP4RA/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide an automated fixture catalog for task F1 that includes bundled metadata and a baseline QuickTime sample for ISOInspectorKit tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FixtureCatalog unit tests must confirm that fixture metadata is decoded correctly and resources are accessible, ensuring regression coverage.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The fixture catalog is bootstrapped as an automated component integrated with the test suite.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expand the fixture catalog to include fragmented, DASH, and malformed assets along with validation expectations.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 487, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/27_F1_Expand_Fixture_Catalog_metrics.json b/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/27_F1_Expand_Fixture_Catalog_metrics.json new file mode 100644 index 00000000..938b70f3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/27_F1_Expand_Fixture_Catalog_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/27_F1_Expand_Fixture_Catalog.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create an expanded automated fixture corpus covering fragmented MP4, DASH segment pairs, large mdat edge cases, and deliberately malformed files so validation rules and streaming parsers have representative samples with documented expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Fixture directory gains representative samples for baseline MP4/MOV, fragmented MP4 (moof/traf), DASH init + media segments, large mdat, and intentionally malformed headers or hierarchies.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each fixture is accompanied by metadata describing provenance, scenario focus, and expected validation outcomes (pass/fail rules, warnings).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests reference the new fixtures to assert parser behavior and validation diagnostics without manual setup.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Repository documentation (fixture catalog README or inline comments) is updated so future tasks can regenerate or extend assets consistently.", + "source_line": null + }, + { + "type": "invariant", + "description": "Generated malformed or fragmented files must be deterministic and small enough for version control; generation scripts or commands are captured alongside fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing fixture harness in Tests/ISOInspectorKitTests/Fixtures as the staging area; extend helper types in FixtureCatalog.swift to describe new assets and expectations.", + "source_line": null + }, + { + "type": "invariant", + "description": "Large mdat coverage uses sparse data or truncated payloads to keep repository size manageable while still exercising streaming behaviors.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fixture Catalog Expansion", + "description": "Add new MP4/MOV fixture files covering fragmented, DASH, large mdat, and malformed cases to the repository.", + "source_line": null + }, + { + "name": "Metadata Attachment for Fixtures", + "description": "Attach provenance, scenario focus, and expected validation outcomes metadata to each fixture.", + "source_line": null + }, + { + "name": "Automated Test Integration", + "description": "Reference new fixtures in automated tests to assert parser behavior and diagnostics.", + "source_line": null + }, + { + "name": "Documentation Update", + "description": "Update README or inline comments to document fixture catalog and generation process.", + "source_line": null + }, + { + "name": "Fixture Generation Scripts", + "description": "Provide deterministic Python/Swift scripts for creating fragmented, DASH, large mdat, and malformed files.", + "source_line": null + }, + { + "name": "Validation Expectation Coordination", + "description": "Align expected validation outcomes with existing VR-001\u2013VR-006 rules and add TODO hooks for new rules.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2787, + "line_count": 48 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e7d9c9c2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The fixture catalog must always contain entries that expose the correct box layout, payload sizing, and documented warnings/errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All binary assets in the fixture corpus can be deterministically regenerated using generate_fixtures.py.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests (FixtureCatalogExpandedCoverageTests) must pass for all catalog entries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "A deterministic generation script is used to rebuild all binary assets.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fixture Corpus Expansion", + "description": "Adds new MP4/DASH segment fixtures including fragmented files, large mdat boxes, and malformed samples to the test suite.", + "source_line": null + }, + { + "name": "Deterministic Fixture Generation Script", + "description": "Provides a script to rebuild all binary fixture assets deterministically for reproducibility.", + "source_line": null + }, + { + "name": "Extended Fixture Catalog Metadata", + "description": "Enhances catalog entries with detailed metadata, documentation, and expected validation outcomes for each fixture.", + "source_line": null + }, + { + "name": "Regression Tests for Fixture Catalog", + "description": "Runs tests that verify catalog entries expose correct box layout, payload sizing, and documented warnings/errors.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1061, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/next_tasks_metrics.json new file mode 100644 index 00000000..4911c3db --- /dev/null +++ b/DOCS/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/27_F1_Expand_Fixture_Catalog/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 41, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/28_B6_JSON_and_Binary_Export_Modules_metrics.json b/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/28_B6_JSON_and_Binary_Export_Modules_metrics.json new file mode 100644 index 00000000..13217c6e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/28_B6_JSON_and_Binary_Export_Modules_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/28_B6_JSON_and_Binary_Export_Modules.md", + "n_spec": 12, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a public API in ISOInspectorKit that produces a deterministic JSON document containing each box\u2019s fourcc, offsets, sizes, metadata, validation issues, and children.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement a binary capture writer/reader pair that records the same event stream for lossless re-import without depending on JSON parsing performance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The exported JSON document must be deterministic and include each box\u2019s fourcc, offsets, sizes, metadata, validation issues, and children.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The binary capture writer/reader pair must allow lossless round\u2011trip of the event stream back into the tool.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests export representative fixture parses and reload them to verify structural parity with live pipeline results.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI can invoke the exporters in smoke tests without regressions, preparing the path for D3 export-json/export-report commands.", + "source_line": null + }, + { + "type": "invariant", + "description": "The JSON output must always be deterministic across runs given the same input parse tree.", + "source_line": null + }, + { + "type": "invariant", + "description": "Binary capture format must preserve all ParseEvent data required for re\u2011import.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse ParseTreeStore.Builder or a dedicated reducer to accumulate ParseEvent streams into a tree/snapshot model reusable by exporters.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define Codable models that mirror ParseTreeNode and BoxDescriptor so exported JSON preserves catalog metadata and validation issues.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Store binary captures using a compact container (length\u2011prefixed ParseEvent records encoded with JSONEncoder or BinaryEncoder) and document the format for later tooling.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose convenience helpers so the CLI can request export output using an existing ParsePipeline without duplicating parsing logic.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Public API for deterministic JSON export", + "description": "Produces a JSON document containing each MP4 box\u2019s fourcc, offsets, sizes, metadata, validation issues, and children.", + "source_line": null + }, + { + "name": "Binary capture writer/reader pair", + "description": "Records the same event stream in a compact binary format for lossless re-import without relying on JSON parsing performance.", + "source_line": null + }, + { + "name": "CLI export command integration", + "description": "Allows the CLI to invoke exporters (e.g., export-json, export-report) during smoke tests and future commands.", + "source_line": null + }, + { + "name": "ParseEvent stream reducer", + "description": "Accumulates ParseEvent streams into a tree/snapshot model reusable by exporters.", + "source_line": null + }, + { + "name": "Codable models for export", + "description": "Defines Codable structures mirroring ParseTreeNode and BoxDescriptor to preserve catalog metadata and validation issues in JSON.", + "source_line": null + }, + { + "name": "Regression test suite for exports", + "description": "Exports representative fixture parses, then reloads them to verify structural parity with live pipeline results.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2724, + "line_count": 50 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/Summary_of_Work_metrics.json new file mode 100644 index 00000000..97ee9740 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/Summary_of_Work.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "ParseTreeBuilder", + "description": "Builds reusable parse trees from streaming ParseEvent values", + "source_line": null + }, + { + "name": "ParseTreeNode", + "description": "Represents a node within a parse tree structure", + "source_line": null + }, + { + "name": "ParseTree", + "description": "Encapsulates the entire parse tree for export operations", + "source_line": null + }, + { + "name": "JSONParseTreeExporter", + "description": "Exports parse trees to JSON format using ISOInspectorKit", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1046, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/next_tasks_metrics.json new file mode 100644 index 00000000..ff7226bf --- /dev/null +++ b/DOCS/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/28_B6_JSON_and_Binary_Export_Modules/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 94, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/29_D3_CLI_Export_Commands_metrics.json b/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/29_D3_CLI_Export_Commands_metrics.json new file mode 100644 index 00000000..295e7038 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/29_D3_CLI_Export_Commands_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/29_D3_CLI_Export_Commands/29_D3_CLI_Export_Commands.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a CLI command `isoinspector export-json --output ` that streams a parse tree into the JSON exporter and writes a deterministic document matching the schema used in kit round-trip tests.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide a CLI command `isoinspector export-capture --output ` that persists a binary capture compatible with the kit reader, reports the output path, and respects existing logging conventions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The export-json command must produce a deterministic JSON document matching the schema used in kit round-trip tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The export-capture command must produce a binary capture compatible with the kit reader and report the output path.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Both commands must respect existing logging conventions (research log notices, validation summaries) and return non-zero exit codes on I/O or encoding failures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI help (`--help`) must list the new subcommands with brief usage examples, keeping inspect behavior unchanged.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Add focused tests that invoke each command against fixture media, asserting file creation and re-import using ISOInspectorKit APIs.", + "source_line": null + }, + { + "type": "invariant", + "description": "The destination path for export commands must be writable before starting export work.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse ParseTreeBuilder to collect streaming events before handing them to JSONParseTreeExporter and the capture encoder, sharing pipeline/environment wiring with existing inspect command paths.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Encapsulate export logic in reusable helpers that accept an array of files for future batch mode alignment.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "export-json command", + "description": "CLI subcommand that streams a parse tree from an input file into the JSON exporter and writes a deterministic JSON document to a specified or default output path.", + "source_line": null + }, + { + "name": "export-capture command", + "description": "CLI subcommand that streams a parse tree from an input file into the binary capture encoder and writes a binary capture file compatible with the kit reader to a specified or default output path, reporting the output location.", + "source_line": null + }, + { + "name": "ParseTreeBuilder integration for export", + "description": "Reuses the ParseTreeBuilder pipeline to collect streaming events before handing them to the JSON exporter or capture encoder, ensuring consistent parsing across commands.", + "source_line": null + }, + { + "name": "Output path validation and defaults", + "description": "Validates that the destination path is writable and provides default output filenames based on the input name with .isoinspector.json or .capture extensions.", + "source_line": null + }, + { + "name": "Logging and error handling for export commands", + "description": "Respects existing logging conventions, surfaces validation issues or exporter errors through printError, and returns non-zero exit codes on I/O or encoding failures.", + "source_line": null + }, + { + "name": "CLI help integration", + "description": "Adds brief usage examples to the CLI help output for the new subcommands while keeping inspect behavior unchanged.", + "source_line": null + }, + { + "name": "Reusable export helpers for batch mode", + "description": "Encapsulates export logic in reusable helpers that accept an array of files, enabling future batch processing alignment.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3178, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/Summary_of_Work_metrics.json new file mode 100644 index 00000000..38ded7d4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/29_D3_CLI_Export_Commands/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide CLI commands to export parse trees as JSON or binary capture files via ISOInspectorCLI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The CLI must support subcommands `export-json` and `export-capture` with deterministic exporters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Output validation and streaming integration must correctly feed ParseTreeBuilder, JSONParseTreeExporter, and ParseEventCaptureEncoder.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Help output, default destination derivation, exporter round-tripping, and capture decoding are covered by tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "Export commands must surface failures via stderr and maintain consistent success/error messaging.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "CLI argument parsing, output validation, streaming integration, and test coverage were added to support the new export functionality.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "export-json CLI subcommand", + "description": "Exports parse trees to deterministic JSON files via ISOInspectorCLI", + "source_line": null + }, + { + "name": "export-capture CLI subcommand", + "description": "Captures and exports parse events in binary format via ISOInspectorCLI", + "source_line": null + }, + { + "name": "ParseTreeBuilder integration", + "description": "Builds parse trees from streamed input for export commands", + "source_line": null + }, + { + "name": "JSONParseTreeExporter component", + "description": "Converts parse trees into JSON output", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 995, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/next_tasks_metrics.json new file mode 100644 index 00000000..b38b212a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/29_D3_CLI_Export_Commands/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/29_D3_CLI_Export_Commands/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 105, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/Summary_of_Work_metrics.json new file mode 100644 index 00000000..6b432e1c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/Summary_of_Work_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/Summary_of_Work.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement CLI export commands for exporting parse events to JSON and capture formats", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI export-json command produces JSON output that matches original input (JSON parity)", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 888, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/next_tasks_metrics.json new file mode 100644 index 00000000..6e81dbc5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/30_Summary_of_Work_2025-10-10/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 79, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/31_A3_DocC_Catalog_Setup_metrics.json b/DOCS/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/31_A3_DocC_Catalog_Setup_metrics.json new file mode 100644 index 00000000..e1a3282c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/31_A3_DocC_Catalog_Setup_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/31_A3_DocC_Catalog_Setup.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish DocC catalogs and an automated publishing path so the ISOInspector modules ship with browsable developer documentation from the outset.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Create DocC catalogs (e.g., `ISOInspectorKit.docc`, `ISOInspectorApp.docc`) added to the SwiftPM package so that `swift package generate-documentation` succeeds without warnings.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Configure build scripts or CI steps to produce DocC archives (`.doccarchive`) and publishable HTML artifacts accessible to the team.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provide README/DocC landing page entries that cross-link to core modules and reference guides, ensuring developer onboarding material has a single entry point.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document the command(s) needed to regenerate the docs locally (`xcodebuild docbuild` or SwiftPM equivalents) and ensure they run successfully on current fixtures.", + "source_line": null + }, + { + "type": "invariant", + "description": "DocC generation must be integrated into the existing CI pipeline (or a manual script) while respecting repository constraints (no external hosting yet).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing package structure to register DocC resources for both CLI/App targets; ensure conditional compilation flags match platform availability.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Seed initial DocC articles with architecture overviews and module indices drawn from the master PRD and execution guide so later tasks can expand API details.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validate the generated documentation for broken links/anchors and add guidance for extending DocC coverage as new modules appear.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DocC Catalog Creation", + "description": "Create DocC catalogs such as ISOInspectorKit.docc and ISOInspectorApp.docc within the SwiftPM package so that swift package generate-documentation runs without warnings.", + "source_line": null + }, + { + "name": "CI Build Script for DocC Archives", + "description": "Configure build scripts or CI steps to produce .doccarchive files and publishable HTML artifacts accessible to the team.", + "source_line": null + }, + { + "name": "Cross\u2011Linked README/DocC Landing Page", + "description": "Provide a README or DocC landing page that cross\u2011links to core modules and reference guides, serving as a single entry point for developer onboarding.", + "source_line": null + }, + { + "name": "Local Regeneration Documentation", + "description": "Document the command(s) needed to regenerate docs locally (e.g., xcodebuild docbuild or SwiftPM equivalents) and ensure they run successfully on current fixtures.", + "source_line": null + }, + { + "name": "Conditional Compilation Registration", + "description": "Register DocC resources for both CLI/App targets using conditional compilation flags that match platform availability.", + "source_line": null + }, + { + "name": "DocC Generation Integration", + "description": "Integrate DocC generation into the existing CI pipeline (or create a manual script) while respecting repository constraints.", + "source_line": null + }, + { + "name": "Initial DocC Article Seeding", + "description": "Seed initial DocC articles with architecture overviews and module indices drawn from the master PRD and execution guide.", + "source_line": null + }, + { + "name": "Documentation Validation & Guidance", + "description": "Validate generated documentation for broken links/anchors and provide guidance for extending DocC coverage as new modules appear.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2638, + "line_count": 58 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1cd0b612 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/Summary_of_Work_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/31_A3_DocC_Catalog_Setup/Summary_of_Work.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish DocC catalogs for ISOInspectorKit, ISOInspectorCLI, and ISOInspectorApp with architecture and workflow articles seeded for future expansion.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add DocC generation test coverage to enforce catalog presence and ensure the documentation build script remains executable.", + "source_line": null + }, + { + "type": "user_story", + "description": "Introduce scripts/generate_documentation.sh and wire the Swift-DocC plugin dependency so swift package generate-documentation produces static-hostable archives for every target.", + "source_line": null + }, + { + "type": "user_story", + "description": "Update repository documentation (README, execution workplan) with DocC workflow details and ensure generated artifacts are ignored under Documentation/DocC.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "swift test passes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "./scripts/generate_documentation.sh Documentation/DocC runs successfully.", + "source_line": null + }, + { + "type": "invariant", + "description": "Generated DocC bundles are ignored under Documentation/DocC directory.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Swift-DocC plugin dependency to generate static-hostable archives for every target.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Run DocC publishing in CI via the docc-archives GitHub Actions job, generating and uploading bundles on every pipeline execution.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DocC Catalogs for ISOInspectorKit", + "description": "Provides documentation catalogs containing architecture and workflow articles for the ISOInspectorKit target.", + "source_line": null + }, + { + "name": "DocC Catalogs for ISOInspectorCLI", + "description": "Provides documentation catalogs containing architecture and workflow articles for the ISOInspectorCLI target.", + "source_line": null + }, + { + "name": "DocC Catalogs for ISOInspectorApp", + "description": "Provides documentation catalogs containing architecture and workflow articles for the ISOInspectorApp target.", + "source_line": null + }, + { + "name": "DocC Generation Test Coverage", + "description": "Enforces presence of DocC catalogs and ensures the documentation build script remains executable through automated tests.", + "source_line": null + }, + { + "name": "generate_documentation.sh Script", + "description": "Shell script that runs swift package generate-documentation to produce static-hostable archives for every target.", + "source_line": null + }, + { + "name": "Swift-DocC Plugin Dependency Integration", + "description": "Integrates Swift-DocC plugin so that swift package generate-documentation generates documentation bundles.", + "source_line": null + }, + { + "name": "CI DocC Publishing Job", + "description": "GitHub Actions job that runs docc-archives to generate and upload DocC bundles on each pipeline execution.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1112, + "line_count": 34 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/2025-10-10-annotation-bookmark-store_metrics.json b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/2025-10-10-annotation-bookmark-store_metrics.json new file mode 100644 index 00000000..15246d08 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/2025-10-10-annotation-bookmark-store_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/2025-10-10-annotation-bookmark-store.md", + "n_spec": 2, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Persist user-authored annotations and bookmarks between runs using a lightweight JSON store", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must maintain data integrity when storing annotations and bookmarks in JSON format", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FileBackedAnnotationBookmarkStore", + "description": "Persists user-authored annotations and bookmarks between runs using a lightweight JSON store.", + "source_line": null + }, + { + "name": "AnnotationRecord", + "description": "Represents an individual annotation record stored by the system.", + "source_line": null + }, + { + "name": "BookmarkRecord", + "description": "Represents an individual bookmark record stored by the system.", + "source_line": null + }, + { + "name": "AnnotationBookmarkSession", + "description": "Manages a session of annotations and bookmarks, coordinating between records and storage.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 939, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/C4_Annotation_and_Bookmark_Management_metrics.json b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/C4_Annotation_and_Bookmark_Management_metrics.json new file mode 100644 index 00000000..d814d22c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/C4_Annotation_and_Bookmark_Management_metrics.json @@ -0,0 +1,118 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/C4_Annotation_and_Bookmark_Management.md", + "n_spec": 10, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Investigator can flag boxes, jot notes, and reopen sessions with context intact using persistent annotations and bookmarks in the SwiftUI app.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Users can create, edit, and delete annotations tied to specific parse tree nodes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bookmarks surface within the tree UI and survive app relaunches for at least one fixture.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Persistence layer passes unit tests covering serialization, migrations, and concurrency safety.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail and hex panes remain synchronized with annotation/bookmark selections without regressions in existing tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "Session bookmarking and annotations must be stored per file across launches.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Choose between CoreData vs. JSON persistence mechanics (research gap R6).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define a persistence schema likely CoreData-backed with JSON export interop aligned with research outcome.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose bookmark state through SwiftUI state stores for filters/search highlighting or scoping to bookmarked boxes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with forthcoming E3 session persistence to ensure storage APIs compose cleanly.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Annotation Creation", + "description": "Allows users to create annotations tied to specific parse tree nodes", + "source_line": null + }, + { + "name": "Annotation Editing", + "description": "Enables users to edit existing annotations", + "source_line": null + }, + { + "name": "Annotation Deletion", + "description": "Permits users to delete annotations", + "source_line": null + }, + { + "name": "Bookmark Creation", + "description": "Lets users bookmark boxes within the parse tree", + "source_line": null + }, + { + "name": "Bookmark Persistence", + "description": "Stores bookmarks across app launches per file", + "source_line": null + }, + { + "name": "Tree UI Bookmark Display", + "description": "Shows bookmarks within the tree user interface", + "source_line": null + }, + { + "name": "Persistence Layer Serialization", + "description": "Handles serialization of annotations and bookmarks for storage", + "source_line": null + }, + { + "name": "Persistence Layer Migration Support", + "description": "Supports data migrations in the persistence layer", + "source_line": null + }, + { + "name": "Concurrency Safety", + "description": "Ensures thread\u2011safe access to the persistence layer", + "source_line": null + }, + { + "name": "Detail Pane Synchronization", + "description": "Keeps the detail pane in sync with annotation/bookmark selections", + "source_line": null + }, + { + "name": "Hex Pane Synchronization", + "description": "Keeps the hex pane in sync with annotation/bookmark\u00a0synchronization", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2282, + "line_count": 43 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d8462415 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/Summary_of_Work.md", + "n_spec": 6, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "The annotation and bookmark data must be persisted reliably across instances of the FileBackedAnnotationBookmarkStore.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a user, I want annotations and bookmarks to be stored in a file-backed JSON store so that they persist between app launches.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Given the FileBackedAnnotationBookmarkStore is initialized, when an annotation or bookmark is created/updated/deleted, then the changes are written to the JSON file and subsequent instances read the same data.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a JSON-backed FileBackedAnnotationBookmarkStore for persistence instead of CoreData until the research gap R6 lands.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want the store to be migrated to CoreData once the research gap is resolved so that we can use the final storage layer.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Once the core data migration plan is defined and applied, the store should read/write data using CoreData and integrate with SwiftUI view models.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "File-backed Annotation Bookmark Store", + "description": "Provides persistence for annotations and bookmarks using a JSON file store, supporting create, update, delete, and bookmark flows.", + "source_line": null + }, + { + "name": "Annotation Bookmark Persistence Tests", + "description": "Unit tests that verify the correctness of annotation and bookmark creation, updating, deletion, and persistence across multiple store instances.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 880, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/next_tasks_metrics.json new file mode 100644 index 00000000..51aea56a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/32_C4_Annotation_Bookmark_Store/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expand CLI and App DocC catalogs with end-to-end tutorials and screenshots once the UI and command surfaces gain additional features.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Layer DocC publishing into CI (e.g., GitHub Actions artifact upload) after validating storage and hosting requirements.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI and App DocC Catalogs", + "description": "Provide end-to-end tutorials and screenshots for the CLI and App DocC catalogs once UI and command surfaces gain additional features.", + "source_line": null + }, + { + "name": "DocC Publishing Layer in CI", + "description": "Publish DocC bundles into continuous integration pipelines, such as GitHub Actions, by uploading artifacts after validating storage and hosting requirements.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 411, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/2025-10-10-coredata-annotation-bookmark-store_metrics.json b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/2025-10-10-coredata-annotation-bookmark-store_metrics.json new file mode 100644 index 00000000..3182dafd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/2025-10-10-coredata-annotation-bookmark-store_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/2025-10-10-coredata-annotation-bookmark-store.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Persist annotation and bookmark notes across app sessions using CoreData instead of the previous JSON-based storage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The CoreDataAnnotationBookmarkStore must replace the JSON spike and store records in SQLite, ensuring data persists between launches.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "On platforms without CoreData support, attempting to use the store should throw a .featureUnsupported error.", + "source_line": null + }, + { + "type": "invariant", + "description": "Records must always be stored in SQLite when using CoreDataAnnotationBookmarkStore.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The JSON-based annotation/bookmark storage spike is removed and replaced with the CoreData schema defined in R6.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CoreDataAnnotationBookmarkStore", + "description": "A CoreData-backed store that persists annotation and bookmark data across app sessions", + "source_line": null + }, + { + "name": "AnnotationBookmarkStoreTests", + "description": "Unit tests for the CoreDataAnnotationBookmarkStore ensuring correct persistence behavior", + "source_line": null + }, + { + "name": "Persistence documentation in DocC & manual notes", + "description": "Documentation describing how the new CoreData schema is used for persistence", + "source_line": null + }, + { + "name": "Fallback mechanism for unsupported platforms", + "description": "Throws .featureUnsupported when CoreData is unavailable, maintaining backward compatibility", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1014, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/C4_CoreData_Annotation_Persistence_metrics.json b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/C4_CoreData_Annotation_Persistence_metrics.json new file mode 100644 index 00000000..38dfa6da --- /dev/null +++ b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/C4_CoreData_Annotation_Persistence_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/C4_CoreData_Annotation_Persistence.md", + "n_spec": 8, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Persist user annotations and bookmarks across app sessions using CoreData so that ISOInspectorUI and ISOInspectorApp can maintain notes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CoreData model must include entities for annotations, bookmarks, and file metadata with schema migration guidance replacing the prior JSON spike.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The new store must integrate with existing SwiftUI view models so that create/update/delete flows and bookmark toggles update UI state immediately.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests must cover persistence round-trips, conflict handling, and integration with the random-access payload annotation provider.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Persisted data must survive app relaunch and remain compatible with planned session persistence work (E3) without regressions in existing tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "CoreData stack initialization must work in both macOS/iOS app contexts and SwiftUI previews/tests, ensuring required container configuration is documented.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a private-queue CoreData stack with programmatic model definitions for files, annotations, and bookmarks instead of JSON storage.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Design fetch/update APIs that align with the current in-memory store protocol to minimize UI consumer changes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CoreData Model Definition", + "description": "Defines entities for annotations, bookmarks, and file metadata with schema migration guidance", + "source_line": null + }, + { + "name": "CoreData Store Initialization", + "description": "Initializes a private\u2011queue CoreData stack usable on macOS/iOS and SwiftUI previews/tests", + "source_line": null + }, + { + "name": "Fetch API for Annotations", + "description": "Retrieves annotations for a given file from the persistent store", + "source_line": null + }, + { + "name": "Update API for Annotations", + "description": "Creates or updates annotation records in CoreData, reflecting changes immediately to UI", + "source_line": null + }, + { + "name": "Delete API for Annotations", + "description": "Removes annotation records from the store and updates UI state", + "source_line": null + }, + { + "name": "Bookmark Toggle API", + "description": "Adds or removes bookmarks for a file, persisting the change and updating UI instantly", + "source_line": null + }, + { + "name": "Multi\u2011File Separation Logic", + "description": "Ensures annotations/bookmarks are isolated per file in persistence layer", + "source_line": null + }, + { + "name": "Conflict Handling Mechanism", + "description": "Detects and resolves missing record conflicts during round\u2011trip tests", + "source_line": null + }, + { + "name": "Unit Test Suite", + "description": "Tests persistence round\u2011trips, conflict handling, and integration with random\u2011access payload provider", + "source_line": null + }, + { + "name": "DocC Documentation Update", + "description": "Describes annotation workflows and storage path in developer docs", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3130, + "line_count": 73 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b08c91f0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Users can add, edit, delete notes and toggle bookmarks in SwiftUI outline/detail views with live updates.", + "source_line": null + }, + { + "type": "invariant", + "description": "CoreData-backed store must persist files, annotations, and bookmarks correctly across create/update/delete operations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All persistence tests (AnnotationBookmarkStoreTests) for create, update, delete, bookmark flows pass, including conflict handling and multi-file isolation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a programmatically-defined CoreData model covering files, annotations, and bookmarks instead of a pre-built .xcdatamodeld file.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CoreDataAnnotationBookmarkStore", + "description": "Provides persistence for files, annotations, and bookmarks using a programmatically-defined CoreData model.", + "source_line": null + }, + { + "name": "AnnotationBookmarkStoreTests", + "description": "Unit tests covering create, update, delete, bookmark flows, conflict handling, and multi-file isolation for the CoreData-backed store.", + "source_line": null + }, + { + "name": "SwiftUI Outline View Integration", + "description": "Allows users to view and edit annotations and bookmarks in an outline UI with live updates.", + "source_line": null + }, + { + "name": "SwiftUI Detail View Integration", + "description": "Provides a detail screen where users can add, edit, delete notes and toggle bookmarks.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 997, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/next_tasks_metrics.json new file mode 100644 index 00000000..d5a1219f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/33_C4_CoreData_Annotation_Persistence/next_tasks.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "CoreData-backed annotation and bookmark storage", + "description": "Persist annotations and bookmarks using CoreData according to the R6 decision record", + "source_line": null + }, + { + "name": "Live UI updates for annotations and bookmarks", + "description": "Wire CoreData store into SwiftUI editing surfaces so changes are reflected in real time", + "source_line": null + }, + { + "name": "CLI and App DocC catalog expansion", + "description": "Add tutorials and screenshots to CLI and App DocC catalogs as new UI and command features are released", + "source_line": null + }, + { + "name": "DocC publishing via CI", + "description": "Publish DocC bundles through GitHub Actions, uploading artifacts for every build", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 600, + "line_count": 8 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/34_E3_CoreData_Migration_Planning_metrics.json b/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/34_E3_CoreData_Migration_Planning_metrics.json new file mode 100644 index 00000000..3bbbd00f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/34_E3_CoreData_Migration_Planning_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/34_E3_CoreData_Migration_Planning.md", + "n_spec": 11, + "n_func": 11, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement session persistence that stores open files, window layouts, and workspace metadata without data loss or schema churn.", + "source_line": null + }, + { + "type": "user_story", + "description": "Maintain backward compatibility for annotations and bookmarks across CoreData migrations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document a proposed CoreData model extension covering session metadata (recent files, window layouts, parse session snapshots) and its relationships to existing annotation/bookmark entities.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provide a migration strategy outlining lightweight versioning, automated migration steps, and fallback behavior when CoreData is unavailable (e.g., Linux CLI builds).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Identify required updates to tests, DocC catalogs, and manuals to reflect the new persistence scope once migrations land in Task E3.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "List open questions or dependencies (concurrency constraints, shared stores across platforms) that must be resolved before implementation begins.", + "source_line": null + }, + { + "type": "invariant", + "description": "CoreData migrations must preserve existing user data while accommodating future session-level records.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce explicit model versions using a ModelVersion enum and wrap makeModel() to support v1, v2 schemas.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use lightweight migration for new entities that only add tables/relationships without altering existing columns.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Seed workspace rows on first launch after migration.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "When CoreData is unavailable or migration fails, use JSON export/import sidecar files.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CoreDataAnnotationBookmarkStore", + "description": "Programmatic CoreData stack managing File, Annotation, Bookmark entities and migration hooks", + "source_line": null + }, + { + "name": "Workspace entity", + "description": "Single-row metadata describing last-known app state (app version, timestamp, schemaVersion) linked to Sessions", + "source_line": null + }, + { + "name": "Session entity", + "description": "Persisted workspace snapshot capturing open documents, window layouts, parse caches and session metadata", + "source_line": null + }, + { + "name": "SessionFile join entity", + "description": "Connects a Session to File entries with per-file UI state such as orderIndex, selection, scrollOffset, pinned flag", + "source_line": null + }, + { + "name": "WindowLayout entity", + "description": "Captures per-scene SwiftUI window geometry and navigation stack for multi-window setups", + "source_line": null + }, + { + "name": "SessionBookmarkDiff entity", + "description": "Tracks transient bookmark changes per session for conflict resolution with live annotation data", + "source_line": null + }, + { + "name": "AnnotationBookmarkStoreTests", + "description": "Unit tests exercising create/update/delete flows, cross-file isolation, and migration paths for annotations/bookmarks", + "source_line": null + }, + { + "name": "SessionStoreTests", + "description": "Future unit tests covering session persistence APIs (order indices, layout payloads, bookmark diffs)", + "source_line": null + }, + { + "name": "Migration tooling", + "description": "Automated lightweight migration strategy with explicit model versions and fallback JSON export/import utilities", + "source_line": null + }, + { + "name": "DocC InterfaceOverview updates", + "description": "Documentation describing workspace restoration including open files and window layouts", + "source_line": null + }, + { + "name": "App manual updates", + "description": "Manual entries explaining new persistence scope for annotations, bookmarks, and session metadata", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 10257, + "line_count": 104 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/Summary_of_Work_metrics.json new file mode 100644 index 00000000..8c6d40a8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/Summary_of_Work.md", + "n_spec": 2, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement Task E3 using the documented schema, adding versioned model loading and migration tests for the CoreData store.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session persistence implementation must be documented in DocC articles and manuals to describe workspace restoration flows.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CoreData Migration Plan Documentation", + "description": "Provides a documented plan for migrating CoreData schema including extensions, workflow, testing impact and dependencies.", + "source_line": null + }, + { + "name": "Versioned CoreData Model Scaffolding for Annotations and Bookmarks", + "description": "Enables loading of specific model versions for annotations and bookmarks, allowing seeding of additional entities without rewriting the store initializer.", + "source_line": null + }, + { + "name": "CoreData Entity Definitions (Workspace, Session, SessionFile, WindowLayout, SessionBookmarkDiff)", + "description": "Defines new CoreData entities that extend existing stores while preserving lightweight migration paths.", + "source_line": null + }, + { + "name": "Fallback Strategies and Manual Recovery Tooling for Linux Builds", + "description": "Provides fallback mechanisms and tools to recover from migration failures on Linux builds before session persistence features ship.", + "source_line": null + }, + { + "name": "CoreData Store Migration Tests", + "description": "Tests that verify versioned model loading and migration of the CoreData store.", + "source_line": null + }, + { + "name": "DocC Articles and Manuals Update for Session Persistence", + "description": "Updates documentation to describe workspace restoration flows once session persistence is implemented.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1845, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/next_tasks_metrics.json new file mode 100644 index 00000000..7a7832fd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/34_E3_CoreData_Migration_Planning/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 414, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ce694689 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/Summary_of_Work.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Expand ISOInspectorCLI DocC catalog with a tutorial on capturing research logs for annotation reviews, including cross-links to app workflows and new CLI screenshot assets.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expand ISOInspectorApp DocC catalog with a tutorial on annotating and bookmarking MP4 investigations, covering persistence steps and supporting screenshots.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tutorial files are added under both DocC catalogs along with generated PNG resources.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Catalog landing pages are updated to surface the new tutorials within the overview and topics sections.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must continue to pass swift test and python3 scripts/fix_markdown.py validation after changes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Capture Research Logs for Annotation Reviews", + "description": "CLI feature that captures research logs during annotation reviews", + "source_line": null + }, + { + "name": "Annotate and Bookmark MP4 Investigations", + "description": "App feature allowing users to annotate and bookmark sections of MP4 investigations with persistence", + "source_line": null + }, + { + "name": "DocC Catalog Landing Page Update", + "description": "UI component that surfaces new tutorials within overview and topics sections of the DocC catalog", + "source_line": null + }, + { + "name": "CLI Screenshot Asset Generation", + "description": "Process that generates PNG assets for CLI screenshots used in documentation", + "source_line": null + }, + { + "name": "Documentation Asset Management", + "description": "System managing tutorial files and generated resources across ISOInspectorCLI and ISOInspectorApp DocC catalogs", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1087, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/next_tasks_metrics.json new file mode 100644 index 00000000..3517b0d5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/next_tasks_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/35_A3_DocC_Tutorial_Expansion/next_tasks.md", + "n_spec": 0, + "n_func": 2, + "intent_atoms": [], + "functional_units": [ + { + "name": "CLI and App Documentation Catalogs", + "description": "Provides tutorials and screenshots for annotation and bookmark workflows", + "source_line": null + }, + { + "name": "DocC Publishing via CI", + "description": "Publishes DocC bundles as artifacts in continuous integration pipelines", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 387, + "line_count": 9 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/12_Add_DocC_Publishing_to_CI_metrics.json b/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/12_Add_DocC_Publishing_to_CI_metrics.json new file mode 100644 index 00000000..34a14981 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/12_Add_DocC_Publishing_to_CI_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/12_Add_DocC_Publishing_to_CI.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automate generation and upload of DocC documentation archives within the continuous integration pipeline so reviewers can download the latest documentation from each build.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CI workflow job invokes the existing documentation generation script and succeeds without manual intervention.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Generated DocC archive is uploaded as a persistent artifact (or equivalent) and exposed for download on each CI run.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Pipeline updates pass the existing CI checks and integrate with the established GitHub Actions workflow.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CI Workflow Job for DocC Generation", + "description": "Automates invocation of the documentation generation script within the CI pipeline to produce DocC archives.", + "source_line": null + }, + { + "name": "DocC Archive Upload as Persistent Artifact", + "description": "Uploads the generated DocC archive to the CI artifact storage, making it available for download on each build.", + "source_line": null + }, + { + "name": "Artifact Naming and Retention Management", + "description": "Defines naming conventions and retention policies for stored DocC artifacts in coordination with documentation owners.", + "source_line": null + }, + { + "name": "Integration with Existing GitHub Actions Workflow", + "description": "Ensures the new DocC publishing steps are compatible with and integrated into the established CI workflow.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1708, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/Summary_of_Work_metrics.json new file mode 100644 index 00000000..031d3a7d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/Summary_of_Work_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/Summary_of_Work.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Implemented a docc-archives job in .github/workflows/ci.yml that generates DocC documentation using the existing script and uploads the bundles as GitHub Actions artifacts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocC generation script is invoked within CI and artifact upload fails when documentation output is missing.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "docc-archives CI Job", + "description": "Generates DocC documentation using the existing script and uploads the bundles as GitHub Actions artifacts during continuous integration.", + "source_line": null + }, + { + "name": "Artifact Upload Validation", + "description": "Ensures that the artifact upload fails when documentation output is missing, providing validation of successful DocC generation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 805, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/next_tasks_metrics.json new file mode 100644 index 00000000..b0d5eb31 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/36_A3_DocC_Publishing_CI/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add DocC publishing to CI (e.g., GitHub Actions artifact uploads) after storage and hosting requirements are validated.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 172, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/37_C5_Accessibility_Features/37_C5_Accessibility_Features_metrics.json b/DOCS/TASK_ARCHIVE/37_C5_Accessibility_Features/37_C5_Accessibility_Features_metrics.json new file mode 100644 index 00000000..36817f27 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/37_C5_Accessibility_Features/37_C5_Accessibility_Features_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/37_C5_Accessibility_Features/37_C5_Accessibility_Features.md", + "n_spec": 9, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide VoiceOver-friendly labels for all UI elements in the SwiftUI interface of ISOInspectorUI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Enable Dynamic Type adaptability so that layout remains readable at large content sizes across tree, detail, and hex views.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement full keyboard navigation allowing selection of tree nodes, pane switching, and toolbar action activation without a pointing device.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "VoiceOver must announce meaningful descriptions for tree rows, detail fields, validation badges, and hex viewer sections, with rotor navigation enabling box-to-box traversal.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Dynamic Type scaling should preserve layout readability without truncating metadata or controls in all primary views.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Keyboard navigation must allow selecting tree nodes, switching panes, and activating toolbar actions, following logical reading sequence focus order.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated accessibility checks using XCTest + Accessibility Inspector run in CI to verify labels and focus behaviors, with documentation of the test plan.", + "source_line": null + }, + { + "type": "invariant", + "description": "All SwiftUI views must have populated accessibilityLabel, accessibilityValue, and accessibilityHint properties derived from MP4RA metadata where applicable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use @FocusState and FocusScope to manage focus between tree selection and detail pane editing via keyboard input.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Labeling for Tree Rows", + "description": "Provide VoiceOver-friendly labels, values, and hints for each row in the tree view using MP4RA metadata.", + "source_line": null + }, + { + "name": "VoiceOver Labeling for Detail Fields", + "description": "Announce meaningful descriptions for fields in the detail pane, including validation badges.", + "source_line": null + }, + { + "name": "VoiceOver Labeling for Hex Viewer Sections", + "description": "Ensure VoiceOver announces sections of the hex viewer with appropriate labels and rotor navigation support.", + "source_line": null + }, + { + "name": "Dynamic Type Support for Primary Views", + "description": "Apply dynamicTypeSize modifiers to tree, detail, and hex views so layout scales without truncation.", + "source_line": null + }, + { + "name": "Keyboard Navigation for Tree Selection", + "description": "Allow users to navigate and select tree nodes using keyboard keys and focus management.", + "source_line": null + }, + { + "name": "Keyboard Navigation for Pane Switching", + "description": "Enable switching between tree, detail, and hex panes via keyboard shortcuts or focus traversal.", + "source_line": null + }, + { + "name": "Keyboard Activation of Toolbar Actions", + "description": "Activate toolbar buttons and actions from the keyboard without a pointing device.", + "source_line": null + }, + { + "name": "Focus Management with @FocusState/FocusScope", + "description": "Coordinate focus across tree selection and detail editing using SwiftUI focus APIs.", + "source_line": null + }, + { + "name": "Automated Accessibility Testing in CI", + "description": "Run XCTest accessibility assertions and Accessibility Inspector snapshots as part of continuous integration.", + "source_line": null + }, + { + "name": "Accessibility Test Documentation", + "description": "Document test plans, results, and blockers in the research gaps document.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2922, + "line_count": 58 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/37_C5_Accessibility_Features/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/37_C5_Accessibility_Features/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d8d6911f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/37_C5_Accessibility_Features/Summary_of_Work_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/37_C5_Accessibility_Features/Summary_of_Work.md", + "n_spec": 3, + "n_func": 2, + "intent_atoms": [ + { + "type": "invariant", + "description": "Accessibility descriptor helpers for tree rows and detail metadata must be shared across components to drive VoiceOver labels backed by MP4RA metadata and validation severity.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Keyboard focus management is introduced across outline, detail, notes, and hex panes with arrow-key navigation for tree rows and byte-level movement inside the hex viewer.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test coverage must be extended with ParseTreeAccessibilityFormatterTests and new navigation scenarios in ParseTreeOutlineViewModelTests, and documentation refreshed in the Phase C workplan.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Accessibility Descriptor Helpers", + "description": "Provides shared helpers for generating accessibility descriptors for tree rows and detail metadata, enabling VoiceOver labels based on MP4RA metadata and validation severity.", + "source_line": null + }, + { + "name": "Keyboard Focus Management", + "description": "Manages keyboard focus across outline, detail, notes, and hex panes with arrow-key navigation for tree rows and byte-level movement inside the hex viewer.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 688, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/2025-10-11-nested-a11y-integration_metrics.json b/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/2025-10-11-nested-a11y-integration_metrics.json new file mode 100644 index 00000000..1ec456d2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/2025-10-11-nested-a11y-integration_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/38_NestedA11yIDs_Integration/2025-10-11-nested-a11y-integration.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Wire NestedA11yIDs into the ISOInspector App target so that the parse tree explorer exposes deterministic accessibility identifiers and downstream documentation reflects the conventions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Public Kit API added/changed: none", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Call sites updated: ISOInspectorApp.swift, ParseTreeOutlineView.swift, ParseTreeDetailView.swift", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Backward compatibility: additive identifiers only", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests implemented in Tests/ISOInspectorAppTests/ParseTreeAccessibilityIdentifierTests.swift", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Nested Accessibility ID Injection", + "description": "Injects deterministic accessibility identifiers into the ISOInspector App's parse tree explorer components", + "source_line": null + }, + { + "name": "Parse Tree Explorer UI Update", + "description": "Updates ParseTreeOutlineView to expose nested accessibility IDs for each node in the parse tree", + "source_line": null + }, + { + "name": "Parse Tree Detail View Enhancement", + "description": "Adds nested accessibility identifiers to ParseTreeDetailView elements for better testability and documentation", + "source_line": null + }, + { + "name": "Research Log Audit Preview Integration", + "description": "Applies nested accessibility IDs to the ResearchLogAuditPreview flow (planned)", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 944, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/B6_BoxParserRegistry_metrics.json b/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/B6_BoxParserRegistry_metrics.json new file mode 100644 index 00000000..575add37 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/B6_BoxParserRegistry_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/38_NestedA11yIDs_Integration/B6_BoxParserRegistry.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish a registry in ISOInspectorCore that maps each known MP4/ISO BMFF box type to its concrete parser so the streaming pipeline can construct structured payloads instead of opaque blobs, while preserving safe fallbacks for unknown leaf boxes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Registry object exposes lookup/registration APIs consumed by the streaming pipeline without breaking existing tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Known box types (ftyp, moov, trak, mdia, etc.) resolve to appropriate parser implementations covering high-priority structures listed in the PRD backlog.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unknown or unsupported boxes fall back to a safe opaque leaf handler while still emitting metadata for research logging.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover registry defaults, overrides, and integration with at least one specialized parser.", + "source_line": null + }, + { + "type": "invariant", + "description": "Registry configuration remains extensible so CLI/App targets can inject feature flags or experimental parsers without re-linking core modules.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Start from the current streaming parser entry points in ISOInspectorCore and thread the registry through existing factories to avoid broad refactors.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Seed the registry with specialized parsers for high-signal boxes already described in Phase C backlog items (e.g., ftyp, mvhd, tkhd) to align with upcoming UI feature needs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BoxParserRegistry", + "description": "Central registry mapping MP4/ISO BMFF box types to concrete parser implementations, exposing lookup and registration APIs for the streaming pipeline.", + "source_line": null + }, + { + "name": "Lookup API", + "description": "Method to retrieve a parser for a given box type, returning specialized parser or default container/opaque leaf handler.", + "source_line": null + }, + { + "name": "Registration API", + "description": "Method to register or override parsers for specific box types in the registry.", + "source_line": null + }, + { + "name": "Default Container Parser", + "description": "Fallback parser that treats unknown boxes as containers, preserving child structure.", + "source_line": null + }, + { + "name": "Opaque Leaf Handler", + "description": "Safe fallback parser for unsupported leaf boxes that emits metadata without parsing payload.", + "source_line": null + }, + { + "name": "Specialized Parsers (ftyp,mvhd,tkhd,etc.)", + "description": "Concrete parser implementations for high-priority box types seeded into the registry.", + "source_line": null + }, + { + "name": "Exporter Integration", + "description": "Mechanism for JSON and binary exporters to consume structured payloads produced via the registry.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2325, + "line_count": 48 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..4b9f5292 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/38_NestedA11yIDs_Integration/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/38_NestedA11yIDs_Integration/Summary_of_Work.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "The ISOInspector App target must integrate NestedA11yIDs with rooted identifiers for the parse tree explorer.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide documentation outlining usage conventions and migration plan for NestedA11yIDs integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation file Docs/Guides/NestedA11yIDsIntegration.md must be added.", + "source_line": null + }, + { + "type": "invariant", + "description": "Follow-up puzzles for research log previews and annotation notes must be captured via @todo entries and todo.md.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend movie header parsing to surface next_track_ID payload data.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Movie header parsing must support extracting and displaying next_track_id.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NestedA11yIDs Integration", + "description": "Integrates NestedA11yIDs into ISOInspector App target providing rooted identifiers for the parse tree explorer.", + "source_line": null + }, + { + "name": "Documentation for NestedA11yIDs Usage", + "description": "Provides documentation outlining usage conventions and migration plan for NestedA11yIDs integration.", + "source_line": null + }, + { + "name": "Research Log Previews Capture", + "description": "Captures follow-up puzzles for research log previews and annotation notes via @todo entries and todo.md.", + "source_line": null + }, + { + "name": "Movie Header Parsing Extension", + "description": "Extends movie header parsing to surface next_track_ID payload data.", + "source_line": null + }, + { + "name": "App Detail Payload Annotations Restoration", + "description": "Restores app detail payload annotations, enabling B6 registry integration tests.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 740, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/13_Apply_NestedA11yIDs_Research_Log_Preview_metrics.json b/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/13_Apply_NestedA11yIDs_Research_Log_Preview_metrics.json new file mode 100644 index 00000000..a454641e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/13_Apply_NestedA11yIDs_Research_Log_Preview_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/13_Apply_NestedA11yIDs_Research_Log_Preview.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Introduce hierarchical accessibility identifiers to the research log preview interfaces so QA automation can target audit components without relying on localized strings or layout heuristics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ResearchLogAuditPreview (and any production host screens) declare a stable .a11yRoot for the research log surface and apply .nestedAccessibilityIdentifier(...) to key subviews such as headers, diagnostic lists, and status badges.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accessibility snapshots or UI tests confirm identifiers follow the researchLogPreview.* naming pattern without collisions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and TODO references are updated to point at the implemented identifiers, closing the outstanding @todo marker in ResearchLogAuditPreview.swift and marking todo.md item #13 as complete when shipped.", + "source_line": null + }, + { + "type": "invariant", + "description": "Identifiers must be ready when the preview is promoted into production screens (release R13).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse conventions introduced for the parse tree explorer (e.g., lowercase slug segments) to keep identifier schemes consistent.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseTreeAccessibilityIdentifierTests or add focused SwiftUI preview tests to assert presence of the new identifiers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogAuditPreview UI", + "description": "Provides a preview interface for research log audits with nested accessibility identifiers.", + "source_line": null + }, + { + "name": "Nested Accessibility Identifier Assignment", + "description": "Applies .a11yRoot and .nestedAccessibilityIdentifier to key subviews such as headers, diagnostic lists, and status badges in the research log preview surface.", + "source_line": null + }, + { + "name": "Production Host Screen Integration", + "description": "Ensures production screens hosting the research log audit expose stable a11y identifiers following the researchLogPreview.* pattern.", + "source_line": null + }, + { + "name": "Accessibility Snapshot & UI Test Validation", + "description": "Runs accessibility snapshots or UI tests to confirm identifier naming and absence of collisions.", + "source_line": null + }, + { + "name": "ParseTreeAccessibilityIdentifierTests Extension", + "description": "Extends existing ParseTreeAccessibilityIdentifierTests or adds SwiftUI preview tests to assert presence of new identifiers.", + "source_line": null + }, + { + "name": "Documentation Update", + "description": "Updates documentation, TODO references, and closes @todo marker in ResearchLogAuditPreview.swift and todo.md item #13.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2543, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d5c6f659 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/Summary_of_Work_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/Summary_of_Work.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "invariant", + "description": "NestedA11yIDs identifiers must be applied to ResearchLogAuditPreview and include researchLogPreview root, header/status metadata coverage, and stable diagnostics row identifiers for QA automation.", + "source_line": null + }, + { + "type": "user_story", + "description": "Apply NestedA11yIDs identifiers to ResearchLogAuditPreview to support accessibility and QA automation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The application of NestedA11yIDs must cover the researchLogPreview root, header/status metadata, and stable diagnostics row identifiers as documented in Docs/Guides/NestedA11yIDsIntegration.md.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogAuditPreview Component", + "description": "UI component that displays a research log preview with nested accessibility IDs and stable diagnostics row identifiers for QA automation.", + "source_line": null + }, + { + "name": "NestedA11yIDs Integration Documentation", + "description": "Documentation detailing how to apply NestedA11yIDs identifiers to components, including examples for research logs.", + "source_line": null + }, + { + "name": "Research Log Preview Rollout Process", + "description": "Workflow for rolling out the research log preview feature across the system, tracked via documentation and task management.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 738, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/next_tasks_metrics.json new file mode 100644 index 00000000..f783b6d2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/next_tasks_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/39_Apply_NestedA11yIDs_Research_Log_Preview/next_tasks.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Apply NestedA11yIDs identifiers to research log preview flows", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "NestedA11yIDs identifiers must be applied to research log preview flows as per todo.md item #13", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 266, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/14_Add_NestedA11yIDs_Annotation_Note_Controls_metrics.json b/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/14_Add_NestedA11yIDs_Annotation_Note_Controls_metrics.json new file mode 100644 index 00000000..766a37e0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/14_Add_NestedA11yIDs_Annotation_Note_Controls_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/14_Add_NestedA11yIDs_Annotation_Note_Controls.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add NestedA11yIDs identifiers to the annotation note edit, save, cancel, and delete controls so QA automation can target them deterministically across platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Annotation note toolbar buttons expose stable `.nestedAccessibilityIdentifier` values for edit, save, cancel, and delete actions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Identifier constants live alongside existing NestedA11yIDs definitions (e.g., in a dedicated `AnnotationAccessibilityID` namespace) with unit coverage similar to other accessibility identifier tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in `Docs/Guides/NestedA11yIDsIntegration.md` lists the new identifiers for QA reference if additional usage notes are required.", + "source_line": null + }, + { + "type": "invariant", + "description": "Identifier naming follows the no-dot-per-segment rule and mirrors automation semantics (e.g., `annotationNotes.list.row.edit`).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Annotation Note Edit Button", + "description": "UI button that allows users to edit an annotation note", + "source_line": null + }, + { + "name": "Annotation Note Save Button", + "description": "UI button that saves changes made to an annotation note", + "source_line": null + }, + { + "name": "Annotation\u00a0Note\u00a0Cancel\u00a0Button", + "description": "UI button that cancels edits on an annotation note", + "source_line": null + }, + { + "name": "Annotation\u00a0..\u2026", + "description": "Weird\u00a0...", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2119, + "line_count": 34 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/Summary_of_Work_metrics.json new file mode 100644 index 00000000..66e56faa --- /dev/null +++ b/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 354, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/next_tasks_metrics.json new file mode 100644 index 00000000..7befcb93 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/next_tasks_metrics.json @@ -0,0 +1,23 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/40_14_Add_NestedA11yIDs_Annotation_Note_Controls/next_tasks.md", + "n_spec": 1, + "n_func": 1, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add NestedA11yIDs tags to note edit/save/delete controls", + "source_line": null + } + ], + "functional_units": [ + { + "name": "NestedA11yIDs Tagging for Note Controls", + "description": "Adds NestedA11yIDs tags to the edit, save, and delete controls of notes to support accessibility features", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 146, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/D1_Scaffold_CLI_Base_Command_metrics.json b/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/D1_Scaffold_CLI_Base_Command_metrics.json new file mode 100644 index 00000000..08dd027d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/D1_Scaffold_CLI_Base_Command_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/D1_Scaffold_CLI_Base_Command.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create the initial isoinspector executable with a root command that prints help and wires shared configuration so future subcommands can reuse the streaming parser pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftPM workspace defines an ISOInspectorCLI target that builds a runnable tool.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Running isoinspector --help lists the base command description and planned subcommands placeholder(s).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Command-line entry point shares logging/telemetry hooks with existing packages without regressing existing tests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add a swift-argument-parser dependency if not already declared and register the root ParsableCommand for isoinspector.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Structure the command hierarchy to accept global options (e.g., verbosity, output format) that downstream subcommands can extend.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce smoke tests or fixtures that execute the command with --help to guard the interface contract.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "isoinspector root command", + "description": "Executable CLI that prints help and lists planned subcommands", + "source_line": null + }, + { + "name": "global options handling", + "description": "Supports global flags such as verbosity and output format for all subcommands", + "source_line": null + }, + { + "name": "shared configuration wiring", + "description": "Reuses streaming parser pipeline services across future subcommands", + "source_line": null + }, + { + "name": "logging/telemetry integration", + "description": "Hooks into existing logging and telemetry systems without regressions", + "source_line": null + }, + { + "name": "help command smoke test", + "description": "Automated test that runs isoinspector --help to verify interface contract", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2083, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/Summary_of_Work_metrics.json new file mode 100644 index 00000000..2718798a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/Summary_of_Work_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/Summary_of_Work.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Introduce an isoinspector root command powered by swift-argument-parser with placeholder inspect, validate, and export subcommands plus shared context bootstrap for future streaming operations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add Swift ArgumentParser dependency to Package.swift and update the CLI target along with its tests to link the new product.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Create ISOInspectorCommand, ISOInspectorCommandContext, and ISOInspectorCommandContextStore to wire shared ISOInspectorCLIEnvironment state and expose global options for upcoming telemetry toggles.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update the CLI entry point to execute the new command, leaving legacy runner logic in place for existing tests.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface global logging and telemetry toggles once streaming metrics are exposed to the CLI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute streaming inspection by consuming ParsePipeline events when Task D2 builds the streaming command.", + "source_line": null + }, + { + "type": "user_story", + "description": "Produce validation reports with streaming pipeline once Task D2 defines the CLI output contract.", + "source_line": null + }, + { + "type": "user_story", + "description": "Route export operations to streaming capture utilities as they migrate from ISOInspectorCLIRunner.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspector CLI Root Command", + "description": "Provides the base command 'isoinspector' for the tool, serving as entry point for subcommands.", + "source_line": null + }, + { + "name": "Inspect Subcommand", + "description": "Placeholder subcommand intended to perform inspection operations on ISO data.", + "source_line": null + }, + { + "name": "Validate Subcommand", + "description": "Placeholder subcommand intended to validate ISO data.", + "source_line": null + }, + { + "name": "Export Subcommand", + "description": "Placeholder subcommand intended to export ISO data.", + "source_line": null + }, + { + "name": "ISOInspectorCommandContext", + "description": "Shared context object exposing global options and environment state for CLI commands.", + "source_line": null + }, + { + "name": "ISOInspectorCommandContextStore", + "description": "Storage mechanism for the shared command context across the CLI.", + "source_line": null + }, + { + "name": "ISOInspectorCLIEnvironment", + "description": "Global environment state used by the CLI, including telemetry toggles.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1332, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/next_tasks_metrics.json new file mode 100644 index 00000000..d1566585 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/next_tasks_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/41_D1_Scaffold_CLI_Base_Command/next_tasks.md", + "n_spec": 11, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish the isoinspector executable target and root command using swift-argument-parser so downstream streaming commands can share consistent infrastructure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The isoinspector executable target and root command must be established using swift-argument-parser.", + "source_line": null + }, + { + "type": "invariant", + "description": "Downstream streaming commands (Task D2) rely on the consistent infrastructure provided by the isoinspector root command.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement inspect and validate commands once the CLI scaffolding is complete.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The inspect and validate commands must be implemented after completion of Task D1.", + "source_line": null + }, + { + "type": "invariant", + "description": "Task D2 cannot proceed until Task D1 is completed.", + "source_line": null + }, + { + "type": "user_story", + "description": "Build a SwiftUI app shell with document browser and recents list once the CLI scaffolding stabilizes and foundation C1 is completed.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The SwiftUI app shell must be built after the CLI scaffolding stabilizes and the foundation C1 is completed.", + "source_line": null + }, + { + "type": "invariant", + "description": "E1 depends on completed C1 foundation.", + "source_line": null + }, + { + "type": "user_story", + "description": "Configure performance benchmarks for large files once the parsing pipeline from Phase B is stabilized and streaming fixtures delivered.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The benchmark configuration must be done after the parsing pipeline has been stable\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "isoinspector CLI executable", + "description": "Provides a command-line interface executable named isoinspector that serves as the root command for downstream streaming commands.", + "source_line": null + }, + { + "name": "inspect command", + "description": "Command to inspect data streams or files, part of the CLI functionality.", + "source_line": null + }, + { + "name": "validate command", + "description": "Command to validate data streams or files, part of the CLI functionality.", + "source_line": null + }, + { + "name": "SwiftUI app shell", + "description": "Graphical user interface built with SwiftUI that includes a document browser and recents list for managing documents.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 681, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/Summary_of_Work_metrics.json new file mode 100644 index 00000000..2d6e8d61 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/Summary_of_Work_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/Summary_of_Work.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement inspect and validate commands with streaming output in the CLI", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Asynchronous subcommands must be backed by ISOInspectorCLIEnvironment", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming parse events should produce VR-006 research logs", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Aggregated validation outcomes must be produced", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI tests must cover new commands, ensuring research log integration and severity-based exit codes", + "source_line": null + }, + { + "type": "invariant", + "description": "Global logging and telemetry toggles are surfaced once streaming metrics are exposed via the CLI", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Route export operations are routed to shared streaming capture utilities as part of remaining CLI migration", + "source_line": null + } + ], + "functional_units": [ + { + "name": "inspect command", + "description": "CLI subcommand that streams parse events and produces VR-006 research logs while aggregating validation outcomes", + "source_line": null + }, + { + "name": "validate command", + "description": "CLI subcommand that streams parse events and aggregates validation outcomes with severity-based exit codes", + "source_line": null + }, + { + "name": "ISOInspectorCLIEnvironment integration", + "description": "Asynchronous environment backing the inspect/validate commands for streaming output", + "source_line": null + }, + { + "name": "global logging toggle", + "description": "Feature to enable or disable global logging and telemetry once metrics are exposed via CLI", + "source_line": null + }, + { + "name": "telemetry toggle", + "description": "Feature to enable or disable telemetry collection in the system", + "source_line": null + }, + { + "name": "route export operation routing", + "description": "Routing of route export operations to shared streaming capture utilities as part of CLI migration", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 826, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/next_tasks_metrics.json new file mode 100644 index 00000000..e82a9425 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/next_tasks_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/42_D2_Streaming_CLI_Commands/next_tasks.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build SwiftUI app shell with document browser and recents list that integrates CoreData-backed session persistence once CLI scaffolding stabilizes and C1/C2 foundations remain green.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Configure performance benchmarks for large files by standing up benchmarking harnesses using streaming fixtures to measure CLI and app throughput for large MP4 payloads.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface global logging and telemetry toggles once streaming metrics are exposed to the CLI.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Execute streaming inspection by consuming ParsePipeline events when Task D2 builds the streaming command.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Produce validation reports with the streaming pipeline once Task D2 defines the CLI output contract.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Route export operations to streaming capture utilities as they migrate from ISOInspectorCLIRunner.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftUI App Shell with Document Browser and Recents List", + "description": "Provides a SwiftUI application shell that includes a document browser interface and a list of recently accessed documents, backed by CoreData for session persistence.", + "source_line": null + }, + { + "name": "CoreData-backed Session Persistence Integration", + "description": "Integrates CoreData to persist user sessions within the app shell, ensuring data is retained across launches.", + "source_line": null + }, + { + "name": "Performance Benchmarking Harnesses for Large MP4 Files", + "description": "Sets up benchmarking tools that measure command-line interface and application throughput when processing large MP4 payloads using streaming fixtures.", + "source_line": null + }, + { + "name": "Streaming Inspection via ParsePipeline Events", + "description": "Consumes events from the ParsePipeline to inspect streaming data during the construction of streaming commands.", + "source_line": null + }, + { + "name": "Validation Report Generation for Streaming Pipeline", + "description": "Produces validation reports based on the output of the streaming pipeline once the CLI output contract is defined.", + "source_line": null + }, + { + "name": "Export Operation Routing to Streaming Capture Utilities", + "description": "Routes export operations through streaming capture utilities as they transition from the ISOInspectorCLIRunner.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 926, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/2025-10-12-app-shell_metrics.json b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/2025-10-12-app-shell_metrics.json new file mode 100644 index 00000000..b74ae54a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/2025-10-12-app-shell_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/2025-10-12-app-shell.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver a SwiftUI document shell that lets ISOInspectorApp open MP4/QuickTime files, stream them into the existing tree/detail UI, and persist a recent files list.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The app shell must host AppShellView with DocumentSessionController as entry point.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "DocumentRecentsStore persists a recent files list.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When a document is active, the previous parsing explorer remains available (backward compatibility).", + "source_line": null + }, + { + "type": "invariant", + "description": "No changes to public Kit API.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "AppShellView and DocumentSessionController are wired into SwiftUI app entry point.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DocumentSessionController", + "description": "Manages opening and streaming MP4/QuickTime files into the existing tree/detail UI", + "source_line": null + }, + { + "name": "DocumentRecentsStore", + "description": "Persists a list of recently opened documents", + "source_line": null + }, + { + "name": "AppShellView", + "description": "SwiftUI view that hosts the document session controller and provides the app shell interface", + "source_line": null + }, + { + "name": "ISOInspectorApp wiring", + "description": "Application entry point that integrates AppShellView with the rest of the app", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 933, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/E1_Build_SwiftUI_App_Shell_metrics.json b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/E1_Build_SwiftUI_App_Shell_metrics.json new file mode 100644 index 00000000..b3fa8a55 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/E1_Build_SwiftUI_App_Shell_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/E1_Build_SwiftUI_App_Shell.md", + "n_spec": 12, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver the initial ISOInspectorApp shell that lets users browse MP4/QuickTime files and open them into the existing streaming UI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Persist a recents list so the groundwork for full session restoration is in place.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Users see onboarding or recent files immediately upon launch, backed by persisted entries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Opening files via the browser or picker streams events into tree/detail/hex views without hurting responsiveness goals.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Successfully opened files land in a recents model (security-scoped bookmarks/CoreData) that reloads on relaunch.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Analytics toggles stay disabled to retain CLI parity while leaving hooks for later instrumentation tasks.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate the ParsePipeline and Combine stores into a DocumentSessionController.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure parsing stays off the main actor while that controller feeds SwiftUI state.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Adopt platform pickers (DocumentGroup on macOS/iPadOS, .fileImporter on iOS) to cover the required MP4/QuickTime UTTypes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Persist recents using security-scoped bookmarks or CoreData scaffolding.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose the data so Task E3 can extend the store to full workspace restoration.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Centralize future streaming metrics toggles in the shell and keep them disabled to mirror CLI behavior tracked in the PDD follow-ups.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Document Browser UI", + "description": "Allows users to browse MP4/QuickTime files and select one for opening", + "source_line": null + }, + { + "name": "File Picker Integration", + "description": "Uses platform pickers (DocumentGroup on macOS/iPadOS, .fileImporter on iOS) to import files", + "source_line": null + }, + { + "name": "Onboarding Screen", + "description": "Displays onboarding or recent files immediately upon launch", + "source_line": null + }, + { + "name": "Recents List Persistence", + "description": "Persists a list of recently opened files using security\u2011scoped bookmarks or CoreData and reloads it on relaunch", + "source_line": null + }, + { + "name": "Document Session Controller", + "description": "Integrates ParsePipeline and Combine stores to manage document parsing off the main actor and feed SwiftUI state", + "source_line": null + }, + { + "name": "Streaming Pipeline", + "description": "Streams parsed events into tree/detail/hex views without blocking UI responsiveness", + "source_line": null + }, + { + "name": "Analytics Toggle Hook", + "description": "Provides disabled analytics toggles for future instrumentation while maintaining CLI parity", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2543, + "line_count": 52 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/Summary_of_Work_metrics.json new file mode 100644 index 00000000..69790f57 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Use a DocumentSessionController to coordinate ParseTreeStore, annotation sessions, and a persisted DocumentRecentsStore with security-scoped bookmarks.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide an AppShellView navigation split interface that replaces the previous single-screen ContentView.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Persist recents to Application Support/DocumentRecents and hydrate them on launch, including bookmark refresh for stale entries.", + "source_line": null + }, + { + "type": "invariant", + "description": "Security-scoped bookmarks must be used for persisted DocumentRecentsStore.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DocumentSessionController", + "description": "Coordinates ParseTreeStore, annotation sessions, and persisted DocumentRecentsStore with security-scoped bookmarks.", + "source_line": null + }, + { + "name": "AppShellView", + "description": "Navigation split interface providing onboarding, recents management, and file import handling for MP4/QuickTime sources.", + "source_line": null + }, + { + "name": "DocumentRecentsStore", + "description": "Persisted storage of recent documents in Application Support/DocumentRecents, including bookmark refresh for stale entries.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1043, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/next_tasks_metrics.json new file mode 100644 index 00000000..7ed73be9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/next_tasks_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/43_E1_Build_SwiftUI_App_Shell/next_tasks.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build SwiftUI app shell with document browser and recents list using CoreData-backed session persistence", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use CoreData for session persistence in the SwiftUI app shell", + "source_line": null + }, + { + "type": "user_story", + "description": "Configure performance benchmarks for large MP4 files by standing up benchmarking harnesses using streaming fixtures to measure CLI and app throughput", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmarking harnesses must measure both CLI and app throughput for large MP4 payloads", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose global logging and telemetry toggles once streaming metrics are exposed to the CLI", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute streaming inspection by consuming ParsePipeline events when Task D2 builds the streaming command", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming inspection must consume ParsePipeline events during Task D2's streaming command build", + "source_line": null + }, + { + "type": "user_story", + "description": "Produce validation reports with the streaming pipeline once Task D3 (?\u00a0??)\u00a0\u2014\u00a0\"\u2026\u00a0..\u00a0\"", + "source_line": null + } + ], + "functional_units": [ + { + "name": "SwiftUI App Shell", + "description": "Provides a SwiftUI application shell featuring a document browser and recents list backed by CoreData for session persistence.", + "source_line": null + }, + { + "name": "Performance Benchmarking Harnesses", + "description": "Offers benchmarking tools to measure CLI and app throughput for large MP4 files using streaming fixtures.", + "source_line": null + }, + { + "name": "Global Logging & Telemetry Toggles", + "description": "Enables toggling of surface-level global logging and telemetry within the system when streaming metrics are available.", + "source_line": null + }, + { + "name": "Streaming Inspection Consumer", + "description": "Consumes ParsePipeline events during Task D2 to inspect streaming data.", + "source_line": null + }, + { + "name": "Validation Report Generator", + "description": "Produces validation reports from the streaming pipeline once the CLI output contract is defined.", + "source_line": null + }, + { + "name": "Export Operation Routing", + "description": "Routes export operations to streaming capture utilities as they transition from ISOInspectorCLIRunner.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1055, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/44_F2_Configure_Performance_Benchmarks_metrics.json b/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/44_F2_Configure_Performance_Benchmarks_metrics.json new file mode 100644 index 00000000..9a61d7c0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/44_F2_Configure_Performance_Benchmarks_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/44_F2_Configure_Performance_Benchmarks.md", + "n_spec": 8, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Configure automated performance benchmarks for large MP4 analyses to capture CLI and app throughput.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmarks execute representative large-file scenarios for CLI streaming validation and UI event propagation, recording latency, throughput, and memory use.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Baseline thresholds derived from initial runs are encoded so CI fails when regressions exceed agreed tolerances.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updates summarize benchmark scenarios, metrics captured, and instructions for reproducing measurements locally.", + "source_line": null + }, + { + "type": "invariant", + "description": "Non-functional requirements mandate sub-45-second CLI validation for 4 GB reference files and <200 ms UI update latency.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Leverage existing streaming fixtures or generate synthetic large files guided by Research Task R4 recommendations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate XCTest Metrics and signpost instrumentation to capture CPU time, wall-clock latency, and memory for both CLI commands and UI pipelines.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide configuration hooks (e.g., environment variables) to toggle benchmark intensity to keep default CI runtime manageable while enabling deeper local profiling when needed.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Large-File Performance Benchmark Suite", + "description": "Automated tests that measure CLI and UI throughput for large MP4 analyses, capturing latency, throughput, and memory usage.", + "source_line": null + }, + { + "name": "CLI Streaming Validation Benchmark", + "description": "Executes representative large-file scenarios via command-line interface to validate streaming performance against sub\u201145\u2011second thresholds.", + "source_line": null + }, + { + "name": "UI Event Propagation Benchmark", + "description": "Runs large-file scenarios in the application UI to measure event propagation latency (<200\u202fms) and throughput.", + "source_line": null + }, + { + "name": "Benchmark Configuration Hooks", + "description": "Environment variable or other configuration options that toggle benchmark intensity, allowing default CI runtime to remain manageable while enabling deeper local profiling.", + "source_line": null + }, + { + "name": "Baseline Threshold Encoder", + "description": "Stores derived baseline metrics so that CI fails when regressions exceed agreed tolerances.", + "source_line": null + }, + { + "name": "Synthetic Large-File Generator", + "description": "Tool for generating synthetic 4\u202fGB MP4 files guided by research task recommendations, used as test assets when existing fixtures are insufficient.", + "source_line": null + }, + { + "name": "XCTest Metrics Integration", + "description": "Instrumentation using XCTest Metrics to capture CPU time and wall\u2011clock latency for both CLI commands and UI pipelines.", + "source_line": null + }, + { + "name": "Signpost Instrumentation Module", + "description": "Adds signpost logging to record detailed performance data during benchmark runs.", + "source_line": null + }, + { + "name": "Benchmark Documentation Generator", + "description": "Produces documentation summarizing benchmark scenarios, captured metrics, and instructions for reproducing measurements locally.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2450, + "line_count": 56 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1c87caf3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/Summary_of_Work.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Configure performance benchmarks for large files", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add PerformanceBenchmarkConfiguration with environment-tunable payload sizes, iteration counts, and slack multipliers scaled from NFR throughput targets", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce LargeFileBenchmarkTests exercising CLI validation throughput and SwiftUI bridge latency via XCTest metrics harnesses and a reusable large-fixture generator", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run swift test to execute full test suite including new performance benchmarks, with UI latency benchmark skipping automatically when Combine is unavailable", + "source_line": null + } + ], + "functional_units": [ + { + "name": "PerformanceBenchmarkConfiguration", + "description": "Configures environment-tunable payload sizes, iteration counts, and slack multipliers for large file performance benchmarks based on NFR throughput targets.", + "source_line": null + }, + { + "name": "LargeFileBenchmarkTests", + "description": "Executes CLI validation throughput tests and, when Combine is available, SwiftUI bridge latency tests using XCTest metrics harnesses with a reusable large-fixture generator.", + "source_line": null + }, + { + "name": "CLI Validation Throughput Benchmark", + "description": "Measures the system's command-line interface throughput for processing large files.", + "source_line": null + }, + { + "name": "SwiftUI Bridge Latency Benchmark", + "description": "Measures latency of the SwiftUI bridge when Combine is available, using XCTest metrics harnesses.", + "source_line": null + }, + { + "name": "Automated Benchmark Execution via swift test", + "description": "Runs the full test suite including performance benchmarks automatically through the 'swift test' command.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 969, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/next_tasks_metrics.json new file mode 100644 index 00000000..cd818241 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/44_F2_Configure_Performance_Benchmarks/next_tasks.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Build SwiftUI app shell with document browser and recents list, wiring CoreData-backed session persistence into the app shell.", + "source_line": null + }, + { + "type": "user_story", + "description": "Configure performance benchmarks for large files to validate CLI and app throughput for streaming MP4 analysis.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark harness implementation must track against performance NFRs called out in the execution guide and PRD while instrumentation hooks land.", + "source_line": null + }, + { + "type": "invariant", + "description": "CoreData-backed session persistence must remain stable as CLI scaffolding is stable and C1/C2 foundations remain green.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1274, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/2025-10-12-parser-selection-bridging_metrics.json b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/2025-10-12-parser-selection-bridging_metrics.json new file mode 100644 index 00000000..2d5ac718 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/2025-10-12-parser-selection-bridging_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/2025-10-12-parser-selection-bridging.md", + "n_spec": 6, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user of the SwiftUI explorer, I want the first available node to be automatically selected when streaming events populate the parse tree so that I can immediately view its details.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When ParseTreeStore publishes a new snapshot, ParseTreeExplorerView must auto-select the first node in the tree if no node is currently selected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "If a node was already selected before the snapshot update, the selection should remain unchanged (backward compatibility).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeOutlineViewModel exposes helpers for default selection and node existence checks that are used by ParseTreeExplorerView to determine the first available node.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must never auto-select a node when no nodes exist in the parse tree.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "No changes to Kit or CLI; only App layer components (ParseTreeExplorerView and ParseTreeOutlineViewModel) are modified for automatic selection behavior.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeExplorerView auto-selection", + "description": "Automatically selects the first available node in the SwiftUI explorer when parse snapshot updates", + "source_line": null + }, + { + "name": "ParseTreeOutlineViewModel default selection helpers", + "description": "Provides helper methods to determine and expose the default selected node and check for node existence", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 984, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/E2_Integrate_Parser_Event_Pipeline_metrics.json b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/E2_Integrate_Parser_Event_Pipeline_metrics.json new file mode 100644 index 00000000..0df1ccb0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/E2_Integrate_Parser_Event_Pipeline_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/E2_Integrate_Parser_Event_Pipeline.md", + "n_spec": 6, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user, I want the SwiftUI document shell to automatically update its outline, detail, and validation panels when I open or select a media file so that I can inspect the file contents immediately.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When a supported file is selected or opened within the app, the parser pipeline is triggered and the UI tree/detail panes are populated without requiring a manual refresh.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validation and event state remain synchronized between the streaming parser pipeline and the SwiftUI view models while respecting main-actor updates.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "End-to-end latency from file selection to UI update stays below 200 ms, meeting the responsiveness requirement for streaming updates.", + "source_line": null + }, + { + "type": "invariant", + "description": "The document shell must invoke the parser through a clear coordinator (e.g., an app-level controller) and clean up subscriptions when sessions close.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the Combine bridge and session stores established during task C1 to fan out parser events to SwiftUI-managed state.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parser Event Streaming to UI", + "description": "Streams parser output from ISOInspectorCore to SwiftUI document shell, updating outline, detail, and validation panels in real time.", + "source_line": null + }, + { + "name": "File Selection Trigger", + "description": "Handles selecting or opening a supported file within the app, initiating the parser pipeline automatically.", + "source_line": null + }, + { + "name": "Coordinator Controller", + "description": "App-level controller that invokes the parser and manages subscriptions for each session, ensuring cleanup when sessions close.", + "source_line": null + }, + { + "name": "Combine Bridge Integration", + "description": "Reuses Combine bridge and session stores to fan out parser events to SwiftUI-managed state.", + "source_line": null + }, + { + "name": "Latency Monitoring", + "description": "Ensures end-to-end latency stays below 200 ms for responsive inspection workflows.", + "source_line": null + }, + { + "name": "Validation State Synchronization", + "description": "Keeps validation and event state synchronized between the streaming pipeline and UI view models on the main actor.", + "source_line": null + }, + { + "name": "Telemetry Compatibility", + "description": "Verifies compatibility with export and benchmarking hooks so downstream telemetry tasks can observe streamed data.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1972, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/Summary_of_Work_metrics.json new file mode 100644 index 00000000..56963f3e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate Parser Event Pipeline with UI Components to auto-select the first parsed node so the detail pane populates as soon as streaming events arrive.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Default selection of the first parsed node is verified by ParseTreeOutlineViewModelTests and identifier tracking for updated snapshots.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always maintain a consistent mapping between parser events and UI component selections.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add macOS SwiftUI automation once available to cover end-to-end selection updates.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parser Event Pipeline Integration", + "description": "Integrates the parser event pipeline with UI components to automatically select and display parsed nodes in the detail pane.", + "source_line": null + }, + { + "name": "Default Selection Logic for Parsed Nodes", + "description": "Automatically selects the first parsed node so the detail pane populates immediately upon receiving streaming events.", + "source_line": null + }, + { + "name": "Identifier Tracking for Snapshot Updates", + "description": "Tracks identifiers of selected nodes across updated snapshots to maintain selection state.", + "source_line": null + }, + { + "name": "ParseTreeOutlineViewModel Tests", + "description": "Unit tests verifying default selection and identifier tracking behavior in the ParseTreeOutlineViewModel.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 473, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/next_tasks_metrics.json new file mode 100644 index 00000000..3d1ca04f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/next_tasks_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/45_E2_Integrate_Parser_Event_Pipeline/next_tasks.md", + "n_spec": 9, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate parser event pipeline with UI components in app context to enable live tree/detail refreshes when opening a file using the existing Combine bridge.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The streaming parser feed must be bridged into the SwiftUI shell so that opening a file drives live tree/detail refreshes.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Combine as the bridge between the parser event pipeline and UI components in the app context.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must run on a platform that ships Combine and record latency metrics, ensuring throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "invariant", + "description": "Throughput must remain equal to or greater than the CLI harness during benchmarking.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface global logging and telemetry toggles once streaming metrics are exposed to the CLI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Global logging and telemetry toggles should be available after streaming metrics are exposed.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Route export operations to streaming capture utilities as they migrate from ISOInspectorCLIRunner.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Parser Event Pipeline Integration", + "description": "Integrates the streaming parser feed into SwiftUI shell to refresh tree/detail views when opening a file", + "source_line": null + }, + { + "name": "Combine-Backed UI Benchmark on macOS", + "description": "Executes Combine-backed UI benchmark to capture latency metrics while maintaining throughput parity with CLI harness", + "source_line": null + }, + { + "name": "Global Logging and Telemetry Toggles", + "description": "Provides surface-level global logging and telemetry toggles once streaming metrics are exposed to the CLI", + "source_line": null + }, + { + "name": "Route Export Operations to Streaming Capture Utilities", + "description": "Exports route operations to streaming capture utilities as they migrate from ISOInspectorCLIRunner", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 835, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Route_Streaming_Export_Operations_metrics.json b/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Route_Streaming_Export_Operations_metrics.json new file mode 100644 index 00000000..5d0754a2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Route_Streaming_Export_Operations_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Route_Streaming_Export_Operations.md", + "n_spec": 8, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Enable the isoinspector export subcommand to stream parse events through ISOInspectorCLIEnvironment and produce JSON or binary capture artifacts without relying on legacy ISOInspectorCLIRunner.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "isoinspector export accepts target media path (and optional output overrides) and streams events using ISOInspectorCLIEnvironment.parsePipeline, writing JSON trees or capture files via existing exporters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Output paths mirror legacy defaults (.isoinspector.json and .capture), validate writability, and emit success/error messaging consistent with other subcommands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests cover the new export subcommand end-to-end, including success cases and error propagation, ensuring swift test exercises both JSON and capture flows.", + "source_line": null + }, + { + "type": "invariant", + "description": "The environment remains swappable for tests via ISOInspectorCommandContext.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Lift option parsing and default-path logic from legacy runner into reusable helpers or directly into Commands.Export, adapting to async execution while avoiding duplicated semaphore patterns.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse ParseTreeBuilder, JSONParseTreeExporter, and ParseEventCaptureEncoder to build outputs, wiring them through ISOInspectorCommandContext.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update CLI help text and DocC command reference once export subcommand is functional, aligning documentation with PRD requirements.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorCLI export subcommand", + "description": "Streams parse events through ISOInspectorCLIEnvironment.parsePipeline and writes JSON or binary capture artifacts based on target media path and optional output overrides.", + "source_line": null + }, + { + "name": "Option parsing helper for export", + "description": "Parses command-line options, applies default-path logic from legacy runner, and validates writability of output paths.", + "source_line": null + }, + { + "name": "ParseTreeBuilder integration", + "description": "Builds parse trees from streamed events during export operation.", + "source_line": null + }, + { + "name": "JSONParseTreeExporter usage", + "description": "Exports built parse trees to JSON files (.isoinspector.json) when requested.", + "source_line": null + }, + { + "name": "ParseEventCaptureEncoder usage", + "description": "Encodes streamed parse events into binary capture files (.capture) when requested.", + "source_line": null + }, + { + "name": "ISOInspectorCommandContext wiring", + "description": "Provides a swappable environment for export command, enabling testability and dependency injection.", + "source_line": null + }, + { + "name": "Export success/error messaging", + "description": "Emits consistent success or error messages for export operation, mirroring other subcommands.", + "source_line": null + }, + { + "name": "End-to-end export tests", + "description": "Unit and integration tests covering JSON and capture flows, including success cases and error propagation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3458, + "line_count": 40 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ec87b324 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/Summary_of_Work.md", + "n_spec": 4, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a command-line interface for exporting data in JSON format and binary capture format via the isoinspector export subcommands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The export json and export capture subcommands must be wired through ISOInspectorCLIEnvironment.parsePipeline and use shared exporters.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Default output paths, custom destinations, and failure propagation should behave like the legacy runner.", + "source_line": null + }, + { + "type": "invariant", + "description": "Export operations must always route through the shared streaming capture utilities to produce JSON trees and binary captures using the modern pipeline.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorCLI export json command", + "description": "Exports data as a JSON tree using the shared streaming capture utilities", + "source_line": null + }, + { + "name": "ISOInspectorCLI export capture command", + "description": "Exports binary captures via the shared streaming capture utilities", + "source_line": null + }, + { + "name": "ArgumentParser subcommands for export operations", + "description": "Provides CLI subcommands to invoke export functionalities and parse pipelines", + "source_line": null + }, + { + "name": "Default output path handling", + "description": "Determines default destination paths for export outputs when none are specified", + "source_line": null + }, + { + "name": "Custom destination handling", + "description": "Allows users to specify custom file destinations for export outputs", + "source_line": null + }, + { + "name": "Error propagation in export commands", + "description": "Propagates failures from legacy runner to new streaming pipeline and reports errors", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 828, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/next_tasks_metrics.json new file mode 100644 index 00000000..356ea5e7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/46_D3_Route_Streaming_Export_Operations/next_tasks.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add macOS SwiftUI automation for streaming selection defaults once the XCTest UI hooks land, ensuring the tree/detail panes update end-to-end during live parses.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The tree/detail panes must update end-to-end during live parses after adding macOS SwiftUI automation for streaming selection defaults.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics on a platform that ships Combine, keeping throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Latency metrics must be captured and throughput parity maintained between macOS UI benchmark and CLI harness.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface global logging and telemetry toggles once streaming metrics are exposed to the CLI.", + "source_line": null + }, + { + "type": "user_story", + "description": "Route export operations to streaming capture utilities as they migrate from ISOInspectorCLIRunner.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "macOS SwiftUI automation for streaming selection defaults", + "description": "Automates the default selection of streaming options in the macOS SwiftUI UI and updates tree/detail panes during live parses", + "source_line": null + }, + { + "name": "Combine-backed UI benchmark on macOS", + "description": "Executes a benchmark to capture latency metrics for Combine-based UI while maintaining CLI throughput parity", + "source_line": null + }, + { + "name": "Global logging and telemetry toggles for CLI streaming", + "description": "Provides global controls to enable or disable logging and telemetry when streaming metrics are exposed in the CLI", + "source_line": null + }, + { + "name": "Routing export operations to streaming capture utilities", + "description": "Redirects export operations from ISOInspectorCLIRunner to new streaming capture utilities", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 953, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/47_Combine_UI_Benchmark_macOS_metrics.json b/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/47_Combine_UI_Benchmark_macOS_metrics.json new file mode 100644 index 00000000..dad37a10 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/47_Combine_UI_Benchmark_macOS_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/47_Combine_UI_Benchmark_macOS.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Capture baseline latency and throughput metrics from the SwiftUI streaming bridge on a macOS system that ships Combine to confirm UI meets PRD latency budget and matches CLI benchmark results.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run LargeFileBenchmarkTests.testAppEventBridgeDeliversUpdatesWithinLatencyBudget on a macOS host with Combine available and record measured latency/CPU/memory samples.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document captured measurements alongside CLI benchmark results, highlighting whether they satisfy PerformanceBenchmarkConfiguration budgets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "File issues or TODO updates if the benchmark exceeds limits; otherwise publish findings in performance tracking log.", + "source_line": null + }, + { + "type": "invariant", + "description": "Large temporary fixtures generated by LargeFileBenchmarkFixture must have sufficient disk space and be cleaned up after runs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Xcode or xcodebuild test on macOS so Combine-specific test is compiled and executed instead of skipped behind #if canImport(Combine) guards.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Run Combine-backed UI Benchmark", + "description": "Execute the LargeFileBenchmarkTests.testAppEventBridgeDeliversUpdatesWithinLatencyBudget test on a macOS host to capture latency, CPU, and memory metrics for SwiftUI streaming bridge.", + "source_line": null + }, + { + "name": "Generate Large File Fixtures", + "description": "Create large temporary MP4 fixtures using LargeFileBenchmarkFixture with sufficient disk space for benchmark runs.", + "source_line": null + }, + { + "name": "Clean Up Temporary Fixtures", + "description": "Remove generated large file fixtures after benchmark execution to free disk space.", + "source_line": null + }, + { + "name": "Record and Document Metrics", + "description": "Store measured latency, CPU, memory samples and compare them against PerformanceBenchmarkConfiguration budgets, documenting results.", + "source_line": null + }, + { + "name": "Publish Findings", + "description": "Log the benchmark results in the performance tracking log if within budget; otherwise file issues or TODO updates.", + "source_line": null + }, + { + "name": "Compile Test with Combine Enabled", + "description": "Use Xcode or xcodebuild on macOS to compile and run the test, ensuring #if canImport(Combine) guards allow execution.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2868, + "line_count": 62 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/Summary_of_Work_metrics.json new file mode 100644 index 00000000..8b4f44a7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/Summary_of_Work_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/Summary_of_Work.md", + "n_spec": 6, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run the Combine-backed UI benchmark on macOS to collect latency, CPU, and memory metrics for the SwiftUI event bridge.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must be executed on macOS hardware with Xcode 14 or newer.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Collected measurements should be archived alongside CLI throughput baselines for comparison against PerformanceBenchmarkConfiguration budgets.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use XCTest to run the benchmark, but skip scenarios where Combine is unavailable (e.g., Linux CI container).", + "source_line": null + }, + { + "type": "invariant", + "description": "The benchmark test LargeFileBenchmarkTests.testAppEventBridgeDeliversUpdatesWithinLatencyBudget should report XCTSkip when Combine is not available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface the Linux skip status in CI dashboards or alerts to highlight macOS coverage gaps until a native runner is wired up.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1125, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/next_tasks_metrics.json new file mode 100644 index 00000000..55f95c98 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/47_Combine_UI_Benchmark_macOS/next_tasks.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add macOS SwiftUI automation for streaming selection defaults to ensure tree/detail panes update end-to-end during live parses.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The UI hooks must land and the automation must verify that tree/detail panes update correctly during live parsing.", + "source_line": null + }, + { + "type": "invariant", + "description": "Throughput parity with the CLI harness must be maintained when executing Combine-backed UI benchmark on macOS.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics on a platform that ships Combine.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The benchmark must run on macOS hardware and produce latency metrics while keeping throughput parity with CLI harness.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface global logging and telemetry toggles once streaming metrics are exposed to the CLI.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "macOS SwiftUI Automation for Streaming Selection Defaults", + "description": "Automates the selection defaults in the streaming UI on macOS using XCTest UI hooks to ensure tree/detail panes update end-to-end during live parses.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark on macOS", + "description": "Executes a benchmark that measures latency metrics for the Combine-based UI on macOS, maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "name": "Global Logging and Telemetry Toggles for CLI Streaming", + "description": "Provides global toggles to enable or disable logging and telemetry when streaming metrics are exposed through the command-line interface.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1096, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection_metrics.json b/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection_metrics.json new file mode 100644 index 00000000..38805cab --- /dev/null +++ b/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md", + "n_spec": 11, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automate a macOS SwiftUI UI test that opens a streaming parse session and verifies the tree and detail panes update with the default selection when live events arrive.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The test must open a representative media file, confirm the outline view selects and displays the first node without manual interaction during streaming events.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The detail pane must reflect the selected node\u2019s metadata, demonstrating tree/detail synchronization during the automated run.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The test is integrated into the existing test suite and is conditionally compiled or skipped on platforms without SwiftUI UI automation support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in next_tasks.md, the execution workplan, and backlog PRD references are updated to show this task is in progress.", + "source_line": null + }, + { + "type": "invariant", + "description": "The ParseTreeExplorerView must auto-select the first node when snapshots update.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseTreeExplorerView with a dependency-injectable initializer so automation can observe existing outline and detail view models while reusing production wiring.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing fixture media and streaming test harnesses from ISOInspectorAppTests; extend them to drive SwiftUI UI actions via the new XCTest interfaces.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with accessibility identifier conventions (NestedA11yIDs) to reliably locate tree rows and detail views during automation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Handle asynchronous event delivery by waiting on published snapshots or notifications before asserting selection state.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Capture platform constraints (e.g., requiring macOS 13+ or skipping on Linux) in test annotations and documentation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "macOS-only XCTest UI scenario that opens a media file, drives streaming parse events, and asserts default selection and detail pane synchronization in ParseTreeExplorerView", + "source_line": null + }, + { + "name": "ParseTreeExplorerView dependency-injectable initializer", + "description": "Allows injection of outline and detail view models for testing while reusing production wiring", + "source_line": null + }, + { + "name": "XCTest SwiftUI UI hooks integration", + "description": "Provides XCTest-based UI actions to drive SwiftUI components such as tree rows and detail views via accessibility identifiers", + "source_line": null + }, + { + "name": "Streaming ParsePipeline stub harness", + "description": "Simulates streaming parse events for automated tests, feeding snapshots into the view models", + "source_line": null + }, + { + "name": "Accessibility identifier coordination (NestedA11yIDs)", + "description": "Convention for locating tree rows and detail views during automation", + "source_line": null + }, + { + "name": "Conditional compilation / skip logic for platform constraints", + "description": "Ensures tests run only on supported macOS versions or are skipped on unsupported platforms", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3182, + "line_count": 83 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1da4d47e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide automated UI tests for macOS streaming of parse tree selection events in ParseTreeExplorerView", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseTreeExplorerView to accept preconstructed outline/detail view models via a new initializer, enabling test observation of production state wiring without duplicating logic", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests must assert that the outline and detail panes synchronize around the default selection during live updates", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automation coverage should be reflected in status trackers and documentation files (DOCS/INPROGRESS/next_tasks.md, DOCS/AI/ISOInspector_Execution_Guide/04_TODO_Workplan.md, DOCS/AI/ISOViewer/ISOInspector_PRD_TODO.md)", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "Automated test suite that streams parse events and verifies synchronization of outline/detail panes during live updates", + "source_line": null + }, + { + "name": "ParseTreeExplorerView initializer with preconstructed view models", + "description": "Allows creation of ParseTreeExplorerView using existing outline and detail view models for testing production state wiring", + "source_line": null + }, + { + "name": "Status tracker updates", + "description": "Documentation and task notes reflecting new automation coverage", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 980, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/next_tasks_metrics.json new file mode 100644 index 00000000..e2a9b7c4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/next_tasks_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/next_tasks.md", + "n_spec": 5, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Add macOS SwiftUI automation for streaming selection defaults to ensure tree/detail panes update end-to-end during live parses.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verify default selection and detail synchronization during a streaming parse run using ParseTreeStreamingSelectionAutomationTests in the app test suite.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "invariant", + "description": "Combine must be available on the platform for the benchmark to run; XCTest skips scenarios on Linux where Combine is unavailable.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface global logging and telemetry toggles once streaming metrics are exposed to the CLI.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "macOS SwiftUI automation for streaming selection defaults", + "description": "Automates default selection in the ParseTreeExplorerView during live parses and verifies UI updates end-to-end", + "source_line": null + }, + { + "name": "ParseTreeStreamingSelectionAutomationTests test suite", + "description": "Test suite that hosts ParseTreeExplorerView and checks default selection and detail synchronization during a streaming parse run", + "source_line": null + }, + { + "name": "Combine-backed UI benchmark on macOS", + "description": "Captures latency metrics for the Combine-based UI while maintaining throughput parity with the CLI harness", + "source_line": null + }, + { + "name": "Global logging and telemetry toggles for CLI streaming", + "description": "Provides global controls to enable or disable logging and telemetry when streaming metrics are exposed to the command-line interface", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1264, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/48_macOS_SwiftUI_Automation_Streaming_Default_Selection_metrics.json b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/48_macOS_SwiftUI_Automation_Streaming_Default_Selection_metrics.json new file mode 100644 index 00000000..e8c31032 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/48_macOS_SwiftUI_Automation_Streaming_Default_Selection_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md", + "n_spec": 8, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Automated macOS SwiftUI UI test that opens a streaming parse session and verifies the tree and detail panes update with the default selection when live events arrive.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test opens representative media file and confirms outline view selects and displays first node without manual interaction during streaming events.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Detail pane reflects selected node\u2019s metadata, demonstrating tree/detail synchronization during automated run.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test integrated into existing test suite and conditionally compiled or skipped on platforms without SwiftUI UI automation support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in next_tasks.md, execution workplan, and backlog PRD references updated to show task is in progress.", + "source_line": null + }, + { + "type": "invariant", + "description": "Automation must gracefully handle asynchronous event delivery by waiting on published snapshots or notifications before asserting selection state.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ParseTreeExplorerView with dependency-injectable initializer so automation can observe existing outline and detail view models while reusing production wiring.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing fixture media and streaming test harnesses from ISOInspectorAppTests; extend them to drive SwiftUI UI actions via new XCTest interfaces.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeExplorerView", + "description": "SwiftUI view that displays a parse tree outline and detail pane, auto-selects first node on snapshot updates", + "source_line": null + }, + { + "name": "ParseTreeOutlineViewModel", + "description": "View model exposing helpers for default selection checks in the parse tree outline", + "source_line": null + }, + { + "name": "XCTest UI Hooks for SwiftUI", + "description": "Framework to drive SwiftUI UI actions and assertions during automated tests", + "source_line": null + }, + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "macOS-only XCTest suite that opens a media file, drives streaming parse events, and verifies default node selection and detail pane synchronization", + "source_line": null + }, + { + "name": "NSWindow Hosting of ParseTreeExplorerView", + "description": "Test setup that hosts the view in an NSWindow for UI automation", + "source_line": null + }, + { + "name": "Dependency-injectable initializer for ParseTreeExplorerView", + "description": "Allows injection of outline and detail view models for testing while reusing production wiring", + "source_line": null + }, + { + "name": "Streaming ParsePipeline Stub", + "description": "Stubbed parse pipeline used to feed streaming events into the test harness", + "source_line": null + }, + { + "name": "Accessibility Identifier Conventions (NestedA11yIDs)", + "description": "Naming scheme used to locate tree rows and detail views during automation", + "source_line": null + }, + { + "name": "Conditional Compilation / Skipping Logic for Non-macOS Platforms", + "description": "Test annotations that skip or compile tests only on supported platforms", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3191, + "line_count": 92 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/49_CLI_Global_Logging_and_Telemetry_Toggles_metrics.json b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/49_CLI_Global_Logging_and_Telemetry_Toggles_metrics.json new file mode 100644 index 00000000..fdaf6b3f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/49_CLI_Global_Logging_and_Telemetry_Toggles_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/49_CLI_Global_Logging_and_Telemetry_Toggles.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide global CLI flags to control console logging verbosity and enable/disable telemetry metrics during ISOInspector command execution.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Global flags --quiet/--verbose and --enable-telemetry/--disable-telemetry compile into the CLI and appear in autogenerated help output.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Selected options flow into command context/environment so subcommands can adjust console printing and telemetry emission accordingly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit or integration tests verify that toggling verbosity changes CLI output and telemetry piping honors opt-in/out controls.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation across CLI README/help and task trackers notes the availability of the new flags.", + "source_line": null + }, + { + "type": "invariant", + "description": "Defaults maintain existing behavior: standard logging enabled, telemetry enabled to keep CI smoke tests stable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ISOInspectorCommand.GlobalOptions with strongly typed properties for verbosity and telemetry mode, mapping to enum cases for clarity.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Propagate parsed options through ISOInspectorCommand.bootstrap into ISOInspectorCommandContext so environment can configure EventConsoleFormatter, logging sinks, and telemetry publishers before executing subcommands.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update ISOInspectorCLIEnvironment with explicit logVerbosity and telemetryEnabled properties for downstream consumers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Global Logging Verbosity Flag", + "description": "CLI flag to set console logging level (quiet or verbose) for all commands", + "source_line": null + }, + { + "name": "Global Telemetry Toggle Flag", + "description": "CLI flag to enable or disable streaming telemetry metrics during CLI runs", + "source_line": null + }, + { + "name": "ISOInspectorCommand.GlobalOptions Extension", + "description": "Data structure holding strongly typed verbosity and telemetry mode options parsed from the command line", + "source_line": null + }, + { + "name": "ISOInspectorCommand.bootstrap Propagation", + "description": "Logic that translates global flags into environment configuration before subcommand execution", + "source_line": null + }, + { + "name": "ISOInspectorCLIEnvironment Configuration", + "description": "Runtime environment object exposing logVerbosity and telemetryEnabled properties for subcommands", + "source_line": null + }, + { + "name": "EventConsoleFormatter Adjustment", + "description": "Component that formats console output based on verbosity mode (muting or prefixing)", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3806, + "line_count": 64 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1dcc6b0f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide automated parse tree streaming tests for ParseTreeExplorerView on macOS", + "source_line": null + }, + { + "type": "user_story", + "description": "Allow ParseTreeExplorerView to be initialized with preconstructed outline/detail view models for testing production state wiring", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStreamingSelectionAutomationTests must assert that the outline and detail panes stay synchronized around the default selection during live updates", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI logging and telemetry toggles (--quiet/--verbose, enable/disable flags) must propagate into ISOInspectorCLIEnvironment and ISOInspectorCommandContext", + "source_line": null + }, + { + "type": "invariant", + "description": "Global CLI logging and telemetry options must always be available across all command contexts", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a global CLI logging and telemetry toggle system that propagates options to environment and context objects", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "Automated tests that host ParseTreeExplorerView, stream parse events, and assert synchronization of outline/detail panes during live updates", + "source_line": null + }, + { + "name": "ParseTreeExplorerView initializer with preconstructed view models", + "description": "Allows creation of ParseTreeExplorerView using existing outline and detail view models for testing production state wiring", + "source_line": null + }, + { + "name": "Global CLI logging toggle (--quiet/--verbose)", + "description": "Command-line interface option to control verbosity of logs globally", + "source_line": null + }, + { + "name": "Telemetry enable/disable flag", + "description": "CLI flag to turn telemetry on or off, propagated into ISOInspectorCLIEnvironment and ISOInspectorCommandContext", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1195, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/next_tasks_metrics.json new file mode 100644 index 00000000..1c35ae11 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/next_tasks_metrics.json @@ -0,0 +1,43 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/49_CLI_Global_Logging_and_Telemetry_Toggles/next_tasks.md", + "n_spec": 3, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics on a platform that ships Combine, keeping throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "invariant", + "description": "XCTest skips the scenario on Linux because Combine is unavailable; therefore the benchmark must be run on macOS hardware.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests Execution", + "description": "Runs the ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark Execution", + "description": "Executes a Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "name": "Global Logging and Telemetry Toggles for CLI Streaming", + "description": "Provides global logging and telemetry toggles exposed to the CLI once streaming metrics are available.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1147, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/50_Combine_UI_Benchmark_macOS_Run_metrics.json b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/50_Combine_UI_Benchmark_macOS_Run_metrics.json new file mode 100644 index 00000000..3fa55ac4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/50_Combine_UI_Benchmark_macOS_Run_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/50_Combine_UI_Benchmark_macOS_Run.md", + "n_spec": 8, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Capture end-to-end latency, CPU, and memory metrics from the SwiftUI streaming bridge on real macOS hardware to confirm UI meets PRD latency budget and aligns with CLI benchmark baselines.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run the Combine-gated benchmark on macOS (Xcode or xcodebuild test) and capture latency, CPU, and memory metrics for the streaming UI bridge.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Compare collected numbers against configured performance budgets and record findings in performance tracking log or raise follow-up issues if limits are exceeded.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update backlog/workplan entries with captured results so QA task can transition out of \"In Progress.\"", + "source_line": null + }, + { + "type": "invariant", + "description": "The master PRD mandates streaming UI updates stay under the 200\u202fms latency ceiling while handling large MP4 inputs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a macOS runner with Combine SDK; ensure #if canImport(Combine) paths compile and execute.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Allocate sufficient disk space for temporary large-file fixtures created by LargeFileBenchmarkFixture, and clean them up after the run.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Keep CLI benchmark results available for parity comparison and document any configuration adjustments required by macOS environment.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Combine-Backed UI Benchmark Execution", + "description": "Run the Combine-gated benchmark on macOS using Xcode or xcodebuild test to capture latency, CPU, and memory metrics for the streaming UI bridge.", + "source_line": null + }, + { + "name": "Latency Measurement Capture", + "description": "Measure end-to-end latency of SwiftUI streaming bridge updates during benchmark execution.", + "source_line": null + }, + { + "name": "CPU Usage Monitoring", + "description": "Record CPU utilization metrics while running the Combine-Backed UI Benchmark on macOS.", + "source_line": null + }, + { + "name": "Memory Consumption Tracking", + "description": "Track memory usage metrics for the streaming UI bridge during benchmark runs.", + "source_line": null + }, + { + "name": "Performance Budget Comparison", + "description": "Compare collected latency, CPU, and memory numbers against configured performance budgets and log findings or raise issues if limits are exceeded.", + "source_line": null + }, + { + "name": "Result Logging", + "description": "Record benchmark results in the performance tracking log.", + "source_line": null + }, + { + "name": "Backlog Update", + "description": "Update backlog/workplan entries with captured results to transition QA task out of \"In Progress.\"", + "source_line": null + }, + { + "name": "Large File Fixture Management", + "description": "Allocate disk space for temporary large-file fixtures created by LargeFileBenchmarkFixture and clean them up after the run.", + "source_line": null + }, + { + "name": "Combine SDK Compatibility Check", + "description": "Ensure #if canImport(Combine) paths compile and execute on macOS runner with Combine SDK.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2594, + "line_count": 53 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/51_ParseTreeStreamingSelectionAutomation_macOS_Run_metrics.json b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/51_ParseTreeStreamingSelectionAutomation_macOS_Run_metrics.json new file mode 100644 index 00000000..1dd0b16f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/51_ParseTreeStreamingSelectionAutomation_macOS_Run_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/51_ParseTreeStreamingSelectionAutomation_macOS_Run.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute the ParseTreeStreamingSelectionAutomationTests suite on macOS hardware to validate end-to-end SwiftUI streaming selection flow and capture evidence of stable automation outside Linux container.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStreamingSelectionAutomationTests executes on macOS with UI automation enabled and reports success.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Resulting logs/screenshots are archived for future regression comparison and attached to the task record.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Any macOS-specific issues discovered are filed with actionable follow-up items or patches.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation (next_tasks.md, backlog, automation notes) updated to reflect completion status.", + "source_line": null + }, + { + "type": "invariant", + "description": "The test is skipped on Linux because Combine and SwiftUI automation are unavailable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a macOS runner with XCTest UI entitlement; preferred invocation via xcodebuild test command targeting ParseTreeStreamingSelectionAutomationTests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure SwiftUI accessibility permissions granted to the test runner, pre-authorized in System Settings \u2192 Privacy & Security \u2192 Accessibility.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Capture and store DerivedData xcresult bundle for evidence; upload alongside a short execution summary in DOCS/TASK_ARCHIVE when complete.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "XCTest UI test suite that validates SwiftUI streaming selection flow on macOS", + "source_line": null + }, + { + "name": "macOS Runner Execution", + "description": "Running tests on a physical or CI-hosted macOS runner with XCTest UI entitlement", + "source_line": null + }, + { + "name": "SwiftUI Accessibility Permission Setup", + "description": "Pre-authorizing SwiftUI accessibility permissions in System Settings for automated UI testing", + "source_line": null + }, + { + "name": "DerivedData xcresult Capture", + "description": "Capturing and storing the DerivedData xcresult bundle as evidence of test execution", + "source_line": null + }, + { + "name": "Artifact Archival", + "description": "Uploading execution summary and xcresult bundle to DOCS/TASK_ARCHIVE for regression comparison", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2947, + "line_count": 54 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/Summary_of_Work_metrics.json new file mode 100644 index 00000000..eb620908 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The benchmark harness requires macOS-only Combine frameworks and Xcode tooling.", + "source_line": null + }, + { + "type": "invariant", + "description": "XCTest UI + SwiftUI accessibility permissions are unavailable in the container.", + "source_line": null + }, + { + "type": "user_story", + "description": "Secure macOS hardware or CI capacity capable of running both the Combine benchmark and the SwiftUI automation suite.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Once hardware access is confirmed, execute the pending scenarios, archive the resulting metrics or xcresult bundles, and update the relevant task archives and backlog entries.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1020, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/next_tasks_metrics.json new file mode 100644 index 00000000..4bd71534 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/next_tasks.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ParseTreeStreamingSelectionAutomationTests must pass on macOS hardware with XCTest UI support, confirming the SwiftUI automation flow works end-to-end.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Combine-backed UI benchmark must run on macOS and produce latency metrics that match throughput parity with the CLI harness.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1049, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/task_summary_metrics.json b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/task_summary_metrics.json new file mode 100644 index 00000000..3e21e17c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/task_summary_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/50_Summary_of_Work_2025-02-16/task_summary.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "ParseTreeStore Error Handling", + "description": "Handles parse tree storage failures by including localized and descriptive error messages for UI exposure.", + "source_line": null + }, + { + "name": "ParseTreeStreamingSelectionAutomationTests Deduplication", + "description": "Deduplicates detail emissions during streaming UI updates to prevent over-fulfilling test expectations.", + "source_line": null + }, + { + "name": "DocumentSessionController Main-Thread Shortcuts", + "description": "Provides main-thread shortcuts in document session control, awaiting parse completion to avoid race conditions with recents bookkeeping.", + "source_line": null + }, + { + "name": "Outline View Model Collapse State Persistence", + "description": "Respects manual collapse state across rebuilds and aligns accessibility severity strings with formatter expectations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 700, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/51_D4_CLI_Batch_Mode_metrics.json b/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/51_D4_CLI_Batch_Mode_metrics.json new file mode 100644 index 00000000..256bc852 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/51_D4_CLI_Batch_Mode_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/51_D4_CLI_Batch_Mode.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a user, I want to run isoinspector in batch mode so that I can analyze multiple media files in a single invocation and receive an aggregated summary.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI accepts multiple input files via paths, directory globs, or explicit lists and processes them sequentially using the existing streaming pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The consolidated summary table includes per-file path, size, parse/validation status, box counts, and aggregates that match product requirements.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CSV export flag writes the aggregated table to disk with headers so CI systems can consume the batch results, while textual summary mirrors CSV content.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Exit code reflects aggregate success/failure: any failed parse or validation yields a non-zero exit status suitable for CI gating.", + "source_line": null + }, + { + "type": "invariant", + "description": "Result accumulator type must collect per-file metrics and produce both console table and CSV rows, aligning with FR-CLI-002 expectations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse Task D2 command plumbing for inspect/validate to minimize duplication; introduce a dedicated batch subcommand or flag (e.g., validate --batch --report summary.csv).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Batch CLI Subcommand", + "description": "Command to invoke ISOInspector in batch mode accepting multiple files via paths, globs or lists", + "source_line": null + }, + { + "name": "Aggregated Summary Table Output", + "description": "Console table summarizing per-file metrics and overall aggregates", + "source_line": null + }, + { + "name": "CSV Export Flag", + "description": "Option to write the aggregated summary to a CSV file with headers for CI consumption", + "source_line": null + }, + { + "name": "Result Accumulator", + "description": "Internal type that collects per-file metrics, produces console rows and CSV rows, and supports future extensions", + "source_line": null + }, + { + "name": "Exit Code Logic", + "description": "Batch exit status reflects aggregate success/failure based on parse/validation results", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2741, + "line_count": 51 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/Summary_of_Work_metrics.json new file mode 100644 index 00000000..138785e7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/Summary_of_Work.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a CLI batch mode that allows users to validate multiple files at once and receive aggregated status tables.", + "source_line": null + }, + { + "type": "user_story", + "description": "Export validation results from the batch command as CSV payloads for CI integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The batch command must emit deterministic ordering of summary rows in the console output.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CSV output must be generated with a correct total row and consistent formatting.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Exit codes from the batch command should reflect aggregated results (CI-friendly).", + "source_line": null + }, + { + "type": "invariant", + "description": "Unmatched glob patterns must not halt the process; diagnostics are printed but continue processing other resolved files.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "isoinspect batch subcommand", + "description": "CLI command that accepts a list of files (or glob patterns), streams validation for each file, and outputs aggregated status tables with CI-friendly exit codes.", + "source_line": null + }, + { + "name": "BatchValidationSummary utilities", + "description": "Functions to render aligned console summaries and CSV payloads for batch validation results, ensuring deterministic ordering and totals.", + "source_line": null + }, + { + "name": "CSV summary export feature", + "description": "Generates CSV files containing aggregated validation results from batch runs.", + "source_line": null + }, + { + "name": "CI-friendly exit code handling", + "description": "Exits with appropriate status codes based on aggregate validation outcomes for continuous integration pipelines.", + "source_line": null + }, + { + "name": "DocC command reference updates", + "description": "Documentation that includes both single-file and batch validation workflows in the command reference.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 897, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/next_tasks_metrics.json new file mode 100644 index 00000000..371ef0c4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/51_D4_CLI_Batch_Mode/next_tasks.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement CLI batch mode and CSV summary export for Task D4", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Task D4 must be completed after Task D2 is finished and ready for batch orchestration work", + "source_line": null + }, + { + "type": "invariant", + "description": "CLI batch mode and CSV summary export functionality should not depend on incomplete tasks other than Task D2", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Batch orchestration will be handled separately from the CLI batch mode implementation", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1322, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/E3_Session_Persistence_metrics.json b/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/E3_Session_Persistence_metrics.json new file mode 100644 index 00000000..1ab2b0c9 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/E3_Session_Persistence_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/52_E3_Session_Persistence/E3_Session_Persistence.md", + "n_spec": 11, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Restore the previous workspace on launch by persisting open documents, annotation/bookmark state, and window layouts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Launching the app after a clean quit restores the previously open files, selected nodes, window positions, and any unsaved annotation edits without data loss.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automatic CoreData migration upgrades existing annotation/bookmark stores to the new schema without requiring manual recovery steps.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Linux/CLI builds continue to operate with a JSON fallback when CoreData is unavailable while keeping schema metadata in sync.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New tests verify migration, workspace restoration, and fallback behaviors across macOS and non-CoreData environments.", + "source_line": null + }, + { + "type": "invariant", + "description": "CoreData lightweight migration paths must remain enabled for the extended model.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the CoreData model to include Workspace, Session, SessionFile, WindowLayout, and related entities while keeping lightweight migration paths enabled.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update CoreDataAnnotationBookmarkStore to surface session APIs that coordinate with existing annotation operations and maintain thread-safety on the background context.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement WorkspaceSessionSnapshot models with CoreData-backed session storage and a JSON fallback, wiring restoration through DocumentSessionController so the last workspace reopens automatically.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "DocumentSessionController observes bookmark session selection changes to keep workspace snapshots current after navigation without reopening files.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Persist parse snapshots or reference external artifacts judiciously to avoid bloating CoreData store, following open questions captured during planning.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CoreData Annotation Bookmark Store Session APIs", + "description": "Provides thread\u2011safe session persistence operations for annotations and bookmarks using CoreData", + "source_line": null + }, + { + "name": "WorkspaceSessionSnapshot Models", + "description": "Defines CoreData backed workspace snapshot entities (Workspace, Session, SessionFile, WindowLayout) with JSON fallback support", + "source_line": null + }, + { + "name": "DocumentSessionController", + "description": "Observes bookmark selection changes and restores the last workspace on app launch, coordinating with session snapshots", + "source_line": null + }, + { + "name": "WorkspaceSessionStore", + "description": "Manages storage and retrieval of workspace sessions, handling migration and JSON fallback", + "source_line": null + }, + { + "name": "Automatic CoreData Migration Path", + "description": "Performs lightweight migrations for annotation/bookmark stores to new schema without user intervention", + "source_line": null + }, + { + "name": "JSON Fallback Persistence", + "description": "Provides a JSON\u2011based persistence mechanism when CoreData is unavailable (e.g., Linux/CLI builds) while keeping metadata in sync", + "source_line": null + }, + { + "name": "Session Restoration Workflow", + "description": "Restores previously open files, selected nodes, window positions and unsaved annotation edits on launch", + "source_line": null + }, + { + "name": "Diagnostics for Session Persistence Errors", + "description": "Surface errors related to session persistence in diagnostics logs", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4611, + "line_count": 78 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/Summary_of_Work_metrics.json new file mode 100644 index 00000000..4bca9f7d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/Summary_of_Work_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/52_E3_Session_Persistence/Summary_of_Work.md", + "n_spec": 7, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Persist workspace sessions alongside annotations in CoreData", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide shared WorkspaceSessionSnapshot models with JSON-backed fallback store and automatic restoration/persistence via DocumentSessionController", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture latest focused node in workspace snapshots without reopening files by subscribing to bookmark selection changes", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CoreData migration, file-backed persistence, and controller restoration flows must be covered by regression tests", + "source_line": null + }, + { + "type": "invariant", + "description": "Workspace session data should always be consistent with CoreData annotations", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use JSON-backed fallback store for WorkspaceSessionSnapshot models", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate automatic restoration/persistence through DocumentSessionController", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CoreData Annotation Bookmark Store Persistence", + "description": "Extends CoreData schema to persist workspace sessions, annotations, and related entities, providing restoration APIs.", + "source_line": null + }, + { + "name": "Workspace Session Snapshot Model", + "description": "Shared model representing a workspace session snapshot with JSON-backed fallback storage.", + "source_line": null + }, + { + "name": "Document Session Controller", + "description": "Manages automatic persistence and restoration of document sessions, subscribing to bookmark selection changes to capture focused nodes.", + "source_line": null + }, + { + "name": "Session Restoration API", + "description": "APIs that restore persisted workspace sessions from CoreData or JSON store.", + "source_line": null + }, + { + "name": "Bookmark Selection Persistence", + "description": "Captures the latest focused node in a session without reopening files by listening to bookmark selection changes.", + "source_line": null + }, + { + "name": "CoreData Migration Regression Tests", + "description": "Tests covering CoreData migration, file-backed persistence, and controller restoration flows.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1903, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/next_tasks_metrics.json new file mode 100644 index 00000000..a83f81de --- /dev/null +++ b/DOCS/TASK_ARCHIVE/52_E3_Session_Persistence/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/52_E3_Session_Persistence/next_tasks.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement session persistence so the app restores open documents, annotations, and layouts on relaunch.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session persistence must restore all open documents, annotations, and layout configurations when the application is relaunched.", + "source_line": null + }, + { + "type": "invariant", + "description": "The system must always maintain a consistent state of open documents, annotations, and layout settings across sessions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use session persistence (Task E3) to manage restoration logic, as documented in DOCS/INPROGRESS/E3_Session_Persistence.md.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1330, + "line_count": 14 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/F3_Developer_Onboarding_Guide_metrics.json b/DOCS/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/F3_Developer_Onboarding_Guide_metrics.json new file mode 100644 index 00000000..426e4191 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/F3_Developer_Onboarding_Guide_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/F3_Developer_Onboarding_Guide.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Create comprehensive onboarding materials that help new contributors set up the ISOInspector workspace, run the full SwiftPM test suite, and understand core architecture boundaries alongside an API reference outline for ISOInspectorKit and the UI surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Step-by-step setup guide covering toolchains, repository bootstrap, and SwiftPM workflows validated on supported Apple platforms.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Clear explanation of package targets (core parser, UI, CLI, app) with diagrams or tables linking to DocC catalogs and relevant tests.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "API reference outline describing primary entry points (parsers, validation, exporters, UI stores) and where detailed DocC articles live or need to be authored.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Contribution checklist documenting coding standards, test expectations, and documentation update requirements in line with XP workflow guidance.", + "source_line": null + }, + { + "type": "invariant", + "description": "Documentation must align with established TDD and CI practices as per XP workflow rules.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Leverage existing DocC catalogs and archived task notes for authoritative descriptions of modules and workflows.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Highlight dependencies resolved by tasks A3, B6, and C3 to guide readers toward existing documentation assets and source code examples.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Capture environment prerequisites (Swift toolchain version, platform-specific requirements) and CI expectations so contributors can mirror release readiness locally.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Outline future DocC expansions or TODOs uncovered during documentation review to feed back into the backlog once this task is complete.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Developer Onboarding Guide", + "description": "Step-by-step setup guide covering toolchains, repository bootstrap, and SwiftPM workflows validated on supported Apple platforms.", + "source_line": null + }, + { + "name": "API Reference Outline", + "description": "Describes primary entry points (parsers, validation, exporters, UI stores) and links to DocC articles or notes where detailed docs live.", + "source_line": null + }, + { + "name": "Package Target Documentation", + "description": "Clear explanation of package targets (core parser, UI, CLI, app) with diagrams/tables linking to DocC catalogs and relevant tests.", + "source_line": null + }, + { + "name": "Contribution Checklist", + "description": "Documents coding standards, test expectations, and documentation update requirements aligned with XP workflow guidance.", + "source_line": null + }, + { + "name": "Environment Prerequisites Section", + "description": "Captures Swift toolchain version, platform-specific requirements, and CI expectations for local release readiness.", + "source_line": null + }, + { + "name": "Future DocC Expansion Notes", + "description": "Outlines future DocC expansions or TODOs to feed back into backlog after task completion.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2705, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/Summary_of_Work_metrics.json new file mode 100644 index 00000000..561bb9f1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/53_F3_Developer_Onboarding_Guide/Summary_of_Work.md", + "n_spec": 5, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a comprehensive onboarding guide for new developers covering toolchain setup, repository bootstrap, architecture boundaries, and API reference outlines for ISOInspectorKit, CLI, and app targets.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The onboarding guide must be authored and published in Docs/Guides/DeveloperOnboarding.md.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Getting Started guide must be refreshed to point newcomers at the onboarding manual and updated prerequisite versions to match the current toolchain baseline.", + "source_line": null + }, + { + "type": "invariant", + "description": "Task F3 is marked as complete across execution workplan and PRD trackers, indicating the published guide and archived task location.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The onboarding guide should remain synchronized with future DocC expansions and API changes, updating module outlines and contribution checklists as new surfaces ship.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Developer Onboarding Guide", + "description": "Provides comprehensive instructions for new developers covering toolchain setup, repository bootstrap, architecture boundaries, and API reference outlines for ISOInspectorKit, CLI, and app targets.", + "source_line": null + }, + { + "name": "Getting Started Guide Update", + "description": "Updates the high-level Getting Started guide to direct newcomers to the onboarding manual and align prerequisite versions with current toolchain baseline.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1293, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b4538168 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/Summary_of_Work_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/Summary_of_Work.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Maintain the Developer Onboarding Guide to reflect future API or DocC updates and link new tutorials or automation flows as they are released.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The onboarding guide must be updated whenever a new API or DocC update occurs, and it must include links to any newly created tutorials or automation flows.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 699, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/next_tasks_metrics.json new file mode 100644 index 00000000..778ce70c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/next_tasks_metrics.json @@ -0,0 +1,62 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/54_Summary_of_Work_2025-10-13/next_tasks.md", + "n_spec": 10, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware to validate end-to-end SwiftUI automation flow", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStreamingSelectionAutomationTests must pass successfully on macOS with XCTest UI support", + "source_line": null + }, + { + "type": "invariant", + "description": "macOS UI testing entitlements are required for running the tests; without them, the test cannot be executed", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with CLI harness", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Combine-backed UI benchmark must run successfully on macOS with Xcode/Combine and produce latency metrics", + "source_line": null + }, + { + "type": "invariant", + "description": "Benchmark requires a macOS runner with Xcode/Combine; without it, the benchmark cannot be executed", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface session persistence errors once diagnostics plumbing is available", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session persistence errors must be surfaced when diagnostics plumbing is enabled", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities according to defined reconciliation rules", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CoreData session bookmarks and live bookmark entities must match after applying reconciliation rules", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1743, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/2025-10-13-distribution-scaffolding_metrics.json b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/2025-10-13-distribution-scaffolding_metrics.json new file mode 100644 index 00000000..dbead588 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/2025-10-13-distribution-scaffolding_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/2025-10-13-distribution-scaffolding.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Ship initial distribution metadata, entitlements, and notarization tooling so the ISOInspector app bundle is ready for signed macOS/iOS builds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Public Kit API added/changed: DistributionMetadataLoader.defaultMetadata() decodes versioned configuration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Call sites updated: New XCTest DistributionMetadataTests ensures metadata loads under SwiftPM.", + "source_line": null + }, + { + "type": "invariant", + "description": "Backward compatibility: Additive resource and loader; no existing APIs modified.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DistributionMetadataLoader.defaultMetadata()", + "description": "Public API that decodes versioned distribution configuration metadata", + "source_line": null + }, + { + "name": "DistributionMetadata resource bundle", + "description": "Resource containing bundle IDs, versioning, and team identifier for distribution", + "source_line": null + }, + { + "name": "Distribution/Entitlements storage", + "description": "Directory storing platform-specific distribution entitlements used during build", + "source_line": null + }, + { + "name": "XCTest DistributionMetadataTests", + "description": "Test suite validating that distribution metadata loads correctly under Swift Package Manager", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1072, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/54_E4_Prepare_App_Distribution_Configuration_metrics.json b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/54_E4_Prepare_App_Distribution_Configuration_metrics.json new file mode 100644 index 00000000..3a1e8e4f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/54_E4_Prepare_App_Distribution_Configuration_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/54_E4_Prepare_App_Distribution_Configuration.md", + "n_spec": 12, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Define bundle identifiers and versioning metadata for macOS, iPadOS, and iOS targets to be referenced by CI build scripts.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create platform-specific entitlement plists enabling App Sandbox, security-scoped bookmarks, and automation/test allowances for each target.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement a notarization script that submits the app bundle to Apple\u2019s notarization service and supports dry-run execution for local validation.", + "source_line": null + }, + { + "type": "user_story", + "description": "Generate a Tuist Project.swift that imports shared distribution metadata, applies marketing/build versions, sets platform-specific bundle identifiers and entitlements, and produces Xcode projects for signing and upload.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bundle identifiers and versioning metadata must be recorded for macOS, iPadOS, and iOS targets and referenced by CI build scripts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "App sandbox entitlements must be finalized for file access, bookmark persistence, and optional automation hooks, with validation via signing tools.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Notarization pipeline must be exercised end-to-end (locally or via CI) to confirm the packaged app is accepted by Apple notarization services.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updates must summarize distribution settings and prerequisites for future automation tasks.", + "source_line": null + }, + { + "type": "invariant", + "description": "Distribution metadata resource (DistributionMetadata.json) must be versioned alongside the SwiftPM package code.", + "source_line": null + }, + { + "type": "invariant", + "description": "Entitlement files (.entitlements) per platform must cover sandbox, security-scoped bookmarks, and automation/test allowances.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use SwiftPM package structure to align Xcode project settings and avoid duplicated identifiers.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Generate release Xcode project with Tuist to codify distribution-critical build settings in versioned Project.swift.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DistributionMetadata.json", + "description": "Resource file recording bundle identifiers, marketing version, build number, and development team placeholder for CI scripts", + "source_line": null + }, + { + "name": "DistributionMetadataLoader", + "description": "Swift module that loads distribution metadata from Bundle.module during CI runs", + "source_line": null + }, + { + "name": "Platform-specific Entitlement Plists", + "description": "Entitlement files (.entitlements) for macOS, iOS, and iPadOS enabling App Sandbox, security-scoped bookmarks, and automation/test allowances", + "source_line": null + }, + { + "name": "notarize_app.sh Script", + "description": "Shell script that submits the app bundle to Apple notarization services using notarytool, supports dry-run, reads team identifier from metadata", + "source_line": null + }, + { + "name": "Tuist Project.swift", + "description": "Project definition that imports distribution metadata, sets marketing/build versions, bundle identifiers, and entitlements for generated Xcode projects", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 5240, + "line_count": 90 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..7ce8fb96 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/Summary_of_Work_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/Summary_of_Work.md", + "n_spec": 10, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a shared distribution metadata file (DistributionMetadata.json) that contains bundle IDs, marketing version, and build numbers for the app.", + "source_line": null + }, + { + "type": "user_story", + "description": "Expose an API to load distribution metadata within the application code.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The DistributionMetadataLoader must correctly parse DistributionMetadata.json and expose bundle ID, marketing version, and build number values.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests in ISOInspectorKitTests/DistributionMetadataTests.swift must pass for all supported platforms (macOS, iOS, iPadOS).", + "source_line": null + }, + { + "type": "user_story", + "description": "Add platform-specific entitlements files for macOS, iOS, and iPadOS to support notarization.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Entitlement files ISOInspectorApp.macOS.entitlements, ISOInspectorApp.iOS.entitlements, and ISOInspectorApp.iPadOS.entitlements must be present and correctly referenced in the build process.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide a notarization helper script that reads shared metadata and allows dry\u2011run submissions from Linux CI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The script scripts/notarize_app.sh must read DistributionMetadata.json, submit to Apple\u2019s notarization service (or simulate), and succeed in a dry\u2011run mode on a Linux environment.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Codify distribution settings (bundle identifiers, versioning, entitlements) in Project.swift so that generated Tuist projects inherit these properties automatically.", + "source_line": null + }, + { + "type": "invariant", + "description": "All generated Xcode projects must always use the bundle identifier and marketing/version numbers defined in DistributionMetadata.json.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Distribution Metadata Loader API", + "description": "Loads shared distribution metadata such as bundle IDs, marketing version, and build numbers from DistributionMetadata.json for use in builds", + "source_line": null + }, + { + "name": "Notarization Helper Script", + "description": "Script that reads shared metadata to perform dry-run submissions of notarized builds on Linux CI", + "source_line": null + }, + { + "name": "Platform Entitlements Configuration", + "description": "Entitlement files for macOS, iOS, and iPadOS defining app capabilities required for distribution", + "source_line": null + }, + { + "name": "Tuist Project Generation Settings", + "description": "Codified settings in Project.swift that generate Xcode projects with correct bundle identifiers, versioning, and entitlements", + "source_line": null + }, + { + "name": "Documentation of Distribution Workflow", + "description": "Guides and manuals outlining distribution metadata, entitlements, Tuist generation, and notarization flows for contributors", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2278, + "line_count": 41 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/next_tasks_metrics.json new file mode 100644 index 00000000..60762b46 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/55_E4_Prepare_App_Distribution_Configuration/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 2010, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/56_Tuist_Compatibility_Fixes_metrics.json b/DOCS/TASK_ARCHIVE/56_Tuist_Compatibility_Fixes_metrics.json new file mode 100644 index 00000000..35b25638 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/56_Tuist_Compatibility_Fixes_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/56_Tuist_Compatibility_Fixes.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Deployment targets in the Tuist manifest must be lowered to support iOS and macOS app builds.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Wrap iOS 17-only SwiftUI APIs (`onChange(initial:)`, `ContentUnavailableView`, focusable) in helpers that fall back to older equivalents.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Use `.foregroundColor` instead of `.foregroundStyle` so colour styling compiles on iOS 16 and macOS 13.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verify `xcodebuild` for ISOInspectorApp-iOS (simulator) and ISOInspectorApp-mathematical? Wait...", + "source_line": null + } + ], + "functional_units": [ + { + "name": "iOS and macOS App Build Restoration", + "description": "Restores the ability to build iOS and macOS applications after deployment target changes in the Tuist manifest.", + "source_line": null + }, + { + "name": "SwiftUI API Compatibility Helpers", + "description": "Provides helper wrappers for iOS 17-only SwiftUI APIs (onChange(initial:), ContentUnavailableView, focusable) that fall back to older equivalents when running on earlier OS versions.", + "source_line": null + }, + { + "name": "Foreground Style Compatibility Fix", + "description": "Replaces .foregroundStyle usage with .foregroundColor to ensure colour styling compiles on iOS 16 and macOS 13.", + "source_line": null + }, + { + "name": "Build Verification for ISOInspectorApp", + "description": "Verifies successful builds of ISOInspectorApp-iOS (simulator) and ISOInspectorApp-macOS using xcodebuild, and verifies swift build for the project.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 510, + "line_count": 6 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/56_Distribution_Apple_Events_Notarization_Assessment_metrics.json b/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/56_Distribution_Apple_Events_Notarization_Assessment_metrics.json new file mode 100644 index 00000000..ac7ecabd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/56_Distribution_Apple_Events_Notarization_Assessment_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/56_Distribution_Apple_Events_Notarization_Assessment.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Determine whether ISOInspector's notarized build process requires Apple Events automation and document any entitlement or tooling adjustments needed to keep distribution workflows compliant.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document whether notarization flows rely on Apple Events automation (e.g., driving Finder/archive steps) or can remain purely notarytool-based.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update entitlements and documentation if Apple Events access is required, or confirm current entitlements are sufficient.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline any CI or manual steps needed so future packaging work (release notes, theming, TestFlight/DMG distribution) can proceed without blocking dependencies.", + "source_line": null + }, + { + "type": "invariant", + "description": "Only add Apple Events entitlements if necessary and ensure documentation captures rationale for security review.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate changes with sandboxing requirements; only add Apple Events entitlements if necessary and ensure documentation captures rationale for security review.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Notarization Process Evaluation", + "description": "Assess if notarized build workflow requires Apple Events automation or can use only notarytool", + "source_line": null + }, + { + "name": "Entitlement Update Procedure", + "description": "Add or confirm Apple Events entitlements in the app\u2019s macOS entitlement file based on evaluation", + "source_line": null + }, + { + "name": "Documentation of Decision and Rationale", + "description": "Record findings, decisions, and security rationale for future reference", + "source_line": null + }, + { + "name": "CI/Manual Steps Outline", + "description": "Define continuous integration or manual steps needed to avoid blocking dependencies in packaging", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2315, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/57_Distribution_Apple_Events_Notarization_Assessment_metrics.json b/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/57_Distribution_Apple_Events_Notarization_Assessment_metrics.json new file mode 100644 index 00000000..73829759 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/57_Distribution_Apple_Events_Notarization_Assessment_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/57_Distribution_Apple_Events_Notarization_Assessment.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "Apple Events automation is not required for ISOInspector\u2019s notarized distribution; the build/sign/notarization pipeline must remain fully CLI-driven and must not use AppleScript/ScriptingBridge.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The codebase and scripts contain no usage of osascript, .scpt, NSAppleScript, OSAScript, ScriptingBridge, or tell application \"Finder\"/\"System Events\".", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Distribution tooling (scripts/notarize_app.sh) must exclusively shell out to CLI utilities like xcrun notarytool and not use Finder/System Events automation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Entitlements should remain unchanged; do not add com.apple.security.automation.apple-events.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Do not add NSAppleEventsUsageDescription.", + "source_line": null + }, + { + "type": "invariant", + "description": "The user\u2011to\u2011CI workflow must only use the hardened runtime, codesign flags, and \"notarytool\"\u00a0with\u00a0--wait\u00a0...", + "source_line": null + }, + { + "type": "user_story", + "description": "We want to ensure that CI builds and CI\u2011secret\u2011sized\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI-driven build pipeline", + "description": "Builds, signs, and notarizes the application using command-line tools such as xcodebuild, codesign, and xcrun notarytool without any AppleScript or scripting bridge usage.", + "source_line": null + }, + { + "name": "Notarization script execution", + "description": "Executes a shell script (e.g., scripts/notarize_app.sh) that calls CLI utilities like xcrun notarytool to submit the app for notarization.", + "source_line": null + }, + { + "name": "CI credential configuration", + "description": "Stores and uses App Store Connect credentials (API key or Apple ID with app\u2011specific password) as CI secrets for automated notarization.", + "source_line": null + }, + { + "name": "Hardening runtime signing", + "description": "Applies hardened runtime flags during codesign, ensuring the application is signed with proper security settings.", + "source_line": null + }, + { + "name": "TCC automation entitlement management", + "description": "Manages the com.apple.security.automation.apple-events entitlement and NSAppleEventsUsageDescription to enable or disable Apple Events automation based on feature requirements.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1612, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/next_tasks_metrics.json new file mode 100644 index 00000000..be3e4323 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/next_tasks_metrics.json @@ -0,0 +1,52 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/next_tasks.md", + "n_spec": 8, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ParseTreeStreamingSelectionAutomationTests must pass on macOS hardware with XCTest UI support, confirming the SwiftUI automation flow works end-to-end.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Combine-backed UI benchmark must run on macOS and produce latency metrics that match throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "invariant", + "description": "XCTest skips the scenario on Linux because Combine is unavailable, so the benchmark cannot be executed on Linux.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface session persistence errors once diagnostics plumbing is available", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session persistence errors should be surfaced when diagnostics plumbing is enabled.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules defined.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1933, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/58_F4_User_Manual/F4_User_Manual_metrics.json b/DOCS/TASK_ARCHIVE/58_F4_User_Manual/F4_User_Manual_metrics.json new file mode 100644 index 00000000..da19d508 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/58_F4_User_Manual/F4_User_Manual_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/58_F4_User_Manual/F4_User_Manual.md", + "n_spec": 8, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver end-user documentation for the ISOInspector app workflows", + "source_line": null + }, + { + "type": "user_story", + "description": "Document CLI usage, streaming exports, and validation flows for automation scenarios", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation must reference existing Kit API behavior without adding new code changes", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Call sites remain unchanged; documentation-only iteration", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "No runtime changes; backward compatibility preserved", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation validated with scripts/fix_markdown.py and Markdownlint", + "source_line": null + }, + { + "type": "invariant", + "description": "Public Kit API must not be altered by this documentation effort", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing SwiftUI shell for App documentation", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspector App Documentation", + "description": "User manual for the ISOInspector app workflows, covering onboarding, search/filter controls, detail pane, and persistence behavior in SwiftUI shell.", + "source_line": null + }, + { + "name": "CLI Documentation", + "description": "Command-line interface guide detailing global options and commands: inspect, validate, export, batch, including usage guidance and streaming exports.", + "source_line": null + }, + { + "name": "Documentation Generation Scripts", + "description": "Scripts for validating and linting documentation markdown files (scripts/fix_markdown.py, markdownlint-cli2).", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1519, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/58_F4_User_Manual/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/58_F4_User_Manual/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e19daf7b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/58_F4_User_Manual/Summary_of_Work_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/58_F4_User_Manual/Summary_of_Work.md", + "n_spec": 6, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Publish ISOInspector app manual with onboarding, navigation, and persistence guidance for the SwiftUI shell.", + "source_line": null + }, + { + "type": "user_story", + "description": "Author CLI manual covering global options plus inspect, validate, export, and batch commands with troubleshooting tips.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execution trackers updated to mark F4 complete and reference new manuals.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Markdown files validated using python3 scripts/fix_markdown.py and npx markdownlint-cli2 on specified directories.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture platform-specific screenshots to accompany the manuals when assets become available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Document diagnostics-driven persistence troubleshooting once logging pipeline surfaces signals.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1228, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/58_F4_User_Manual/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/58_F4_User_Manual/next_tasks_metrics.json new file mode 100644 index 00000000..3a2df45a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/58_F4_User_Manual/next_tasks_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/58_F4_User_Manual/next_tasks.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The ParseTreeStreamingSelectionAutomationTests must pass on macOS hardware with XCTest UI support, confirming the end-to-end SwiftUI automation flow works as documented.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Combine-backed UI benchmark must run successfully on macOS, capturing latency metrics and achieving throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "invariant", + "description": "XCTest skips the scenario on Linux because Combine is unavailable; therefore tests must be executed only on platforms where Combine is available (macOS).", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface session persistence errors once diagnostics plumbing is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session persistence errors should be surfaced to users or developers when diagnostics plumbing is enabled.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules defined.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CoreData session bookmarks and live bookmark entities must match after reconciliation based on defined rules.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "Runs end-to-end SwiftUI automation flow for streaming UI coverage on macOS", + "source_line": null + }, + { + "name": "Combine-backed UI benchmark", + "description": "Executes Combine-based UI benchmark to capture latency metrics while maintaining CLI throughput parity on macOS", + "source_line": null + }, + { + "name": "Session persistence error surfacing", + "description": "Surface session persistence errors once diagnostics plumbing is available", + "source_line": null + }, + { + "name": "CoreData bookmark reconciliation", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities according to defined rules", + "source_line": null + }, + { + "name": "Automation via Apple Events for notarized builds", + "description": "Evaluate and extend entitlements for automation through Apple Events in notarized builds", + "source_line": null + }, + { + "name": "User manual production", + "description": "Produce user manuals covering CLI and app workflows", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2022, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/F5_Finalize_Release_Checklist_and_Go_Live_Runbook_metrics.json b/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/F5_Finalize_Release_Checklist_and_Go_Live_Runbook_metrics.json new file mode 100644 index 00000000..2fa3e04b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/F5_Finalize_Release_Checklist_and_Go_Live_Runbook_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/F5_Finalize_Release_Checklist_and_Go_Live_Runbook.md", + "n_spec": 4, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver a consolidated release readiness checklist and go-live runbook so QA, release engineering, and product stakeholders can execute ISOInspector releases consistently across CLI, notarized macOS DMG, and TestFlight builds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Checklist enumerates QA gates with owners, commands, and evidence expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Runbook instructions reuse distribution metadata, notarization tooling, and Tuist manifests from tasks E4 and F2.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updates and post-release bookkeeping steps (todo/workplan/prd trackers) appear explicitly.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Release Readiness Checklist", + "description": "A consolidated checklist of QA gates, commands, owners, and evidence expectations for build, test, automation, and benchmark coverage.", + "source_line": null + }, + { + "name": "Documentation Synchronization", + "description": "Ensures release notes, README, manuals, and DocC archives stay in sync with the version bump.", + "source_line": null + }, + { + "name": "Packaging Runbook", + "description": "Outlines Tuist metadata updates, CLI binary builds, notarization flow, and TestFlight submission steps using shared distribution configuration and tooling.", + "source_line": null + }, + { + "name": "Go/No-Go Sign-Off Process", + "description": "Documents evidence required for release approval and captures deferred QA items such as macOS Combine benchmark follow-up.", + "source_line": null + }, + { + "name": "Runbook Command Execution Interface", + "description": "Provides commands to capture required actions for build, test, automation, and benchmark coverage.", + "source_line": null + }, + { + "name": "Documentation Update Workflow", + "description": "Workflow for updating documentation deliverables during a release.", + "source_line": null + }, + { + "name": "Post-Release Bookkeeping Steps", + "description": "Steps for tracking post-release tasks in todo/workplan/prd trackers.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2408, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c4e579c7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/Summary_of_Work_metrics.json @@ -0,0 +1,52 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/Summary_of_Work.md", + "n_spec": 8, + "n_func": 0, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Use a dedicated Release Readiness Runbook document (Documentation/ISOInspector.docc/Guides/ReleaseReadinessRunbook.md) as the canonical playbook for QA, distribution, and communications.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide a documented release checklist and go\u2011live runbook that covers QA gates, documentation deliverables, packaging steps, shared distribution metadata, Tuist manifests, and notarization tooling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Release Readiness Runbook must include: 1) QA gates, 2) documentation deliverables, 3) packaging steps tied to shared distribution metadata, Tuist manifests, and notarization tooling; 4) go/no\u2011go evidence requirements; 5) post\u2011release bookkeeping that keeps workplan, PRD TODO, and next\u2011task trackers synchronized.", + "source_line": null + }, + { + "type": "invariant", + "description": "The Release Readiness Runbook must be the single source of truth for release playbooks and must remain in sync with the distribution metadata, Tuist manifests, and notarization tooling.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Validate Markdown formatting using scripts/fix_markdown.py and Markdownlint before committing documentation changes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS UI automation and Combine benchmarks when hardware is available and attach evidence to the release QA log.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Evidence from macOS UI automation and Combine benchmarks must be attached to the release QA log.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate hosted DocC publishing so that release artifacts are discoverable beyond GitHub Releases.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 1560, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/next_tasks_metrics.json new file mode 100644 index 00000000..5b1d911f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/next_tasks_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/59_F5_Finalize_Release_Checklist_and_Go_Live_Runbook/next_tasks.md", + "n_spec": 8, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute ParseTreeStreamingSelectionAutomationTests on macOS hardware and attach logs to the release QA archive.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStreamingSelectionAutomationTests must be executed on macOS hardware and logs attached to the release QA archive.", + "source_line": null + }, + { + "type": "invariant", + "description": "The task is blocked until a macOS UI runner becomes available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run LargeFileBenchmarkTests.testAppEventBridgeDeliversUpdatesWithinLatencyBudget on macOS with Combine available and record latency, CPU, and memory metrics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "LargeFileBenchmarkTests.testAppEventBridgeDeliversUpdatesWithinLatencyBudget must be run on macOS with Combine available and latency, CPU, and memory metrics recorded.", + "source_line": null + }, + { + "type": "invariant", + "description": "The task is blocked until a macOS runner becomes available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate hosted DocC publishing so release artifacts remain discoverable beyond GitHub Releases.", + "source_line": null + }, + { + "type": "user_story", + "description": "Automate checksum generation and upload for CLI and notarized app artifacts in the release pipeline.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests Execution", + "description": "Execute the ParseTreeStreamingSelectionAutomationTests suite on macOS hardware and attach logs to the release QA archive.", + "source_line": null + }, + { + "name": "LargeFileBenchmarkTest Execution", + "description": "Run LargeFileBenchmarkTests.testAppEventBridgeDeliversUpdatesWithinLatencyBudget on macOS with Combine, recording latency, CPU, and memory metrics.", + "source_line": null + }, + { + "name": "DocC Publishing Evaluation", + "description": "Evaluate hosting DocC publishing so that release artifacts remain discoverable beyond GitHub Releases.", + "source_line": null + }, + { + "name": "Checksum Generation Automation", + "description": "Automate generation of checksums and upload for CLI and notarized app artifacts in the release pipeline.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 863, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/Summary_of_Work_metrics.json new file mode 100644 index 00000000..5d61a34d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/Summary_of_Work.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The release readiness checklist and go-live runbook must be published at Documentation/ISOInspector.docc/Guides/ReleaseReadinessRunbook.md", + "source_line": null + }, + { + "type": "user_story", + "description": "Publish the release readiness checklist and go\u2011live runbook to provide QA gates, documentation deliverables, distribution packaging steps, and post\u2011release bookkeeping tied to shared distribution metadata and notarization tooling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The guide must capture QA gates, documentation deliverables, distribution packaging steps, and post\u2011release bookkeeping tied to shared distribution metadata and notarization tooling.", + "source_line": null + }, + { + "type": "invariant", + "description": "MacOS UI automation and Combine benchmark runs cannot proceed until hardware is available", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate options for hosting DocC archives beyond GitHub Releases to improve release artifact discoverability.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 889, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/next_tasks_metrics.json new file mode 100644 index 00000000..8782601a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/next_tasks_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/60_Summary_of_Work_2025-10-13_Release_Runbook/next_tasks.md", + "n_spec": 15, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware to validate end-to-end SwiftUI automation flow", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStreamingSelectionAutomationTests must pass on macOS hardware with XCTest UI support", + "source_line": null + }, + { + "type": "invariant", + "description": "Testing cannot be performed in container due to missing macOS UI testing entitlements", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with CLI harness", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Combine-backed UI benchmark must run on macOS runner with Xcode/Combine and produce latency metrics", + "source_line": null + }, + { + "type": "invariant", + "description": "Benchmark cannot be executed in container because Combine is unavailable on Linux", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface session persistence errors once diagnostics plumbing is available", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session persistence errors must be surfaced when diagnostics plumbing is enabled", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities according to defined reconciliation rules", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CoreData bookmarks and live bookmarks must match after reconciliation", + "source_line": null + }, + { + "type": "invariant", + "description": "Reconciliation rules are not yet defined", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate automation via Apple Events for notarized builds and extend entitlements safely", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automation via Apple Events must be evaluated and applied to a well\u2011tuned entitlements configuration", + "source_line": null + }, + { + "type": "invariant", + "description": "This task completed in earlier work", + "source_line": null + }, + { + "type": "user_story", + "description": "Finalize release checklist and go-live runbook covering QA sign-off, completion\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "Runs end-to-end SwiftUI automation flow for streaming UI coverage on macOS", + "source_line": null + }, + { + "name": "Combine-backed UI benchmark", + "description": "Executes Combine-based UI benchmark to capture latency metrics while maintaining CLI throughput parity", + "source_line": null + }, + { + "name": "Session persistence error surfacing", + "description": "Displays session persistence errors once diagnostics plumbing is available", + "source_line": null + }, + { + "name": "CoreData bookmark reconciliation", + "description": "Reconciles CoreData session bookmarks with live bookmark entities according to defined rules", + "source_line": null + }, + { + "name": "Apple Events automation for notarized builds", + "description": "Evaluates and extends entitlements for Apple Events automation in notarized builds", + "source_line": null + }, + { + "name": "Release readiness runbook", + "description": "Finalizes release checklist, QA sign-off, documentation updates, and packaging logistics", + "source_line": null + }, + { + "name": "User manual production", + "description": "Produces user manuals covering CLI and app workflows", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2344, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/A2_Implement_MappedReader_metrics.json b/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/A2_Implement_MappedReader_metrics.json new file mode 100644 index 00000000..80b74ac2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/A2_Implement_MappedReader_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/61_A2_Implement_MappedReader/A2_Implement_MappedReader.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a memory-mapped RandomAccessReader implementation that allows bounded, slice-based reads for large media files without duplicating buffers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "MappedReader conforms to RandomAccessReader, exposing file length and read(at:count:) with defensive bounds checking and descriptive errors when requests exceed the available range.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Reader initialization validates the URL, captures the mapped Data, and releases resources deterministically when deallocated.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover full-file reads, partial slices, zero-length requests, and out-of-bounds failures alongside parity checks with ChunkedFileReader fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation explains when to prefer the mapped versus chunked reader and how they interoperate with parser components.", + "source_line": null + }, + { + "type": "invariant", + "description": "MappedReader must always treat the mapped Data as immutable and document concurrency expectations for thread safety.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Data(contentsOf:options:.mappedIfSafe) for memory mapping, with graceful degradation to a chunked reader when mapping is unsupported or unavailable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Mirror the error surface of RandomAccessReaderValueDecodingError and extend it for IO-specific faults without adding new dependencies.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MappedReader", + "description": "Memory\u2011mapped random access reader that implements RandomAccessReader, exposing file length and read(at:count:) with bounds checking and error handling.", + "source_line": null + }, + { + "name": "RandomAccessReader protocol", + "description": "Defines interface for random\u2011access reads by offset and length, including length property and read(at:count:) method.", + "source_line": null + }, + { + "name": "ChunkedFileReader", + "description": "Existing reader that satisfies RandomAccessReader using FileHandle buffers; serves as a fallback or comparison.", + "source_line": null + }, + { + "name": "MappedReaderFactory", + "description": "Factory closures in CLI/app to choose between MappedReader and ChunkedFileReader based on platform support.", + "source_line": null + }, + { + "name": "MappedReaderTests", + "description": "Unit test suite covering full-file reads, partial slices, zero-length requests, out-of-bounds failures, and parity with ChunkedFileReader.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3484, + "line_count": 47 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/Summary_of_Work_metrics.json new file mode 100644 index 00000000..9d2323b4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/Summary_of_Work_metrics.json @@ -0,0 +1,38 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/61_A2_Implement_MappedReader/Summary_of_Work.md", + "n_spec": 4, + "n_func": 1, + "intent_atoms": [ + { + "type": "invariant", + "description": "MappedReader must perform bounds-checked slicing and prevent out-of-range requests.", + "source_line": null + }, + { + "type": "invariant", + "description": "MappedReader should gracefully fallback when memory mapping is unavailable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "MappedReaderTests cover full and partial reads, zero-length slices, missing files, and boundary enforcement.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Memory-mapped RandomAccessReader implementation was added in Sources/ISOInspectorKit/IO/MappedReader.swift.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MappedReader", + "description": "Provides a memory-mapped RandomAccessReader implementation that reads file contents via Data(contentsOf:options:.mappedIfSafe) with bounds-checked slicing and graceful fallback when mapping is unavailable.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1143, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/next_tasks_metrics.json new file mode 100644 index 00000000..d73ac8c8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/61_A2_Implement_MappedReader/next_tasks_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/61_A2_Implement_MappedReader/next_tasks.md", + "n_spec": 2, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "MappedReader must use Data(...,.mappedIfSafe) with bounds-checked slices", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware to validate end-to-end SwiftUI automation flow", + "source_line": null + } + ], + "functional_units": [ + { + "name": "MappedReader Implementation", + "description": "Provides a Data reader that uses mappedIfSafe with bounds-checked slices for efficient data access.", + "source_line": null + }, + { + "name": "ParseTreeStreamingSelectionAutomationTests Execution on macOS", + "description": "Runs SwiftUI automation tests to validate end-to-end streaming selection flow in the UI.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark on macOS", + "description": "Captures latency metrics for Combine-based UI while maintaining CLI throughput parity.", + "source_line": null + }, + { + "name": "Session Persistence Error Surfacing", + "description": "Displays session persistence errors once diagnostics plumbing is available.", + "source_line": null + }, + { + "name": "CoreData Session Bookmark Reconciliation", + "description": "Reconciles CoreData session bookmark diffs with live bookmark entities according to defined rules.", + "source_line": null + }, + { + "name": "Automation via Apple Events for Notarized Builds", + "description": "Evaluates and extends entitlements for automation using Apple Events in notarized builds.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2049, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/A4_RandomAccessReader_Error_Types_metrics.json b/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/A4_RandomAccessReader_Error_Types_metrics.json new file mode 100644 index 00000000..6716d363 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/A4_RandomAccessReader_Error_Types_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/A4_RandomAccessReader_Error_Types.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Introduce explicit RandomAccessReader error types (IOError, BoundsError, OverflowError) and align existing reader implementations so downstream components receive consistent diagnostics while preparing for the A5 benchmarking follow-up.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Define repository-wide error enumerations that cover IO failures, invalid request bounds, and arithmetic overflow scenarios exposed via RandomAccessReader APIs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update MappedReader and other conformers to translate their internal error conditions into the shared error surface, maintaining existing read semantics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Extend unit tests to validate each error path, including offset/count guards and simulated IO failures, ensuring the typed errors propagate to decoding helpers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document the new error contracts to unblock A5 benchmarking scenarios that compare reader implementations under failure and stress conditions.", + "source_line": null + }, + { + "type": "invariant", + "description": "RandomAccessReader implementations must return deterministic Swift.Error values conforming to the shared RandomAccessReaderError type.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a top-level RandomAccessReaderError (or similar) that encapsulates IO, bounds, and overflow cases while mapping existing conformer-specific errors to the shared cases.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit each RandomAccessReader implementation (MappedReader, ChunkedFileReader, future variants) to ensure they conform to the shared error interface.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update decoding helpers and associated tests to assert on the new error cases where appropriate, including overflow checks in integer-sized reads.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Outline performance metrics and harness hooks required for Task A5 so benchmarking can consume the standardized error metadata without additional refactors.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomAccessReaderError Enumeration", + "description": "Defines standardized error cases (IOError, BoundsError, OverflowError) for all RandomAccessReader implementations.", + "source_line": null + }, + { + "name": "MappedReader Error Translation", + "description": "Converts MappedReader internal errors into the shared RandomAccessReaderError surface while preserving read semantics.", + "source_line": null + }, + { + "name": "ChunkedFileReader Error Conformance", + "description": "Ensures ChunkedFileReader (and future variants) map their errors to RandomAccessReaderError for consistent diagnostics.", + "source_line": null + }, + { + "name": "Unit Test Suite for Error Paths", + "description": "Tests each error scenario\u2014offset/count guards, simulated IO failures, and integer overflow checks\u2014to validate propagation of typed errors.", + "source_line": null + }, + { + "name": "Decoding Helper Error Handling", + "description": "Updates decoding helpers to assert on and propagate RandomAccessReaderError cases during data processing.", + "source_line": null + }, + { + "name": "Benchmark Harness Integration", + "description": "Provides hooks and performance metrics so A5 benchmarking can consume standardized error metadata from reader implementations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3500, + "line_count": 48 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b0067077 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/Summary_of_Work.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "RandomAccessReader error surface must be standardised using the RandomAccessReaderError taxonomy and propagated through kit readers and fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add RandomAccessReaderError and RandomAccessReaderBoundsError enumerations to RandomAccessReader.swift with Sendable and Equatable conformance for safe concurrency diagnostics.", + "source_line": null + }, + { + "type": "invariant", + "description": "MappedReader and ChunkedFileReader must emit shared error cases (invalid offset/count, bounds, IO, overflow) while performing overflow-safe range calculations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "In-memory test reader and unit suites must cover new error behaviours: negative offsets, invalid counts, IO failure propagation, arithmetic overflow detection.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomAccessReaderError Taxonomy", + "description": "Defines a standardized set of error types for random-access readers, including bounds and IO errors.", + "source_line": null + }, + { + "name": "RandomAccessReaderBoundsError Enumeration", + "description": "Specifies bounds-related error cases for random-access reader operations.", + "source_line": null + }, + { + "name": "MappedReader Error Handling", + "description": "Updates the MappedReader to emit shared error cases such as invalid offset/count, bounds, IO, and overflow during range calculations.", + "source_line": null + }, + { + "name": "ChunkedFileReader Error Handling", + "description": "Updates the ChunkedFileReader to emit shared error cases such as invalid offset/count, bounds, IO, and overflow during range calculations.", + "source_line": null + }, + { + "name": "In-Memory Test Reader", + "description": "Provides an in-memory reader for testing that covers new error behaviors like negative offsets, invalid counts.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1071, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/next_tasks_metrics.json new file mode 100644 index 00000000..024775d0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/62_A4_RandomAccessReader_Error_Types/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 277, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b3e79c0c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/Summary_of_Work.md", + "n_spec": 2, + "n_func": 7, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Introduced a shared RandomAccessReaderError taxonomy and updated MappedReader, ChunkedFileReader, and InMemoryRandomAccessReader to emit consistent bounds, overflow, and IO errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover negative offsets, invalid counts, overflow detection, and IO propagation for chunked and mapped reader suites.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomAccessReaderError taxonomy", + "description": "Defines a shared error type hierarchy for bounds, overflow, and IO errors across random access readers.", + "source_line": null + }, + { + "name": "MappedReader error handling", + "description": "Updates MappedReader to emit consistent RandomAccessReaderError instances for invalid operations.", + "source_line": null + }, + { + "name": "ChunkedFileReader error handling", + "description": "Updates ChunkedFileReader to emit consistent RandomAccessReaderError instances for negative offsets, invalid counts, overflow detection, and IO propagation.", + "source_line": null + }, + { + "name": "InMemoryRandomAccessReader error handling", + "description": "Updates InMemoryRandomAccessReader to emit consistent RandomAccessReaderError instances for bounds and overflow errors.", + "source_line": null + }, + { + "name": "Unit tests for negative offset handling", + "description": "Provides unit coverage testing negative offsets in random access readers.", + "source_line": null + }, + { + "name": "Unit tests for invalid count handling", + "description": "Test suite covering invalid (non\u2011positive) counts in read operations.", + "source_line": null + }, + { + "name": "Unit tests for overflow detection", + "description": "Testing\u00a0the\u00a0...", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 716, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/next_tasks_metrics.json new file mode 100644 index 00000000..98bfa47b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/next_tasks_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/63_Summary_of_Work_2025-10-15/next_tasks.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Advance Task A5 from the IO roadmap by wiring up the random-slice benchmarking harness now that Task A4\u2019s error taxonomy is complete.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics on a platform that ships Combine, keeping throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface session persistence errors once diagnostics plumbing is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules are defined.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track outcome of the notarized build Apple Events automation assessment alongside todo.md entry \u201cPDD:30m Evaluate whether automation via Apple Events is required for notarized builds and extend entitlements safely.\u201d", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Random-slice Benchmark Harness", + "description": "Runs a random-slice benchmarking harness for IO tasks using the error taxonomy from Task A4.", + "source_line": null + }, + { + "name": "SwiftUI Automation Flow Validation", + "description": "Executes ParseTreeStreamingSelectionAutomationTests on macOS to validate end-to-end SwiftUI automation flow for streaming UI coverage.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark", + "description": "Captures latency metrics for Combine-supported UI benchmarks on macOS, maintaining throughput parity with CLI harness.", + "source_line": null + }, + { + "name": "Session Persistence Error Surface", + "description": "Displays session persistence errors once diagnostics plumbing is available.", + "source_line": null + }, + { + "name": "CoreData Session Bookmark Reconciliation", + "description": "Reconciles CoreData session bookmark differences with live bookmark entities based on defined reconciliation rules.", + "source_line": null + }, + { + "name": "Notarized Build Apple Events Automation Tracking", + "description": "Tracks outcomes of notarized build Apple Events automation assessment and evaluates entitlements for notarization.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2328, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/A5_Random_Slice_Benchmarking_metrics.json b/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/A5_Random_Slice_Benchmarking_metrics.json new file mode 100644 index 00000000..a07346e4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/A5_Random_Slice_Benchmarking_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/A5_Random_Slice_Benchmarking.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a repeatable micro\u2011benchmark suite that exercises random slice reads against both MappedReader and ChunkedFileReader, capturing latency and throughput metrics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmarks execute both reader implementations across representative slice sizes (small, medium, large) using shared fixtures, reporting latency and throughput deltas within XCTest\u2019s metrics harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Harness integrates into the existing performance test suite so swift test captures regressions automatically, leveraging PerformanceBenchmarkConfiguration controls delivered by Task F2.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark failures emit structured RandomAccessReaderError diagnostics, confirming the error taxonomy is preserved end\u2011to\u2011end during stress scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation or README notes summarize the measurement approach and baseline numbers so future tasks can compare against the established envelope.", + "source_line": null + }, + { + "type": "invariant", + "description": "Random slice read operations must use the unified RandomAccessReaderError taxonomy for error reporting.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the performance benchmark target introduced in Task F2, reusing configurable payload sizing and iteration controls to cover random slice workloads for both reader implementations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Parameterize slice offsets to model warm and cold cache behaviour using existing IO subsystem fixtures.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Capture metrics in a format suitable for future CI gating (e.g., JSON artifacts or baseline files) while keeping Linux compatibility for non\u2011Combine scenarios.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "RandomSliceBenchmarkHarness", + "description": "Executes micro\u2011benchmarks that read random slices using MappedReader and ChunkedFileReader, measuring latency and throughput", + "source_line": null + }, + { + "name": "SharedFixtureManager", + "description": "Provides large file fixtures reused across benchmarks to avoid generating new assets", + "source_line": null + }, + { + "name": "SliceOffsetParameterizer", + "description": "Generates slice offsets to model warm and cold cache behavior for benchmark runs", + "source_line": null + }, + { + "name": "PerformanceMetricsCollector", + "description": "Collects latency and throughput metrics in a format suitable for CI gating (JSON artifacts or baseline files)", + "source_line": null + }, + { + "name": "ErrorDiagnosticEmitter", + "description": "Emits structured RandomAccessReaderError diagnostics when benchmarks fail, preserving the error taxonomy", + "source_line": null + }, + { + "name": "BenchmarkIntegrationModule", + "description": "Integrates the harness into the existing performance test suite using swift test and PerformanceBenchmarkConfiguration controls", + "source_line": null + }, + { + "name": "DocumentationGenerator", + "description": "Produces README notes summarizing measurement approach and baseline numbers", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3572, + "line_count": 46 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c9984001 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/Summary_of_Work.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "Random Slice Benchmarking Harness", + "description": "Deterministic micro-benchmarks that exercise random slice reads across MappedReader and ChunkedFileReader, wired into a shared performance test target.", + "source_line": null + }, + { + "name": "LargeFileBenchmarkTests Extension", + "description": "Adds seeded random slice scenarios (small, medium, large) using existing fixture builder and respects PerformanceBenchmarkConfiguration iteration controls.", + "source_line": null + }, + { + "name": "Deterministic SplitMix64 Generator", + "description": "Provides reproducible random slice scenario descriptions for both readers to run identical workloads.", + "source_line": null + }, + { + "name": "Throughput Summary Printer", + "description": "Prints per-scenario throughput summaries from the test harness for baseline numbers.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1636, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/next_tasks_metrics.json new file mode 100644 index 00000000..b6711177 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/next_tasks_metrics.json @@ -0,0 +1,17 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking/next_tasks.md", + "n_spec": 1, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute the random slice benchmarking harness on macOS hardware with Combine available to compare results against the Linux baselines captured here.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 169, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/2025-10-15-random-slice-benchmark_metrics.json b/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/2025-10-15-random-slice-benchmark_metrics.json new file mode 100644 index 00000000..7ee7fde1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/2025-10-15-random-slice-benchmark_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/2025-10-15-random-slice-benchmark.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver deterministic random slice performance benchmarks that compare MappedReader and ChunkedFileReader under identical workloads.", + "source_line": null + }, + { + "type": "invariant", + "description": "No code changes; exercises existing RandomAccessReader conformers.", + "source_line": null + }, + { + "type": "invariant", + "description": "Public Kit API added/changed: None.", + "source_line": null + }, + { + "type": "invariant", + "description": "Backward compatibility remains unchanged.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark scenarios reuse PerformanceBenchmarkConfiguration iteration controls and print baseline metrics for three slice classes (small/medium/large) derived from a seeded SplitMix64 generator.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Default CI intensity yielded 0.06, 8.04, and 34.60 MiB per-iteration throughput samples for both readers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Random Slice Performance Benchmark", + "description": "Executes deterministic random slice performance tests comparing MappedReader and ChunkedFileReader under identical workloads.", + "source_line": null + }, + { + "name": "Benchmark Configuration Reuse", + "description": "Utilizes PerformanceBenchmarkConfiguration iteration controls to set up benchmark scenarios for small, medium, and large slices derived from a seeded SplitMix64 generator.", + "source_line": null + }, + { + "name": "Baseline Metrics Reporting", + "description": "Prints baseline throughput metrics (MiB per-iteration) for both readers across slice classes.", + "source_line": null + }, + { + "name": "Test Integration", + "description": "Integrates new benchmark cases into Tests/ISOInspectorPerformanceTests/LargeFileBenchmarkTests.swift for both reader implementations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1212, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/Summary_of_Work_metrics.json new file mode 100644 index 00000000..a5162600 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "The A5 random slice benchmarking harness must be implemented and archived under DOCS/TASK_ARCHIVE/64_A5_Random_Slice_Benchmarking.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide documentation for the A5 random slice benchmark, including micro-PRD, scope, and throughput baselines in DOCS/INPROGRESS/2025-10-15-random-slice-benchmark.md.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Mark A5 as complete in roadmap trackers and reference archived summary in next_tasks.md files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run random slice benchmarks on macOS hardware once Combine support is available to validate cross-platform performance parity.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "A5 Random Slice Benchmarking Harness", + "description": "An executable harness that benchmarks random slice operations and records throughput baselines.", + "source_line": null + }, + { + "name": "Documentation for Random Slice Benchmarking", + "description": "Markdown files documenting the micro-PRD, scope, and performance baselines of the random slice benchmark.", + "source_line": null + }, + { + "name": "Roadmap Tracker Updates", + "description": "Updates to roadmap tracker documents marking A5 completion and linking to archived summaries.", + "source_line": null + }, + { + "name": "Swift Test Execution", + "description": "Running the Swift test suite to verify functionality.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 804, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/next_tasks_metrics.json new file mode 100644 index 00000000..4c30e778 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/next_tasks_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/65_Summary_of_Work_2025-10-15_Benchmark/next_tasks.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Advance Task A5 from the IO roadmap by wiring up the random-slice benchmarking harness now that Task A4\u2019s error taxonomy is complete.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in DOCS/TASK_ARCHIVE/48_macOS_SwiftUI_Automation_Streaming_Default_Selection/48_macOS_SwiftUI_Automation_Streaming_Default_Selection.md.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics on a platform that ships Combine, keeping throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface session persistence errors once diagnostics plumbing is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules are defined.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track outcome of the notarized build Apple Events automation assessment alongside todo.md entry \u201cPDD:30m Evaluate whether automation via Apple Events is required for notarized builds and extend entitlements safely.\u201d", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Random-Slice Benchmarking Harness", + "description": "Provides a benchmarking capability for random-slice operations using a harness that measures performance metrics.", + "source_line": null + }, + { + "name": "SwiftUI Automation Flow for Streaming Selection", + "description": "Enables end-to-end SwiftUI automation testing of streaming selection features on macOS via XCTest.", + "source_line": null + }, + { + "name": "Combine-Backed UI Benchmark", + "description": "Captures latency and throughput metrics for Combine-based UI components on macOS, ensuring parity with CLI harness.", + "source_line": null + }, + { + "name": "Session Persistence Error Surface", + "description": "Exposes session persistence errors to users or developers once diagnostics plumbing is available.", + "source_line": null + }, + { + "name": "CoreData Session Bookmark Reconciliation", + "description": "Reconciles differences between CoreData session bookmarks and live bookmark entities according to defined rules.", + "source_line": null + }, + { + "name": "Apple Events Automation for Notarized Builds", + "description": "Automates notarized build processes using Apple Events, managing entitlements safely.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2388, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/E5_Surface_Document_Load_Failures_metrics.json b/DOCS/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/E5_Surface_Document_Load_Failures_metrics.json new file mode 100644 index 00000000..2a287cb0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/E5_Surface_Document_Load_Failures_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/E5_Surface_Document_Load_Failures.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a SwiftUI error banner that appears when the app cannot open a document, providing user-friendly failure messaging instead of silent failure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Attempting to open an invalid or inaccessible file in the app shell presents the designed error banner with actionable text.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "UI tests cover the error presentation path and assert the banner clears when the user dismisses or retries successfully.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Error events are logged or traced in a way that aligns with existing diagnostics expectations for document handling.", + "source_line": null + }, + { + "type": "invariant", + "description": "The document session controller must publish failure state that the SwiftUI shell can observe, replacing the existing TODO placeholder.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the document session controller to publish failure state and coordinate banner styling and copy with existing design tokens or guidelines referenced in the workplan.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Document Load Error Banner", + "description": "Displays a SwiftUI banner when the app fails to open an invalid or inaccessible document, providing user-friendly failure messaging and actionable options.", + "source_line": null + }, + { + "name": "Document Session Failure State Publisher", + "description": "Extends the document session controller to publish a failure state that the SwiftUI shell observes for error handling.", + "source_line": null + }, + { + "name": "Error Event Logging/Tracing", + "description": "Logs or traces document load failures in alignment with existing diagnostics expectations.", + "source_line": null + }, + { + "name": "UI Test Coverage for Error Path", + "description": "Automated UI tests that verify the error banner appears, persists until acknowledged, and clears upon dismissal or successful retry.", + "source_line": null + }, + { + "name": "View Model Regression Tests", + "description": "XCTest view model tests ensuring the banner remains until acknowledged and does not regress future success flows.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1769, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/Summary_of_Work_metrics.json new file mode 100644 index 00000000..086cf2e4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/Summary_of_Work_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/66_E5_Surface_Document_Load_Failures/Summary_of_Work.md", + "n_spec": 8, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a DocumentLoadFailure state in DocumentSessionController to allow the SwiftUI app shell to react to unreadable files.", + "source_line": null + }, + { + "type": "user_story", + "description": "Display a DocumentLoadFailureBanner overlay in AppShellView with retry and \"Open File\u2026\" controls that use controller APIs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The banner must appear when a document load failure occurs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Retry action clears the failure state and removes the banner.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Open File\u2026 action triggers file picker to open a new file.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The banner should automatically clear on retry.", + "source_line": null + }, + { + "type": "invariant", + "description": "DocumentLoadFailure state must always be available in DocumentSessionController.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose document load failure state and retry/dismissal affordances via a published state variable.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DocumentLoadFailure State", + "description": "Represents a failure state in DocumentSessionController when a document cannot be loaded, exposing retry and dismissal options.", + "source_line": null + }, + { + "name": "DocumentLoadFailureBanner Overlay", + "description": "UI component displayed over AppShellView to inform users of load failures with actionable retry and Open File controls.", + "source_line": null + }, + { + "name": "Retry Action API", + "description": "Endpoint exposed by DocumentSessionController allowing the app shell to trigger a document reload after a failure.", + "source_line": null + }, + { + "name": "Open File Action API", + "description": "Endpoint exposed by DocumentSessionController enabling the user to select a new file when a load failure occurs.", + "source_line": null + }, + { + "name": "Automatic Banner Clearing Logic", + "description": "Behavior that clears the DocumentLoadFailureBanner automatically upon successful retry or dismissal.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1065, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/Summary_of_Work_metrics.json new file mode 100644 index 00000000..68d379da --- /dev/null +++ b/DOCS/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/Summary_of_Work_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/Summary_of_Work.md", + "n_spec": 0, + "n_func": 3, + "intent_atoms": [], + "functional_units": [ + { + "name": "Document Load Failure State Controller", + "description": "Publishes a load failure state for documents and surfaces it via SwiftUI banner with retry/dismiss controls.", + "source_line": null + }, + { + "name": "SwiftUI Banner for Document Load Failures", + "description": "Displays an observable banner in the UI when document loading fails, providing retry and dismiss options.", + "source_line": null + }, + { + "name": "Unit/UI Coverage Extension for Failure Handling", + "description": "Extends unit and UI test coverage to validate document load failure handling and banner behavior.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 603, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/next_tasks_metrics.json new file mode 100644 index 00000000..77df497f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/next_tasks_metrics.json @@ -0,0 +1,47 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/67_Summary_of_Work_2025-10-16/next_tasks.md", + "n_spec": 7, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Surface document load failures in the app shell UI once the error banner design is ready.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow introduced in the specified documentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics on a platform that ships Combine, keeping throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "user_story", + "description": "Surface session persistence errors once diagnostics plumbing is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules are defined.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Track outcome of the notarized build Apple Events automation assessment alongside todo entry and reference final decision in specified documentation.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2581, + "line_count": 27 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/E6_Emit_Persistence_Diagnostics_metrics.json b/DOCS/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/E6_Emit_Persistence_Diagnostics_metrics.json new file mode 100644 index 00000000..f7d9107b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/E6_Emit_Persistence_Diagnostics_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/E6_Emit_Persistence_Diagnostics.md", + "n_spec": 8, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Instrument session and recents persistence flows to surface failures through shared diagnostics logging pipeline.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Persistence failures in DocumentSessionController.persistRecents() and persistSession() emit errors via DiagnosticsLogger with metadata (file URL, session identifier).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "QA automation simulates recents/session write failures and asserts diagnostics entries are produced without crashing the app shell.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "User-facing behavior remains unchanged when persistence succeeds: recents and session state still save/restore via existing CoreData and JSON stores.", + "source_line": null + }, + { + "type": "invariant", + "description": "Diagnostics emission must compile cross-platform (macOS/iOS/iPadOS) without os.log availability, following DiagnosticsLogger conditional compilation pattern.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Replace @todo markers in DocumentSessionController with concrete logging using shared diagnostics subsystem instead of ad-hoc print calls.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Capture contextual metadata (workspace/session IDs, failing file URLs) in logged messages for telemetry dashboards and CLI/app smoke tests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend test coverage to inject failing RecentsStore / WorkspaceSessionStore collaborators and validate diagnostics emission without persisting partial state.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Diagnostics Logging for Persistence Failures", + "description": "Logs errors from DocumentSessionController.persistRecents() and persistSession() via DiagnosticsLogger with metadata such as file URL and session identifier.", + "source_line": null + }, + { + "name": "Simulated Failure Testing for Recents/Session Persistence", + "description": "Unit/integration tests that inject failing RecentsStore or WorkspaceSessionStore to verify diagnostics emission without crashing the app.", + "source_line": null + }, + { + "name": "Cross-Platform Diagnostics Helper Extension", + "description": "Adds diagnostics helpers compatible with macOS/iOS/iPadOS, using conditional compilation to avoid os.log dependency.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3083, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ea94fa05 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/Summary_of_Work_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/68_E6_Emit_Persistence_Diagnostics/Summary_of_Work.md", + "n_spec": 6, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Log recents store write failures through DiagnosticsLogger with focused document context and persisted file paths", + "source_line": null + }, + { + "type": "user_story", + "description": "Emit diagnostics when session snapshot saves or clears fail due to persistence errors, capturing session identifier and focused file URL", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Expose a shared DiagnosticsLogging protocol for dependency injection and unit testing of diagnostics", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Diagnostics must be logged for recents store write failures with context and persisted paths", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Diagnostics must be emitted on session snapshot save/clear persistence errors, including session ID and focused file URL", + "source_line": null + }, + { + "type": "invariant", + "description": "Successful flows should not alter when diagnostics are added", + "source_line": null + } + ], + "functional_units": [ + { + "name": "DocumentSessionController Recents Store Failure Logging", + "description": "Logs failures when writing to the recents store via DiagnosticsLogger, including focused document context and persisted file paths.", + "source_line": null + }, + { + "name": "Session Snapshot Persistence Error Diagnostics", + "description": "Emits diagnostics on session snapshot save/clear failures, capturing session identifier and focused file URL for triage.", + "source_line": null + }, + { + "name": "DiagnosticsLogging Protocol Exposure", + "description": "Provides a shared protocol for dependency-injected diagnostics logging, enabling unit testing with concrete logger implementations.", + "source_line": null + }, + { + "name": "DocumentSessionController Tests with Stub Stores and Diagnostics Spy", + "description": "Unit tests that use stub stores and a diagnostics spy to validate error logging without affecting successful flows.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1609, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/G1_FilesystemAccessKit_Core_API_metrics.json b/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/G1_FilesystemAccessKit_Core_API_metrics.json new file mode 100644 index 00000000..7a65da5b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/G1_FilesystemAccessKit_Core_API_metrics.json @@ -0,0 +1,108 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/G1_FilesystemAccessKit_Core_API.md", + "n_spec": 10, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a unified FilesystemAccessKit surface exposing async openFile, saveFile, createBookmark, and resolveBookmarkData operations for ISOInspector targets across macOS, iOS, and iPadOS.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Async APIs return security-scoped URLs validated by unit tests covering bookmark creation, resolution, and failure recovery scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Platform adapters bridge the shared API to NSOpenPanel/NSSavePanel on macOS and UIDocumentPickerViewController on iOS/iPadOS without regressing existing document commands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bookmark data persists alongside recents/session stores with migration notes for integrating Phase G2 once defined.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Logging and diagnostics redact absolute paths while capturing hashed identifiers so compliance requirements remain intact.", + "source_line": null + }, + { + "type": "invariant", + "description": "The core module must integrate with existing diagnostics and persistence infrastructure, ensuring security-scoped access and zero-trust logging are maintained.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse entitlements and notarization artifacts from Task E4, verifying sandbox profiles expose com.apple.security.files.user-selected.read-write and bookmark scopes before wiring new APIs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Model bookmark persistence in a dedicated store under Application Support with identifiers referenced by existing recents/session entities; include reconciliation hooks for future G2 work.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide CLI affordances or stubs that accept pre-authorized paths, aligning with sandbox profile guidance.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Document access auditing and error surfaces so diagnostics align with the persistence logging already emitting recents/session failures.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "openFile API", + "description": "Asynchronously opens a user-selected file and returns a security-scoped URL", + "source_line": null + }, + { + "name": "saveFile API", + "description": "Asynchronously saves data to a user-selected location and returns a security-scoped URL", + "source_line": null + }, + { + "name": "createBookmark API", + "description": "Creates a persistent bookmark for a given file URL and stores it in the application support store", + "source_line": null + }, + { + "name": "resolveBookmarkData API", + "description": "Resolves a stored bookmark back into an accessible URL, handling failure recovery", + "source_line": null + }, + { + "name": "macOS NSOpenPanel adapter", + "description": "Bridges the shared openFile API to macOS's NSOpenPanel UI component", + "source_line": null + }, + { + "name": "macOS NSSavePanel adapter", + "description": "Bridges the shared saveFile API to macOS's NSSavePanel UI component", + "source_line": null + }, + { + "name": "iOS/iPadOS UIDocumentPickerViewController adapter", + "description": "Bridges the shared file operations to iOS/iPadOS document picker UI", + "source_line": null + }, + { + "name": "Bookmark persistence store", + "description": "Dedicated storage under Application Support for bookmark data linked to recents/session entities", + "source_line": null + }, + { + "name": "Logging and diagnostics module", + "description": "Redacts absolute paths, logs hashed identifiers, and records access audit events", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2695, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/Summary_of_Work_metrics.json new file mode 100644 index 00000000..06eed0b0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/Summary_of_Work_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/Summary_of_Work.md", + "n_spec": 12, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement FilesystemAccess facade with asynchronous openFile, saveFile, createBookmark, and resolveBookmarkData operations for sandbox compliance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FilesystemAccess facade must support security-scoped URL activation, hashed logging, and bookmark helpers as specified in the source files.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add macOS-only FilesystemAccess.live() adapter that bridges to NSOpenPanel/NSSavePanel for file dialogs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FilesystemAccess.live() must expose shared flows without regressing sandbox behaviour and integrate UIDocumentPicker adapters on iOS/iPadOS.", + "source_line": null + }, + { + "type": "user_story", + "description": "Wire the new facade into app and CLI entry points, persisting bookmarks alongside recents/session stores per Phase G workplan.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bookmarks must be persisted correctly and integrated with existing recents and session storage mechanisms.", + "source_line": null + }, + { + "type": "invariant", + "description": "Security-scoped bookmarks must remain valid across app launches and sandbox boundaries.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a facade pattern for FilesystemAccess to abstract platform-specific file access logic.", + "source_line": null + }, + { + "type": "user_story", + "description": "Create focused unit tests covering successful access flows, stale bookmark handling, authorization failures, and logging behaviours.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests must verify all specified scenarios and log outputs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement a separate test suite for the FilesystemAccess API.", + "source_line": null + }, + { + "type": "user_story", + "description": "Decompose Secure\u00a0File\u00a0Syst\u2026", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FilesystemAccess facade", + "description": "Asynchronous API for opening, saving files and managing bookmarks with security-scoped URL activation", + "source_line": null + }, + { + "name": "createBookmark operation", + "description": "Creates a bookmark for a file URL", + "source_line": null + }, + { + "name": "resolveBookmarkData operation", + "description": "Resolves data from an existing bookmark", + "source_line": null + }, + { + "name": "openFile operation", + "description": "Opens a file asynchronously using the facade", + "source_line": null + }, + { + "name": "saveFile operation", + "description": "Saves a file asynchronously using the facade", + "source_line": null + }, + { + "name": "FilesystemAccess.live adapter (macOS)", + "description": "Bridges to NSOpenPanel/NSSavePanel for user file selection on macOS", + "source_line": null + }, + { + "name": "UIDocumentPicker integration (iOS/iPadOS)", + "description": "Adapter for document picker to expose shared flows without regressing sandbox behaviour", + "source_line": null + }, + { + "name": "DiagnosticsLogger integration", + "description": "Logs persistence errors with focused file and session metadata", + "source_line": null + }, + { + "name": "DiagnosticsLogging protocol", + "description": "Protocol for deterministic unit testing of diagnostics logging", + "source_line": null + }, + { + "name": "Persistence error reporting in DocumentSessionController", + "description": "Captures recents and session persistence failure paths to diagnostics", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 6001, + "line_count": 83 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/next_tasks_metrics.json new file mode 100644 index 00000000..789d00e1 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/next_tasks_metrics.json @@ -0,0 +1,62 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/69_G1_FilesystemAccessKit_Core_API/next_tasks.md", + "n_spec": 0, + "n_func": 10, + "intent_atoms": [], + "functional_units": [ + { + "name": "FilesystemAccessKit Core APIs", + "description": "Provides file system operations such as openFile, saveFile, createBookmark, and resolveBookmarkData for user-selected files.", + "source_line": null + }, + { + "name": "Bookmark Persistence Schema Design", + "description": "Defines a schema to persist bookmarks aligned with recents/session storage for seamless integration.", + "source_line": null + }, + { + "name": "CLI Sandbox Profile Guidance", + "description": "Offers guidance on sandbox profiles covering com.apple.security.files.user-selected.read-write and automation workflows for headless usage.", + "source_line": null + }, + { + "name": "Random Slice Benchmark Execution", + "description": "Runs random slice benchmark suite on macOS to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "name": "ParseTree Streaming Selection Automation Tests", + "description": "Executes SwiftUI automation flow tests for parse tree streaming selection on macOS hardware.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark Execution", + "description": "Captures latency metrics for Combine-backed UI benchmark on macOS, maintaining throughput parity with CLI harness.", + "source_line": null + }, + { + "name": "Session Persistence Error Surface", + "description": "Surfaces session persistence errors through diagnostics plumbing once logging pipeline is available.", + "source_line": null + }, + { + "name": "CoreData Session Bookmark Reconciliation", + "description": "Reconciles CoreData session bookmark diffs with live bookmark entities based on defined reconciliation rules.", + "source_line": null + }, + { + "name": "Recents Persistence Error Surface", + "description": "Surfaces recents persistence errors via diagnostics plumbing once logging pipeline is available.", + "source_line": null + }, + { + "name": "Notarized Build Apple Events Automation Tracking", + "description": "Tracks outcomes of notarized build Apple Events automation assessment and extends entitlements safely.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3630, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/2025-10-16-bookmark-persistence-schema_metrics.json b/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/2025-10-16-bookmark-persistence-schema_metrics.json new file mode 100644 index 00000000..941c9aea --- /dev/null +++ b/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/2025-10-16-bookmark-persistence-schema_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/2025-10-16-bookmark-persistence-schema.md", + "n_spec": 10, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Design a shared bookmark persistence schema so recents and workspace sessions can reference a single security-scoped bookmark record.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Kit: BookmarkPersistenceStore with versioned JSON format and resolution metadata must be implemented.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI should not have direct changes yet; future integrations will load bookmark identifiers when wiring sandbox profiles.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "App components DocumentRecent/WorkspaceSessionFileSnapshot must track bookmark identifiers and CoreData session persistence mirrors the new field.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Public Kit API BookmarkPersistenceStore and nested Record must be added or changed as specified.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Call sites such as DocumentSessionController, CoreData session persistence, recents/session tests must be updated to use the new API.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing JSON/CoreData payloads must decode with default nil bookmark identifiers for backward compatibility.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests must include BookmarkPersistenceStoreTests and updated recents/sessions persistence tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "Bookmark persistence records capture canonical file URLs, resolution state, and timestamps.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The schema is additive; new fields are added without breaking existing payloads.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BookmarkPersistenceStore", + "description": "Provides storage and retrieval of bookmark records in a versioned JSON format with resolution metadata.", + "source_line": null + }, + { + "name": "BookmarkPersistenceStore.Record", + "description": "Represents an individual bookmark record containing canonical file URL, resolution state, timestamps, and optional identifier.", + "source_line": null + }, + { + "name": "DocumentRecent integration", + "description": "Tracks bookmark identifiers for recent documents within the app's recents feature.", + "source_line": null + }, + { + "name": "WorkspaceSessionFileSnapshot integration", + "description": "Stores bookmark identifiers in workspace session snapshots to enable persistence across sessions.", + "source_line": null + }, + { + "name": "CoreData session persistence update", + "description": "Mirrors new bookmark identifier field in CoreData session records for consistency with the store.", + "source_line": null + }, + { + "name": "DocumentSessionController API changes", + "description": "Updated to use BookmarkPersistenceStore for managing document session data, including bookmark handling.", + "source_line": null + }, + { + "name": "Recents and Session tests", + "description": "Unit tests ensuring correct encoding/decoding of bookmark identifiers in recents and workspace sessions.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1720, + "line_count": 31 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/Summary_of_Work_metrics.json new file mode 100644 index 00000000..acc48664 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/Summary_of_Work.md", + "n_spec": 0, + "n_func": 4, + "intent_atoms": [], + "functional_units": [ + { + "name": "Bookmark Persistence Store", + "description": "Provides a versioned JSON format for storing and resolving security-scoped bookmark identifiers used by recents and session snapshots.", + "source_line": null + }, + { + "name": "Recents Session Snapshot Integration", + "description": "Extends DocumentRecent and WorkspaceSessionFileSnapshot to include bookmark identifiers, enabling persistence of recent files and workspace sessions via the BookmarkPersistenceStore.", + "source_line": null + }, + { + "name": "CoreData Session Persistence Extension", + "description": "Adds support for storing bookmark identifiers in CoreData session persistence without breaking existing data formats.", + "source_line": null + }, + { + "name": "Bookmark Persistence Store Tests", + "description": "Unit tests exercising the new bookmark persistence schema and resolution tracking.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1152, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/next_tasks_metrics.json new file mode 100644 index 00000000..da0af457 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/next_tasks_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/70_Bookmark_Persistence_Schema/next_tasks.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Design bookmark persistence schema aligned with existing recents/session storage so Phase G (Workplan) can integrate without data loss.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bookmark persistence schema must be compatible with existing recents/session storage and allow integration in Phase G without data loss.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use the same persistence schema for bookmarks as used for recents/session storage to maintain consistency across phases.", + "source_line": null + }, + { + "type": "user_story", + "description": "Draft CLI sandbox profile guidance covering com.apple.security.files.user-selected.read-write and automation workflows for headless usage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI sandbox profile guidance must include permissions for user-selected read-write access and describe automation workflows for headless environments.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results should show comparable performance between mapped and chunked readers under identical workloads on macOS with Combine.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate end\u2011to\u2011end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test suite must run successfully on mac\u00a0macOS\u00a0..", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Bookmark Persistence Schema Design", + "description": "Defines the data schema for persisting bookmarks aligned with existing recents/session storage to enable Phase G integration without data loss.", + "source_line": null + }, + { + "name": "CLI Sandbox Profile Guidance Drafting", + "description": "Creates documentation and guidance for CLI sandbox profiles covering user-selected file read-write permissions and automation workflows for headless usage.", + "source_line": null + }, + { + "name": "Random Slice Benchmark Execution", + "description": "Runs the random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers under identical workloads once Combine support is available.", + "source_line": null + }, + { + "name": "ParseTree Streaming Selection Automation Tests", + "description": "Executes XCTest UI tests for ParseTree streaming selection automation flow in SwiftUI on macOS hardware to validate end-to-end functionality.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark Execution", + "description": "Runs the Combine-supported UI benchmark on macOS to capture latency metrics while maintaining CLI harness throughput parity.", + "source_line": null + }, + { + "name": "CoreData Session Bookmark Reconciliation", + "description": "Reconciles CoreData session bookmark differences with live bookmark entities once reconciliation rules are defined.", + "source_line": null + }, + { + "name": "Notarized Build Apple Events Automation Assessment Tracking", + "description": "Tracks the outcome of notarized build Apple Events automation assessment and evaluates the need for automation via Apple Events, extending entitlements safely.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2739, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/G2_Persist_FilesystemAccessKit_Bookmarks_metrics.json b/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/G2_Persist_FilesystemAccessKit_Bookmarks_metrics.json new file mode 100644 index 00000000..1be27f90 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/G2_Persist_FilesystemAccessKit_Bookmarks_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/G2_Persist_FilesystemAccessKit_Bookmarks.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver bookmark persistence that unifies security-scoped bookmark storage across recents and session controllers using the shared BookmarkPersistenceStore so files reopen without re-authorization after relaunch.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Recents and session persistence flows write and resolve bookmark identifiers exclusively through BookmarkPersistenceStore, covering both JSON and CoreData code paths.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing persisted data without bookmark identifiers continues to decode, adopting the new identifiers once files are re-authorized.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests updated in DocumentRecentsStoreTests, WorkspaceSessionStoreTests, and related controller tests validate bookmark survival across save/load and migration scenarios.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in user-facing guides and CLI/app notes references the unified bookmark persistence behavior and re-authorization expectations.", + "source_line": null + }, + { + "type": "invariant", + "description": "Dependencies satisfied: G1 core API shipped and E3 session persistence completed before implementation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update CoreData models and JSON payload structs to store bookmark identifiers, ensuring migrations follow the existing lightweight migration strategy captured in the session persistence archive.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit BookmarkPersistenceStore @todo markers for integration touchpoints, covering both SwiftUI app controllers and CLI sandbox adapters planned for G3.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with forthcoming CLI sandbox guidance to avoid schema drift; any new fields should be versioned within the store to remain forward-compatible.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "BookmarkPersistenceStore API", + "description": "Provides read/write operations for bookmark identifiers used by recents and session controllers, supporting both CoreData and JSON storage paths.", + "source_line": null + }, + { + "name": "Recents Persistence Flow", + "description": "Writes and resolves bookmark identifiers through BookmarkPersistenceStore when saving and loading recent files.", + "source_line": null + }, + { + "name": "Session Persistence Flow", + "description": "Writes and resolves bookmark identifiers through BookmarkPersistenceStore during workspace session save/load operations.", + "source_line": null + }, + { + "name": "Migration Handler for Existing Data", + "description": "Decodes legacy persisted data without bookmark IDs, assigns new identifiers upon re-authorization, and updates storage.", + "source_line": null + }, + { + "name": "Unit Test Suites", + "description": "Tests in DocumentRecentsStoreTests, WorkspaceSessionStoreTests, and controller tests that validate bookmark survival across save/load and migration scenarios.", + "source_line": null + }, + { + "name": "Documentation Updates", + "description": "User-facing guides and CLI/app notes describing unified bookmark persistence behavior and re-authorization expectations.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2807, + "line_count": 44 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b1ff6955 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/Summary_of_Work.md", + "n_spec": 3, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "Bookmark identifiers must be persisted consistently across the recents JSON store and workspace session snapshots.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Introduce a BookmarkPersistenceManaging abstraction to provide a consistent bookmark store contract for UI controllers and tests, enabling dependency injection for deterministic TDD scenarios.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provision a shared BookmarkPersistenceStore in ISOInspectorApp composition alongside the recents directory.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Bookmark Persistence Store", + "description": "Provides unified persistence of bookmark identifiers across recents JSON store and workspace session snapshots, normalizing payloads and migrating existing data.", + "source_line": null + }, + { + "name": "Document Session Controller Integration", + "description": "Wires BookmarkPersistenceStore into DocumentSessionController to manage bookmark state within document sessions.", + "source_line": null + }, + { + "name": "Bookmark Persistence Managing Abstraction", + "description": "Defines a shared contract for bookmark storage used by UI controllers and tests, enabling dependency injection for deterministic testing.", + "source_line": null + }, + { + "name": "ISOInspectorApp Composition Update", + "description": "Configures ISOInspectorApp to provision a shared BookmarkPersistenceStore alongside the recents directory.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1096, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/next_tasks_metrics.json new file mode 100644 index 00000000..fa108f80 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/next_tasks_metrics.json @@ -0,0 +1,47 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/71_G2_Persist_FilesystemAccessKit_Bookmarks/next_tasks.md", + "n_spec": 0, + "n_func": 7, + "intent_atoms": [], + "functional_units": [ + { + "name": "Bookmark Persistence Store Integration", + "description": "Persist FilesystemAccessKit bookmarks alongside recents/session storage controllers using shared BookmarkPersistenceStore in CoreData and JSON flows", + "source_line": null + }, + { + "name": "Filesystem Access CLI Sandbox Guidance", + "description": "Provide guidance for sandbox profiles covering com.apple.security.files.user-selected.read-write and automation workflows for headless usage", + "source_line": null + }, + { + "name": "Random Slice Benchmark Execution", + "description": "Execute random slice benchmark suite on macOS to compare mapped vs. chunked readers under identical workloads", + "source_line": null + }, + { + "name": "ParseTree Streaming Selection Automation Tests", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI support to validate SwiftUI automation flow", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark Execution", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining CLI throughput parity", + "source_line": null + }, + { + "name": "Session Bookmark Reconciliation", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities according to defined reconciliation rules", + "source_line": null + }, + { + "name": "Notarized Build Apple Events Automation Assessment", + "description": "Track outcome of notarized build Apple Events automation assessment and evaluate entitlements for notarized builds", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3153, + "line_count": 32 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/G3_Expose_CLI_Sandbox_Profile_Guidance_metrics.json b/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/G3_Expose_CLI_Sandbox_Profile_Guidance_metrics.json new file mode 100644 index 00000000..24fb29c3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/G3_Expose_CLI_Sandbox_Profile_Guidance_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/G3_Expose_CLI_Sandbox_Profile_Guidance.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide actionable CLI documentation that explains how to run ISOInspector headlessly with sandbox profiles, including the --open/--authorize automation path backed by FilesystemAccessKit.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Guidance document describes required entitlements and shows a signed sandbox profile snippet granting com.apple.security.files.user-selected.read-write access for pre-approved paths.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Instructions cover invoking the CLI with FilesystemAccessKit-aware flags (--open, --authorize) and how to supply pre-authorized bookmarks or security-scoped URLs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Runbook clarifies notarization or codesign prerequisites for distributing the sandbox profile to automation systems.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Verification checklist enumerates how to confirm access works (e.g., running swift test --disable-sandbox locally, executing CLI against sample files) and references archival validation notes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Headless flows must rely on security-scoped bookmarks and sandbox profile allowances rather than unsandboxed execution.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse entitlement configuration from Distribution/Entitlements/ to ensure CLI documentation matches shipping profiles; highlight differences between macOS app sandboxing and headless automation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reference FilesystemAccessKit APIs (openFile, createBookmark, resolveBookmarkData) so operators understand how CLI commands activate security-scoped bookmarks during execution.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Include troubleshooting tips for bookmark expiry, revocation, and telemetry logging so automation runs remain auditable under zero-trust policies.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Sandbox Profile Guidance Document", + "description": "Provides actionable documentation for running ISOInspector headlessly with sandbox profiles, including required entitlements and signed profile snippets.", + "source_line": null + }, + { + "name": "Signed Sandbox Profile Snippet", + "description": "A code snippet granting com.apple.security.files.user-selected.read-write access for pre-approved paths.", + "source_line": null + }, + { + "name": "FilesystemAccessKit-aware CLI Flags", + "description": "Instructions on using --open and --authorize flags to supply pre-authorized bookmarks or security-scoped URLs.", + "source_line": null + }, + { + "name": "Notarization & Code Signing Checklist", + "description": "Runbook clarifying notarization or codesign prerequisites for distributing the sandbox profile to automation systems.", + "source_line": null + }, + { + "name": "Verification Checklist", + "description": "Steps to confirm access works, such as running swift test --disable-sandbox locally and executing CLI against sample files.", + "source_line": null + }, + { + "name": "Entitlement Configuration Reference", + "description": "Reuse of entitlement configuration from Distribution/Entitlements/ ensuring CLI documentation matches shipping profiles.", + "source_line": null + }, + { + "name": "FilesystemAccessKit API Usage Guide", + "description": "Reference to openFile, createBookmark, resolveBookmarkData APIs for operators to understand bookmark activation during execution.", + "source_line": null + }, + { + "name": "Troubleshooting & Telemetry Tips", + "description": "Guidance on bookmark expiry, revocation, and telemetry logging for auditable automation runs.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2676, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/Summary_of_Work_metrics.json new file mode 100644 index 00000000..fa2b8fcb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/Summary_of_Work_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/Summary_of_Work.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide operators with a CLI sandbox automation guide that documents pairing isoinspector with signed sandbox profiles, FilesystemAccessKit bookmarks, and the --open/--authorize workflow for headless execution.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The guide must link to the CLI manual and program documentation so operators can discover sandbox automation requirements alongside existing command help.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The guide must include a minimal .sb allowlist that highlights existing App Sandbox entitlements and maps FilesystemAccessKit APIs (openFile, resolveBookmarkData) to CLI automation commands.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The guide must provide troubleshooting and verification checklists covering stale bookmark handling, sandbox profile signing, and the swift test --disable-sandbox regression run.", + "source_line": null + }, + { + "type": "invariant", + "description": "Sandbox automation flows must stay aligned with security expectations when future code changes occur.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a minimal .sb allowlist to expose only necessary App Sandbox entitlements for CLI sandbox automation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Sandbox Automation Guide", + "description": "Documentation detailing how to pair isoinspector with signed sandbox profiles, FilesystemAccessKit bookmarks, and the --open/--authorize workflow for headless execution.", + "source_line": null + }, + { + "name": "CLI Manual Integration", + "description": "Links the CLI manual and program documentation back to the new guide so operators can discover sandbox automation requirements alongside existing command help.", + "source_line": null + }, + { + "name": "Minimal Sandbox Allowlist", + "description": "Provides a minimal .sb allowlist mapping App Sandbox entitlements and FilesystemAccessKit APIs (openFile, resolveBookmarkData) to CLI automation commands.", + "source_line": null + }, + { + "name": "Stale Bookmark Handling Checklist", + "description": "Verification steps for handling stale bookmarks during sandbox profile signing and headless execution.", + "source_line": null + }, + { + "name": "Sandbox Profile Signing Verification", + "description": "Checklist for verifying that sandbox profiles are correctly signed before use.", + "source_line": null + }, + { + "name": "Swift Test Disable Sandbox Command", + "description": "Command 'swift test --disable-sandbox' used to run tests without the sandbox for verification purposes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1999, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/next_tasks_metrics.json new file mode 100644 index 00000000..7226df18 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/next_tasks_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/next_tasks.md", + "n_spec": 3, + "n_func": 8, + "intent_atoms": [ + { + "type": "invariant", + "description": "CLI sandbox runs must emit hashed telemetry that can be audited alongside bookmark activations.", + "source_line": null + }, + { + "type": "user_story", + "description": "Add end-to-end tests that exercise the --open/--authorize flags once automation harnesses land, ensuring bookmark resolution failures surface actionable errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Capture notarized distribution example (DMG/ZIP) that bundles the sandbox profile and document the verification checklist in release notes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Sandbox Profile Guidance", + "description": "Provides guidance for configuring and using sandbox profiles in the CLI", + "source_line": null + }, + { + "name": "Zero-Trust Logging for CLI Sandbox", + "description": "Logs hashed telemetry from CLI sandbox runs for audit purposes", + "source_line": null + }, + { + "name": "Bookmark Activation Auditing", + "description": "Allows auditing of bookmark activations alongside CLI sandbox logs", + "source_line": null + }, + { + "name": "--open Flag Functionality", + "description": "Enables opening resources via the CLI with specified parameters", + "source_line": null + }, + { + "name": "--authorize Flag Functionality", + "description": "Handles authorization flows when using the CLI", + "source_line": null + }, + { + "name": "End-to-End Testing for --open and --authorize Flags", + "description": "Runs automated tests to validate flag behavior and error handling", + "source_line": null + }, + { + "name": "Notarized Distribution Packaging", + "description": "Creates a notarized DMG/ZIP bundle that includes the sandbox profile", + "source_line": null + }, + { + "name": "Verification Checklist Documentation", + "description": "Documents verification steps in release notes", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 646, + "line_count": 5 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/Summary_of_Work_metrics.json new file mode 100644 index 00000000..dd028cdd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/Summary_of_Work_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/Summary_of_Work.md", + "n_spec": 0, + "n_func": 3, + "intent_atoms": [], + "functional_units": [ + { + "name": "ISOInspector CLI Sandbox Automation Guide", + "description": "Provides sample profiles, bookmark workflows, and verification checklists for automating ISOInspector sandbox tasks via the command line.", + "source_line": null + }, + { + "name": "CLI Manual Update", + "description": "Updates the ISOInspector command-line interface manual to reference new sandbox guidance and mark milestone completion.", + "source_line": null + }, + { + "name": "Planning Artifacts Update", + "description": "Revisions to workplan, PRD TODO, and next task tracker documents to reflect updated CLI guidance and milestones.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1096, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/next_tasks_metrics.json new file mode 100644 index 00000000..9469c406 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/next_tasks_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/73_Sandbox_Profile_Guidance_Sprint/next_tasks.md", + "n_spec": 10, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Draft CLI sandbox profile guidance covering com.apple.security.files.user-selected.read-write and automation workflows for headless usage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Guidance published in Documentation/ISOInspector.docc/Guides/CLISandboxProfileGuide.md and archived under DOCS/TASK_ARCHIVE/72_G3_Expose_CLI_Sandbox_Profile_Guidance/.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark execution requires macOS runner with Combine; blocked until available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Testing requires macOS UI testing entitlements; currently blocked due to unavailable entitlements in container.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark requires macOS runner with Xcode/Combine; blocked until available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules are defined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track outcome of the notarized build Apple Events automation assessment and evaluate whether automation via Apple Events is required for notarized builds and extend entitlements safely.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Sandbox Profile Guidance", + "description": "Provides guidance for enabling filesystem access via com.apple.security.files.user-selected.read-write in CLI sandbox profiles and automation workflows for headless usage.", + "source_line": null + }, + { + "name": "Filesystem Access Kit Baseline Reference", + "description": "Reference to archived FilesystemAccessKit baseline documentation used as a foundation for sandbox profile guidance.", + "source_line": null + }, + { + "name": "Persistence Summary Documentation", + "description": "Summary of work on persisting filesystem access bookmarks, documenting persistence strategies.", + "source_line": null + }, + { + "name": "Random Slice Benchmark Execution", + "description": "Execution of random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "name": "ParseTree Streaming Selection Automation Tests", + "description": "Runs XCTest UI tests for SwiftUI automation flow that streams parse tree selections.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark Execution", + "description": "Executes Combine-backed UI benchmark on macOS to capture latency metrics while maintaining CLI harness throughput parity.", + "source_line": null + }, + { + "name": "CoreData Session Bookmark Reconciliation", + "description": "Reconciles CoreData session bookmark differences with live bookmark entities once reconciliation rules are defined.", + "source_line": null + }, + { + "name": "Notarized Build Apple Events Automation Assessment", + "description": "Tracks outcome of notarized build assessment for automation via Apple Events and extends entitlements safely.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2815, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/G4_Zero_Trust_Logging_metrics.json b/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/G4_Zero_Trust_Logging_metrics.json new file mode 100644 index 00000000..2015b24e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/G4_Zero_Trust_Logging_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/G4_Zero_Trust_Logging.md", + "n_spec": 10, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide zero-trust logging for FilesystemAccessKit so that file access events record hashed identifiers and redact absolute paths while exposing an auditable trail for sandbox compliance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Access logging layer produces hashed handles and timestamped events without leaking raw file paths.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover log hashing, rotation, and failure cases for bookmark resolution.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI automation emits the same redacted diagnostics so documentation examples remain accurate.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Logging hooks integrate with existing persistence diagnostics without duplicating identifiers.", + "source_line": null + }, + { + "type": "invariant", + "description": "Hashed identifiers must be used instead of raw file paths in all logged events.", + "source_line": null + }, + { + "type": "invariant", + "description": "Log entries must include ISO 8601 timestamps and be bounded by rotation limits.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend FilesystemAccessKit logging utilities before wiring through app and CLI targets to avoid API churn.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing diagnostics infrastructure from session persistence work to attach hashed bookmark IDs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with sandbox profile guidance to document any new environment variables or flags required for audit exports.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FilesystemAccessAuditTrail", + "description": "Records timestamped audit entries for every FilesystemAccessKit operation with hashed identifiers and bounded rotation", + "source_line": null + }, + { + "name": "FilesystemAccessAuditEvent", + "description": "Represents a single audit event containing hashed handle, timestamp, and sanitized diagnostics", + "source_line": null + }, + { + "name": "LoggingAdapters", + "description": "Emit ISO 8601 timestamps, redact error details, and expose sanitized diagnostics for bookmark operations", + "source_line": null + }, + { + "name": "UnitTestSuite_FilesystemAccessAuditTrailTests", + "description": "Verifies hashing, rotation limits, and failure handling of the audit trail", + "source_line": null + }, + { + "name": "UnitTestSuite_FilesystemAccessLoggerTests", + "description": "Ensures logging utilities correctly hash identifiers and redact paths", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2851, + "line_count": 58 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/Summary_of_Work_metrics.json new file mode 100644 index 00000000..666a028b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/Summary_of_Work.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "FilesystemAccessAuditEvent", + "description": "Structured audit event emitted for each filesystem access operation, containing hashed path identifiers and timestamped data.", + "source_line": null + }, + { + "name": "FilesystemAccessAuditTrail", + "description": "Rotating log store that records all FilesystemAccessAuditEvents with bounded rotation and redacted metadata.", + "source_line": null + }, + { + "name": "FilesystemAccessLogger", + "description": "Component responsible for formatting audit logs in ISO 8601 timestamps, sanitizing error metadata, and writing events to the audit trail.", + "source_line": null + }, + { + "name": "FilesystemAccess", + "description": "Core filesystem access module that emits structured audit events for open, save, and bookmark flows while preserving hashed path identifiers.", + "source_line": null + }, + { + "name": "CLI Bookmark Flow Integration", + "description": "Command-line interface flow that consumes FilesystemAccessAuditTrail events once zero-trust telemetry flags are enabled.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1642, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/next_tasks_metrics.json new file mode 100644 index 00000000..dd7c63ce --- /dev/null +++ b/DOCS/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/next_tasks_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/74_G4_Zero_Trust_Logging/next_tasks.md", + "n_spec": 6, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "Zero-Trust Logging must emit hashed identifiers, timestamped audit entries, and rotation-aware diagnostics aligned with CLI sandbox guidance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Random slice benchmark suite must be executed on macOS hardware once Combine support is available to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStreamingSelectionAutomationTests must run on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Combine-backed UI benchmark must be executed on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules are defined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track outcome of notarized build Apple Events automation assessment and reference final decision in documentation.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2546, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/PDD1h_Provide_UIDocumentPicker_Integration_metrics.json b/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/PDD1h_Provide_UIDocumentPicker_Integration_metrics.json new file mode 100644 index 00000000..df9b5186 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/PDD1h_Provide_UIDocumentPicker_Integration_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/PDD1h_Provide_UIDocumentPicker_Integration.md", + "n_spec": 9, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide UIDocumentPicker integration for iOS/iPadOS so sandboxed builds can open and save files using the shared FilesystemAccess API without relying on macOS-only panels.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A UIKit-backed adapter presents UIDocumentPickerViewController for open/save flows and delivers security-scoped URLs compatible with existing bookmark persistence.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Shared async FilesystemAccess API chooses the UIKit adapter when running on iOS/iPadOS without regressing macOS behaviour.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit or UI-level smoke coverage exercises the new adapter using dependency injection or targeted stubs to validate URL handling and sandbox scope lifetimes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation in the FilesystemAccess PRD/workplan reflects the completed iOS integration.", + "source_line": null + }, + { + "type": "invariant", + "description": "The FilesystemAccess.live() implementation must preserve AppKit behaviour on macOS while selecting UIKit presenter when AppKit is unavailable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Swift concurrency continuations (or Combine bridges) to await picker completion inside FilesystemAccess.live() while ensuring calls run on the main actor.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Provide injectable presenter hooks so SwiftUI scenes or controllers can trigger the picker without direct UIKit coupling in call sites.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with bookmark persistence stores to start/stop security-scoped resource access when the adapter resolves returned URLs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FilesystemDocumentPickerPresenter", + "description": "UIKit-backed factory that presents UIDocumentPickerViewController and returns selected URL via Swift concurrency continuations", + "source_line": null + }, + { + "name": "FilesystemAccess.live UIKit integration", + "description": "Runtime selection of the UIKit presenter on iOS/iPadOS while preserving AppKit behavior on macOS and allowing test stubs", + "source_line": null + }, + { + "name": "Security-scoped URL handling", + "description": "Bridging selected URLs to security-scoped resources for bookmark persistence, including start/stop access", + "source_line": null + }, + { + "name": "Dependency injection hooks for picker presentation", + "description": "Injectable presenter interfaces so SwiftUI scenes or controllers can trigger the picker without direct UIKit coupling", + "source_line": null + }, + { + "name": "Unit/UI smoke tests for adapter", + "description": "Tests exercising open/save flows and sandbox scope lifetimes using injected stubs or dependency injection", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3807, + "line_count": 55 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..85e70fa6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/Summary_of_Work.md", + "n_spec": 2, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide UIDocumentPicker integration for iOS/iPadOS once UIKit adapters are introduced.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The FilesystemAccessKit PRD success criteria must be satisfied by the UIKit adapter.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "UIDocumentPicker integration", + "description": "Provides a UIKit-backed presenter that surfaces UIDocumentPickerViewController for open/save flows and bridges completions via continuations.", + "source_line": null + }, + { + "name": "FilesystemDocumentPickerPresenter", + "description": "A class that presents UIDocumentPickerViewController and handles completion callbacks.", + "source_line": null + }, + { + "name": "UIKit presenter factory selection", + "description": "Logic in FilesystemAccess.live to select the UIKit presenter on iOS/iPadOS, retain AppKit behavior on macOS, and allow tests to inject custom presenters.", + "source_line": null + }, + { + "name": "FilesystemAccess live adapter", + "description": "Runtime component that chooses appropriate document picker presenter based on platform and test injections.", + "source_line": null + }, + { + "name": "FilesystemAccessTests for presenter injection", + "description": "Unit tests verifying that the live adapter consumes an injected presenter when AppKit is unavailable, ensuring CI coverage.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1109, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/next_tasks_metrics.json new file mode 100644 index 00000000..c2dc4b5b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/next_tasks_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/75_PDD1h_Provide_UIDocumentPicker_Integration/next_tasks.md", + "n_spec": 10, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute the random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results must show latency and throughput metrics for both mapped and chunked readers on macOS with Combine support.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test execution must complete successfully without skipping scenarios, confirming UI automation works on macOS.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark must run on macOS with Xcode/Combine and produce comparable latency data to the CLI version.", + "source_line": null + }, + { + "type": "invariant", + "description": "CoreData session bookmark diffs must be reconciled with live bookmark entities once reconciliation rules are defined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track outcome of the notarized build Apple Events automation assessment and reference final decision in documentation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Decision on whether automation via Apple Events is required for notarized builds must be documented and entitlements extended safely.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide UIDocumentPicker integration for iOS/iPadOS once UIKit adapters are introduced.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Random Slice Benchmark Execution", + "description": "Execute the random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "name": "ParseTree Streaming Selection Automation Tests", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI support to validate end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark Execution", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "name": "CoreData Session Bookmark Reconciliation", + "description": "Reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules are defined.", + "source_line": null + }, + { + "name": "Notarized Build Apple Events Automation Assessment", + "description": "Track outcome of notarized build Apple Events automation assessment and document decision on required automation via Apple Events.", + "source_line": null + }, + { + "name": "UIDocumentPicker Integration for iOS/iPadOS", + "description": "Provide UIDocumentPicker integration for iOS/iPadOS once UIKit adapters are introduced, routing FilesystemAccess.live to the UIKit adapter.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2423, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c6cdfc08 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 667, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/next_tasks_metrics.json new file mode 100644 index 00000000..acbca9fb --- /dev/null +++ b/DOCS/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/next_tasks_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/76_VR006_Preview_Audit_Integration/next_tasks.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate ResearchLogMonitor audit results into SwiftUI previews that render VR-006 research log entries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The integration of ResearchLogMonitor audit results must be visible in SwiftUI previews rendering VR-006 research log entries.", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLogMonitor audit results should always be available for preview rendering.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use SwiftUI previews to display VR-006 research log entries with integrated audit data.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2505, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks_metrics.json b/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks_metrics.json new file mode 100644 index 00000000..ab1052b5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks.md", + "n_spec": 6, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Reconcile CoreData session bookmark diff entities with persisted bookmark records so that the session store, recents list, and annotation features stay in sync after Task E3's persistence foundations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bookmark diff reconciliation updates or removes CoreData records without duplication or orphaned entries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automated tests cover add, update, and delete flows across CoreData and JSON-backed stores.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Session restoration continues to present the latest bookmark state in UI and CLI surfaces without regressions.", + "source_line": null + }, + { + "type": "invariant", + "description": "FilesystemAccessKit bookmark identifiers remain valid after reconciliation merges.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Review CoreDataAnnotationBookmarkStore and AnnotationBookmarkSession to confirm how diffs are generated and applied.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Bookmark Diff Reconciliation Engine", + "description": "Synchronizes CoreData bookmark diff entities with persisted bookmark records, handling additions, updates, and deletions without duplication or orphaned entries.", + "source_line": null + }, + { + "name": "CoreData Annotation Bookmark Store Integration", + "description": "Provides the data layer for storing and retrieving annotation bookmarks in CoreData, used by the reconciliation engine.", + "source_line": null + }, + { + "name": "Annotation Bookmark Session Manager", + "description": "Generates and applies bookmark diffs during a user session, interfacing with the CoreData store.", + "source_line": null + }, + { + "name": "Filesystem Access Kit Identifier Validator", + "description": "Ensures that filesystem bookmark identifiers remain valid after reconciliation merges.", + "source_line": null + }, + { + "name": "Automated Bookmark Diff Tests", + "description": "Unit tests covering add, update, and delete flows across CoreData and JSON-backed stores for bookmark diffs.", + "source_line": null + }, + { + "name": "Session Restoration UI/CLI Sync", + "description": "Restores the latest bookmark state in both UI and CLI surfaces during session restoration.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1773, + "line_count": 35 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/Summary_of_Work_metrics.json new file mode 100644 index 00000000..52bb310d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 1058, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/next_tasks_metrics.json new file mode 100644 index 00000000..60787c8d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/next_tasks_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/77_C7_Connect_Bookmark_Diffs_to_Resolved_Bookmarks/next_tasks.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "invariant", + "description": "CoreData session bookmark diffs must be reconciled with persisted bookmark entities when reconciliation rules are defined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers under identical workloads once Combine support is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results should show latency and throughput metrics for mapped and chunked readers on macOS with Combine support.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test must complete successfully without blocking due to missing macOS UI testing entitlements.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark should run on macOS with Xcode/Combine and produce comparable latency data.", + "source_line": null + }, + { + "type": "invariant", + "description": "Session persistence must reconcile CoreData session bookmark diffs with live bookmark entities when reconciliation rules defined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track outcome of notarized build Apple Events automation assessment and reference final decision in documentation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Connect Bookmark Diffs to Persisted Bookmarks", + "description": "Reconciles CoreData session bookmark diffs with persisted bookmark entities", + "source_line": null + }, + { + "name": "Random Slice Benchmark Execution", + "description": "Runs random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers", + "source_line": null + }, + { + "name": "Parse Tree Streaming Selection Automation Tests", + "description": "Executes SwiftUI automation flow tests for parse tree streaming selection on macOS", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark Execution", + "description": "Captures latency metrics for Combine-backed UI on macOS while maintaining CLI throughput parity", + "source_line": null + }, + { + "name": "Session Persistence Reconciliation", + "description": "Reconciles CoreData session bookmark diffs with live bookmark entities based on defined rules", + "source_line": null + }, + { + "name": "Notarized Build Apple Events Automation Assessment", + "description": "Tracks outcome of notarized build automation via Apple Events and updates entitlements", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2568, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/PDD_30m_Wire_CLI_Bookmark_Flows_metrics.json b/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/PDD_30m_Wire_CLI_Bookmark_Flows_metrics.json new file mode 100644 index 00000000..4f1ce650 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/PDD_30m_Wire_CLI_Bookmark_Flows_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/PDD_30m_Wire_CLI_Bookmark_Flows.md", + "n_spec": 6, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "As a CLI user, I want bookmark acquisition, refresh, and reuse operations to emit structured audit events so that headless file access is tracked in the FilesystemAccessAuditTrail.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI bookmark acquisition, refresh, and reuse paths append structured events to a process-scoped FilesystemAccessAuditTrail even when running headless.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Disabling telemetry via --disable-telemetry suppresses audit publishing; enabling telemetry ensures audit output is flushed or exported for automation logs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover CLI bookmark flows with audit assertions, and documentation cross\u2011references are updated to reflect the new telemetry behavior.", + "source_line": null + }, + { + "type": "invariant", + "description": "Audit persistence must be routed separately from user-facing logVerbosity semantics so quiet/verbose logging options continue to work.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ISOInspectorCLIEnvironment to provide a FilesystemAccessLogger that threads a shared FilesystemAccessAuditTrail into bookmark helpers without mutating existing reader/parsing contracts.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Bookmark Acquisition", + "description": "Command-line interface flow that acquires a filesystem bookmark for a specified path and records the operation in FilesystemAccessAuditTrail.", + "source_line": null + }, + { + "name": "CLI Bookmark Refresh", + "description": "CLI flow to refresh an existing filesystem bookmark, updating its state and logging the event to the audit trail.", + "source_line": null + }, + { + "name": "CLI Bookmark Reuse", + "description": "Mechanism allowing CLI to reuse an existing bookmark without prompting the user, emitting an audit record for the operation.", + "source_line": null + }, + { + "name": "Telemetry Flag Handling", + "description": "Global --enable-telemetry/--disable-telemetry flags that control whether audit events are published or suppressed during headless CLI runs.", + "source_line": null + }, + { + "name": "FilesystemAccessLogger Integration", + "description": "Wrapper that injects a shared FilesystemAccessAuditTrail into bookmark helpers, enabling audit logging without altering reader/parsing contracts.", + "source_line": null + }, + { + "name": "Quiet/Verbose Logging Routing", + "description": "Preserves logVerbosity semantics by routing audit persistence separately from user-facing output while supporting quiet and verbose modes.", + "source_line": null + }, + { + "name": "Unit Test Suite for Bookmark Audit", + "description": "Automated tests that validate CLI bookmark flows emit or suppress audit entries based on telemetry settings, ensuring compliance with audit requirements.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2915, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/Summary_of_Work_metrics.json new file mode 100644 index 00000000..0d5cee70 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/Summary_of_Work.md", + "n_spec": 3, + "n_func": 4, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Extended ISOInspectorCLIEnvironment with audit-aware filesystem access factories so bookmark commands share a process-scoped FilesystemAccessAuditTrail while respecting telemetry toggles.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI unit tests verify that bookmark acquisition and authorization append audit events only when telemetry is enabled.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide CLI bookmark flows that consume FilesystemAccessAuditTrail events once dedicated zero-trust telemetry flags land.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FilesystemAccessAuditTrail Event Consumption", + "description": "CLI bookmark flows consume FilesystemAccessAuditTrail events when zero-trust telemetry flags are enabled.", + "source_line": null + }, + { + "name": "Audit-Aware Filesystem Access Factories", + "description": "ISOInspectorCLIEnvironment provides factories that create filesystem access objects tied to a process-scoped FilesystemAccessAuditTrail, respecting telemetry toggles.", + "source_line": null + }, + { + "name": "Bookmark Acquisition Audit Event Generation", + "description": "When a bookmark is acquired via the CLI, an authorization append audit event is emitted only if telemetry is enabled.", + "source_line": null + }, + { + "name": "Hashed Audit Output for Telemetry Publishing", + "description": "CLI sandbox automation guide describes generating hashed audit output and how telemetry flags affect publishing of audit data.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 985, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/next_tasks_metrics.json new file mode 100644 index 00000000..61a1fc28 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/next_tasks_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/78_PDD_30m_Wire_CLI_Bookmark_Flows/next_tasks.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "Zero-trust telemetry flags must be available before consuming FilesystemAccessAuditTrail events in Wire CLI bookmark flows.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "user_story", + "description": "Track outcome of notarized build Apple Events automation assessment and reference final decision in documentation.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2290, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/79_Distribution_Apple_Events_Follow_Up_metrics.json b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/79_Distribution_Apple_Events_Follow_Up_metrics.json new file mode 100644 index 00000000..dacefc2f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/79_Distribution_Apple_Events_Follow_Up_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/79_Distribution_Apple_Events_Follow_Up.md", + "n_spec": 5, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "Notarized distribution does not require Apple Events automation; the pipeline relies exclusively on CLI tooling (codesign, xcrun notarytool).", + "source_line": null + }, + { + "type": "invariant", + "description": "The codebase contains no AppleScript/ScriptingBridge integrations.", + "source_line": null + }, + { + "type": "invariant", + "description": "Entitlements remain unchanged; no com.apple.security.automation.apple-events entitlement or NSAppleEventsUsageDescription entry is necessary.", + "source_line": null + }, + { + "type": "user_story", + "description": "Future distribution work starts from a verified baseline, as repository docs and TODO trackers point to the archived outcome record.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The final decision log and re-evaluation guidance are documented in DOCS/TASK_ARCHIVE/57_Distribution_Apple_Events_Notarization_Assessment/57_Distribution_Apple_Events_Notarization_Assession.md.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 910, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/80_I4_README_Feature_Matrix_and_Screenshots_metrics.json b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/80_I4_README_Feature_Matrix_and_Screenshots_metrics.json new file mode 100644 index 00000000..9bc240d7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/80_I4_README_Feature_Matrix_and_Screenshots_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/80_I4_README_Feature_Matrix_and_Screenshots.md", + "n_spec": 9, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver a release-ready README that highlights ISOInspector\u2019s CLI, app, and library capabilities with a concise feature matrix, enumerates supported box categories, and embeds representative UI captures for prospective users.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "README gains a \u201cFeature Matrix\u201d table covering ISOInspectorKit, ISOInspectorApp, and the `isoinspect` CLI with their flagship capabilities (streaming parse, validation, export, bookmarks, automation flags).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "README lists supported platforms, file types, and major box families (e.g., container, metadata, streaming) aligned with the existing documentation and code registries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "README embeds at least one current UI screenshot illustrating the tree/detail/hex workflow, sourced from the latest DocC or simulator capture and stored in the repo\u2019s documentation assets hierarchy.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "README cross-links to the DocC manuals and guides so readers can dive deeper without navigating the repo tree manually.", + "source_line": null + }, + { + "type": "invariant", + "description": "The feature matrix wording must match the canonical descriptions from the CLI and app manuals.", + "source_line": null + }, + { + "type": "invariant", + "description": "Supported box lists in the README must stay aligned with `ISOInspectorKit` internals (container and media code enums).", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Store UI screenshots under `Documentation/Assets/` or an equivalent tracked location referenced in DocC.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Run `scripts/fix_markdown.py README.md` after editing to keep formatting consistent with repository conventions.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Feature Matrix Table", + "description": "A table in the README listing ISOInspectorKit, ISOInspectorApp, and isoinspect CLI capabilities such as streaming parse, validation, export, bookmarks, automation flags.", + "source_line": null + }, + { + "name": "Supported Platforms List", + "description": "Section of the README enumerating platforms, file types, and major box families (container, metadata, streaming) supported by ISOInspector.", + "source_line": null + }, + { + "name": "UI Screenshot Embedding", + "description": "Inclusion of at least one current UI screenshot illustrating the tree/detail/hex workflow in the README, sourced from DocC or simulator captures.", + "source_line": null + }, + { + "name": "DocC Manual Cross\u2011Links", + "description": "Hyperlinks in the README that point to the DocC manuals and guides for deeper exploration without repo navigation.", + "source_line": null + }, + { + "name": "CLI Capability Documentation", + "description": "Canonical description of isoinspect CLI features derived from the CLI manual, used in the feature matrix.", + "source_line": null + }, + { + "name": "App Capability Documentation", + "description": "Canonical description of ISOInspectorApp features derived from the App manual, used in the feature matrix.", + "source_line": null + }, + { + "name": "Container Box List Reference", + "description": "Reference to container box enums (FourCharContainerCode) for supported box lists in the README.", + "source_line": null + }, + { + "name": "Media and Index Box List Reference", + "description": "Reference to media/index box enums (MediaAndIndexBoxCode) for supported box lists in the README.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 4654, + "line_count": 68 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d3458af0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/Summary_of_Work_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/Summary_of_Work.md", + "n_spec": 6, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a comprehensive README feature matrix that lists supported boxes, platforms, file types, and key MP4 box families for ISOInspectorKit, ISOInspectorApp, and the CLI.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The README must include a feature matrix summarizing ISOInspectorKit, ISOInspectorApp, and the CLI using DocC manuals and kit exports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Supported platforms, file types, and key MP4 box families must be documented by linking to the Swift enums that power traversal heuristics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A DocC-aligned SVG concept capture depicting the tree/detail/hex workflow must be added to the README until production screenshots are available.", + "source_line": null + }, + { + "type": "invariant", + "description": "The README feature matrix and documentation must remain consistent with the canonical references in DocC manuals and kit exports.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use DocC manuals and ISOInspectorKit exports as the canonical source for the feature matrix to ensure consistency across documentation.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "README Feature Matrix", + "description": "Provides a summary of supported boxes, platforms, and screenshots in the README", + "source_line": null + }, + { + "name": "ISOInspectorKit API Documentation", + "description": "DocC manuals and kit exports summarising ISOInspectorKit capabilities", + "source_line": null + }, + { + "name": "ISOInspectorApp Overview", + "description": "DocC-aligned SVG depicting tree/detail/hex workflow for the app", + "source_line": null + }, + { + "name": "CLI Feature Matrix", + "description": "Summarises CLI features alongside ISOInspectorKit and ISOInspectorApp in README", + "source_line": null + }, + { + "name": "Supported Platforms Listing", + "description": "Documents which platforms are supported by the system", + "source_line": null + }, + { + "name": "Supported File Types Listing", + "description": "Lists file types that the system can handle", + "source_line": null + }, + { + "name": "MP4 Box Families Documentation", + "description": "Links to Swift enums powering traversal heuristics for MP4 box families", + "source_line": null + }, + { + "name": "FourCharContainerCode Enum", + "description": "Swift enum defining four-character container codes used in ISO traversal", + "source_line": null + }, + { + "name": "MediaAndIndexBoxCode Enum", + "description": "Swift enum defining media and index box codes used in ISO traversal", + "source_line": null + }, + { + "name": "Markdown Normalization Script", + "description": "Python script that normalises Markdown spacing and wrapping for notes", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1954, + "line_count": 40 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/next_tasks_metrics.json new file mode 100644 index 00000000..9a7b6248 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/next_tasks_metrics.json @@ -0,0 +1,57 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/79_Readme_Feature_Matrix_and_Distribution_Follow_Up/next_tasks.md", + "n_spec": 9, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Execute the random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results must show comparable throughput between mapped and chunked readers when run on macOS with Combine support.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate the end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All tests in ParseTreeStreamingSelectionAutomationTests must pass, confirming correct SwiftUI automation behavior.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Latency metrics collected on macOS must be within acceptable thresholds and throughput must match CLI harness results.", + "source_line": null + }, + { + "type": "invariant", + "description": "Combine support is required for all macOS benchmark and UI testing tasks; without it, tasks are blocked.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Apple Events automation will be evaluated for notarized builds to determine if entitlements can be safely extended.", + "source_line": null + }, + { + "type": "user_story", + "description": "Draft README feature matrix and screenshots as part of the documentation readiness effort.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2391, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/I3_App_Theming_metrics.json b/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/I3_App_Theming_metrics.json new file mode 100644 index 00000000..e4e15380 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/I3_App_Theming_metrics.json @@ -0,0 +1,73 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/I3_App_Theming.md", + "n_spec": 7, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Deliver a branded ISOInspector visual identity by supplying production-ready app icons and accent colors that respect both light and dark appearances across macOS, iPadOS, and iOS builds.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "App icon sets include all required idioms and scales for macOS, iOS, and iPadOS targets, packaged inside an asset catalog referenced by the Xcode project.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Accent colors and theming resources render correctly in both light and dark modes, with SwiftUI previews or screenshots confirming contrast and accessibility compliance.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Updated theming assets are reflected in distribution artifacts (TestFlight/DMG) with documentation/screenshots refreshed as needed.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Populate Sources/ISOInspectorApp/Resources/ with an Assets.xcassets catalog that contains AppIcon.appiconset entries covering platform-specific size requirements.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Define shared accent colors within the asset catalog and apply them through SwiftUI AccentColor or environment modifiers inside ISOInspectorApp scene declarations.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with distribution tooling (Distribution/ scripts and project settings) to ensure new assets flow through notarization and packaging workflows without additional manual steps.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "App Icon Asset Catalog", + "description": "Provides a complete set of app icon images for macOS, iPadOS, and iOS in all required idioms and scales, packaged within an Assets.xcassets catalog referenced by the Xcode project.", + "source_line": null + }, + { + "name": "Accent Color Definition", + "description": "Defines shared accent colors with light/dark variants inside the asset catalog, ensuring consistent theming across the app.", + "source_line": null + }, + { + "name": "SwiftUI Accent Application", + "description": "Applies the defined accent colors to the ISOInspectorApp scene using SwiftUI's AccentColor or environment modifiers so that UI elements use the brand accent.", + "source_line": null + }, + { + "name": "Theming Resource Packaging", + "description": "Includes all theming assets (icons, colors) in distribution artifacts such as TestFlight builds and DMG installers, ensuring they are notarized and packaged automatically.", + "source_line": null + }, + { + "name": "Documentation & Screenshot Updates", + "description": "Updates marketing captures, DocC manuals, README imagery, and screenshots to reflect new iconography and primary colors for consistency across docs and product surfaces.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2704, + "line_count": 57 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1928919e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/Summary_of_Work.md", + "n_spec": 6, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement app theming with accent palette and light/dark modes for ISOInspector SwiftUI app", + "source_line": null + }, + { + "type": "invariant", + "description": "The brand accent color must be shared across all controls via isoInspectorAppTheme() modifier", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover WCAG-AA contrast coverage for ISOInspectorBrandPalette", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Assets.xcassets catalog to store accent and surface color variants", + "source_line": null + }, + { + "type": "user_story", + "description": "Generate production app icon raster assets from approved vector design and wire filenames into AppIcon.appiconset", + "source_line": null + }, + { + "type": "invariant", + "description": "App icon filenames must match the approved vector design naming convention", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorBrandPalette", + "description": "Provides a brand accent palette with WCAG-AA contrast coverage and unit tests for measurability", + "source_line": null + }, + { + "name": "Assets.xcassets catalog", + "description": "Holds SwiftUI app color assets including accent and surface variants for light/dark modes", + "source_line": null + }, + { + "name": "isoInspectorAppTheme() modifier", + "description": "Applies the brand accent across the app shell, sharing theme colors with controls", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 859, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/next_tasks_metrics.json new file mode 100644 index 00000000..a0d227de --- /dev/null +++ b/DOCS/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/next_tasks_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/80_Summary_of_Work_2025-10-17_App_Theming/next_tasks.md", + "n_spec": 9, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement app theming for icon and light/dark modes", + "source_line": null + }, + { + "type": "invariant", + "description": "Accent palette and SwiftUI tint wiring must be included in Summary_of_Work.md as of 2025-10-17", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Production icon rasterization is tracked via @todo PDD:45m", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute random slice benchmark suite on macOS with Combine support to compare mapped vs chunked readers under identical workloads", + "source_line": null + }, + { + "type": "invariant", + "description": "Benchmark must be executed only when a macOS runner with Combine is available", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI to validate end-to-end SwiftUI automation flow", + "source_line": null + }, + { + "type": "invariant", + "description": "Testing requires macOS UI testing entitlements and cannot run in container", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with CLI harness", + "source_line": null + }, + { + "type": "invariant", + "description": "Benchmark must only run on mac\u2011macOS runner with Xcode/Combine", + "source_line": null + } + ], + "functional_units": [ + { + "name": "App Theming", + "description": "Provides icon and light/dark theme support with accent palette and SwiftUI tint wiring", + "source_line": null + }, + { + "name": "Benchmark Validation", + "description": "Executes random slice benchmark suite on macOS to compare mapped vs chunked readers under identical workloads", + "source_line": null + }, + { + "name": "Streaming UI Coverage", + "description": "Runs ParseTreeStreamingSelectionAutomationTests on macOS to validate end-to-end SwiftUI automation flow for streaming selection", + "source_line": null + }, + { + "name": "Combine UI Benchmark Follow-Up", + "description": "Executes Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with CLI harness", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1820, + "line_count": 34 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/81_File_Permissions_Info_Plist_Security_Scoped_Resources/81_File_Permissions_Info_Plist_Security_Scoped_Resources_metrics.json b/DOCS/TASK_ARCHIVE/81_File_Permissions_Info_Plist_Security_Scoped_Resources/81_File_Permissions_Info_Plist_Security_Scoped_Resources_metrics.json new file mode 100644 index 00000000..fa7cec47 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/81_File_Permissions_Info_Plist_Security_Scoped_Resources/81_File_Permissions_Info_Plist_Security_Scoped_Resources_metrics.json @@ -0,0 +1,113 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/81_File_Permissions_Info_Plist_Security_Scoped_Resources/81_File_Permissions_Info_Plist_Security_Scoped_Resources.md", + "n_spec": 13, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Open MP4/QuickTime files from protected folders (Documents, Downloads, Desktop) without permission errors", + "source_line": null + }, + { + "type": "user_story", + "description": "Persist access to opened files across app launches using security\u2011scoped bookmarks", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Info.plist contains NSDocumentsFolderUsageDescription, NSDownloadsFolderUsageDescription, and for macOS NSDesktopFolderUsageDescription with appropriate messages", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Info.plist contains CFBundleDocumentTypes entry for public.mpeg-4 and com.apple.quicktime-movie UTIs", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Security\u2011scoped resource is activated immediately after receiving URL from file picker", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Active security scope is kept alive for the entire document session and released when a new document opens or controller deinitializes", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Bookmark resolution occurs before activating security scope, ensuring scope is on the resolved URL", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "@Published properties recents and currentDocument are updated only on the main thread to avoid NSInternalInconsistencyException crashes", + "source_line": null + }, + { + "type": "invariant", + "description": "The app must always have a valid sandbox entitlement set for com.apple.security.app-sandbox, files.user-selected.read-write, files.bookmarks.app-scope, and files.bookmarks.document-scope", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Tuist Project.swift to generate Info.plist with extendingDefault(with:) for platform\u2011specific privacy keys", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add a private activeSecurityScopedURL property in DocumentSessionController to manage security scope lifecycle", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Pass security\u2011scoped URL as parameter to startSession() to keep scope active during session", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Implement custom error handling for 1\u2011step\u2011solve\u2011tunnel?", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Info.plist Privacy Configuration", + "description": "Adds required privacy description keys and document type associations to the app\u2019s Info.plist for accessing Documents, Downloads, Desktop folders and MP4/QuickTime files.", + "source_line": null + }, + { + "name": "Security-Scoped Resource Activation", + "description": "Implements startAccessingSecurityScopedResource() on file URLs obtained from .fileImporter(), keeping the scope alive during a document session via activeSecurityScopedURL.", + "source_line": null + }, + { + "name": "Document Session Lifecycle Management", + "description": "Manages opening, parsing, and annotation of documents, including starting/stopping security scopes, handling bookmarks, and maintaining current document state.", + "source_line": null + }, + { + "name": "Bookmark Resolution Ordering Fix", + "description": "Resolves bookmark URLs before activating security scope to ensure the correct URL is used for file access during session restoration or recents reopening.", + "source_line": null + }, + { + "name": "Thread\u2011Safe Recents Update", + "description": "Ensures @Published recents and currentDocument properties are updated on the main thread, preventing NSInternalInconsistencyException crashes when modifying UI from background queues.", + "source_line": null + }, + { + "name": "Info.plist Verification Utility", + "description": "Provides command\u2011line checks (plutil) to confirm presence of required keys in generated Info.plist files.", + "source_line": null + }, + { + "name": "Build & Test Automation Scripts", + "description": "Automated Tuist generation, Xcode build, and SwiftLint linting steps for verifying the implementation changes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 32931, + "line_count": 772 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/B5_FullBoxReader_metrics.json b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/B5_FullBoxReader_metrics.json new file mode 100644 index 00000000..55530a9c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/B5_FullBoxReader_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/B5_FullBoxReader.md", + "n_spec": 10, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Introduce a reusable helper that extracts the common (version, flags) header shared by ISO Base Media File Format \"full boxes\" so downstream parsers can focus on box-specific payload fields instead of repeating boilerplate bit parsing.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A FullBoxReader type lives in ISOInspectorKit, exposes validated version and flags values, and handles both truncated and complete payload ranges gracefully.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover version/flag decoding for representative fixtures, including short reads and large payloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing parsers that currently hand\u2011roll version/flags extraction (mvhd, tkhd, and upcoming timeline boxes) adopt the helper without regressing current test coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation sources reflect Task B5 as in progress until code lands.", + "source_line": null + }, + { + "type": "invariant", + "description": "Validation rules VR-001\u2013VR-006 already ensure structural integrity, so this task can rely on existing header ranges reported by BoxHeader and the RandomAccessReader protocol delivered in Task B1.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse the RandomAccessReader protocol utilities (e.g., read(at:count:), endian helpers) to keep the helper pure and testable.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider returning a lightweight struct (e.g., FullBoxHeader) that encapsulates decoded values plus the payload offset where box\u2011specific fields begin.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Ensure error reporting aligns with existing parsing errors (IOError, BoundsError, OverflowError) so callers can surface consistent diagnostics.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update BoxParserRegistry.DefaultParsers to call the helper and stage future parser registrations (e.g., mdhd, hdlr) on top of it.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FullBoxReader", + "description": "Utility that extracts the common (version, flags) header from ISO Base Media File Format full boxes and provides validated values along with payload offset.", + "source_line": null + }, + { + "name": "FullBoxHeaderFields struct", + "description": "Lightweight struct returned by FullBoxReader containing decoded version, flags, and remaining payload range.", + "source_line": null + }, + { + "name": "mvhd parser integration", + "description": "Default mvhd box parser updated to use FullBoxReader for header extraction.", + "source_line": null + }, + { + "name": "tkhd parser integration", + "description": "Default tkhd box parser updated to use FullBoxReader for header extraction.", + "source_line": null + }, + { + "name": "Unit tests for FullBoxReader", + "description": "Tests covering successful decoding, truncated payload handling, and reader error propagation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3147, + "line_count": 40 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/I3_App_Icon_Rasterization_metrics.json b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/I3_App_Icon_Rasterization_metrics.json new file mode 100644 index 00000000..31a45d9a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/I3_App_Icon_Rasterization_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/I3_App_Icon_Rasterization.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Generate production-quality raster assets for the ISOInspector app icon across all required Apple platform sizes so the branding work from Task I3 ships in notarized builds with light and dark appearance fidelity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Rasterized icon assets exist for every slot required by the multiplatform asset catalog (macOS, iOS, iPadOS) with correct pixel dimensions and idiom metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Light and dark appearance variants render without color banding or clipped safe zones when previewed in Xcode asset inspector.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Updated asset catalog integrates into both SwiftUI previews and notarized archive builds without triggering missing asset warnings or placeholder fallbacks.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation sources (todo.md, workplan, PRD backlog) reflect Task I3 as in progress until assets merge into main.", + "source_line": null + }, + { + "type": "invariant", + "description": "Raster outputs are ignored via .gitignore and regenerated locally before shipping notarized builds.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use a script (scripts/generate_app_icon.py) to generate 26 production PNG variants from a single 1024\u00d71024 master, outputting on-demand and ignoring by source control.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update AppIcon.appiconset/Contents.json with deterministic filenames so the catalog resolves new artwork across macOS, iOS, and iPadOS targets once generator runs.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add AppIconAssetTests to assert manifest entries stay in sync with the generator's filename convention.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "App Icon Rasterization Script", + "description": "Generates production-quality PNG assets for all required Apple platform icon sizes from a master vector source using scripts/generate_app_icon.py", + "source_line": null + }, + { + "name": "Asset Catalog Manifest Update", + "description": "Updates AppIcon.appiconset/Contents.json with deterministic filenames and idiom metadata to reference generated raster assets", + "source_line": null + }, + { + "name": "App Icon Asset Tests", + "description": "Swift test suite (AppIconAssetTests) that verifies manifest entries match generator filename conventions", + "source_line": null + }, + { + "name": "Dark/Light Appearance Variant Handling", + "description": "Ensures light and dark appearance variants render correctly without banding or clipping in Xcode asset inspector", + "source_line": null + }, + { + "name": "Build Integration for Notarized Builds", + "description": "Integrates generated icon assets into SwiftUI previews and notarized archive builds, preventing missing asset warnings", + "source_line": null + }, + { + "name": "Documentation Automation Workflow", + "description": "Documents the automation process in DOCS/TASK_ARCHIVE/100_Summary_of_Work.md and updates related markdown via scripts/fix_markdown.py", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3612, + "line_count": 53 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/Summary_of_Work_metrics.json new file mode 100644 index 00000000..5f8b0374 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/Summary_of_Work_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/Summary_of_Work.md", + "n_spec": 14, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a FullBoxReader utility to centralize decoding of (version, flags) for ISO full boxes and refactor existing parsers to use it.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FullBoxReader must validate that at least four payload bytes are available before decoding.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "FullBoxReader exposes a contentRange so callers can continue parsing box-specific fields.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Existing parsing helpers (readUInt32, readUInt64, etc.) remain in place and FullBoxReader composes them via RandomAccessReader to stay testable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Downstream call sites rely on contentStart rather than recomputing payloadRange.lowerBound + 4.", + "source_line": null + }, + { + "type": "invariant", + "description": "FullBoxReader must always propagate success, truncation, and error scenarios correctly as tested by FullBoxReaderTests.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "FullBoxReader is a helper that centralizes (version, flags) decoding for ISO full boxes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Automate PNG generation for every AppIcon idiom/scale via generate_app_icon.py script.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The generator renders a 1024\u00d71024 master icon using the brand palette defined in ISOInspectorBrandPalette.production and resizes it for each required slot.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Generated assets live in Sources/ISOInspectorApp/Resources/Assets.xcassets/AppIcon.appiconset after running the script.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "PNG outputs are .gitignore'd and should be regenerated locally before packaging builds.", + "source_line": null + }, + { + "type": "invariant", + "description": "The Python workflow depends on Pillow to render gradients and icon geometry.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "AppIconAssetTests enforce that each manifest entry tracks the generator's filename convention.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Release automation must invoke generate_app_icon.py so notarized builds include regenerated PNGs.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FullBoxReader Utility", + "description": "Centralizes decoding of ISO full box (version, flags) and provides content range for downstream parsers.", + "source_line": null + }, + { + "name": "App Icon Rasterization Script", + "description": "Automates PNG generation for all AppIcon idioms/scale using a master icon and brand palette, updating manifest filenames.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2502, + "line_count": 48 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/next_tasks_metrics.json new file mode 100644 index 00000000..5f74b7b8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/next_tasks_metrics.json @@ -0,0 +1,63 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/81_Summary_of_Work_2025-10-18_FullBoxReader_and_AppIcon/next_tasks.md", + "n_spec": 5, + "n_func": 5, + "intent_atoms": [ + { + "type": "invariant", + "description": "FullBoxReader must correctly extract version and flags from a full box", + "source_line": null + }, + { + "type": "user_story", + "description": "App theming feature including icon rasterization and light/dark mode support", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Random slice benchmark suite executed on macOS with Combine support to compare mapped vs chunked readers under identical workloads", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ParseTreeStreamingSelectionAutomationTests run on macOS with XCTest UI support to validate end-to-end SwiftUI automation flow", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Combine-backed UI benchmark executed on macOS to capture latency metrics while maintaining throughput parity with CLI harness", + "source_line": null + } + ], + "functional_units": [ + { + "name": "FullBoxReader", + "description": "Extracts version and flags from full boxes in media file parsing", + "source_line": null + }, + { + "name": "App Theming", + "description": "Provides icon rasterization and light/dark theme support for the application UI", + "source_line": null + }, + { + "name": "Random Slice Benchmark Suite", + "description": "Executes random slice benchmarks to compare mapped vs. chunked readers on macOS hardware", + "source_line": null + }, + { + "name": "ParseTreeStreamingSelectionAutomationTests", + "description": "Runs SwiftUI automation flow tests for streaming UI selection on macOS", + "source_line": null + }, + { + "name": "Combine-backed UI Benchmark", + "description": "Captures latency metrics for Combine-enabled UI on macOS while maintaining CLI throughput", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2316, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Summary_of_Work_metrics.json new file mode 100644 index 00000000..0fd8988a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Summary_of_Work.md", + "n_spec": 5, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a shareable release notes document for the v0.1.0 MVP that includes kit/app/CLI highlights, QA evidence, and outstanding release follow-ups.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Release notes must reference marketing version 0.1.0 and build 1 as advertised in distribution metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Release notes must list macOS-only gaps such as DocC archives, notarization/TestFlight automation, and Combine/UI runs to inform release managers of required hardware steps before tagging.", + "source_line": null + }, + { + "type": "invariant", + "description": "Distribution metadata must advertise marketing version 0.1.0 and build 1 consistently across all artifacts.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use the Distribution/ReleaseNotes/v0.1.0.md file as the single source of truth for release notes, shared via GitHub Releases and TestFlight notes.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Release Notes Generation", + "description": "Creates and publishes release notes for the v0.1.0 MVP release, including kit/app/CLI highlights, QA evidence, and follow\u2011up items.", + "source_line": null + }, + { + "name": "Distribution Metadata Verification", + "description": "Confirms that distribution metadata advertises the correct marketing version and build number, ensuring alignment with Tuist configuration.", + "source_line": null + }, + { + "name": "macOS\u2011Specific Release Gap Reporting", + "description": "Records gaps in macOS release steps such as DocC generation, notarization, TestFlight automation, and Combine/UI runs to inform release managers of required hardware execution before tagging.", + "source_line": null + }, + { + "name": "CLI Binary Build for Packaging", + "description": "Builds the isoinspect CLI binary using Swift build in release configuration for packaging purposes.", + "source_line": null + }, + { + "name": "Workspace Test Suite Execution", + "description": "Runs the full workspace test suite on Linux, logging benchmark metrics and skipping Combine tests as expected.", + "source_line": null + }, + { + "name": "Release Readiness Runbook Tracking", + "description": "Tracks DocC generation, notarization, TestFlight export, and macOS QA steps via a runbook to ensure release readiness once hardware runners are available.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1735, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Task_Brief_metrics.json b/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Task_Brief_metrics.json new file mode 100644 index 00000000..939a9e69 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Task_Brief_metrics.json @@ -0,0 +1,47 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/Task_Brief.md", + "n_spec": 7, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Summarize the MVP feature set, QA evidence, and distribution readiness for the v0.1.0 release.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Draft release notes that highlight major features (parser coverage, UI, CLI), recent changes, and known limitations/blocked follow-ups.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Capture links or references to QA artifacts (test logs, benchmarks) per the runbook expectations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Validate distribution packaging checklist items: version metadata, notarization/testflight readiness, DocC artifacts, and README/manual sync points.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update backlog trackers (next_tasks.md, workplan, PRD TODO) once the release notes draft is ready for review.", + "source_line": null + }, + { + "type": "invariant", + "description": "Use ReleaseReadinessRunbook.md as the step-by-step reference for packaging validation, noting macOS-dependent checks that remain blocked.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Pull highlights from the master PRD to frame the release scope, emphasizing streaming parsing, SwiftUI inspection, CLI exports, and FilesystemAccessKit sandbox support.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2811, + "line_count": 45 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/next_tasks_metrics.json new file mode 100644 index 00000000..b397a8d7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/next_tasks_metrics.json @@ -0,0 +1,42 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/82_I5_v0_1_0_Release_Notes/next_tasks.md", + "n_spec": 0, + "n_func": 6, + "intent_atoms": [], + "functional_units": [ + { + "name": "Publish DocC archives", + "description": "Generate and publish documentation archives for the project", + "source_line": null + }, + { + "name": "Create notarized DMG", + "description": "Build a disk image that is notarized for macOS distribution", + "source_line": null + }, + { + "name": "Package TestFlight build", + "description": "Prepare an iOS/macOS TestFlight package for beta testing", + "source_line": null + }, + { + "name": "Follow release readiness runbook", + "description": "Execute exact commands outlined in the release readiness runbook to ensure readiness", + "source_line": null + }, + { + "name": "Capture macOS UI automation evidence", + "description": "Record and collect UI automation test results on macOS", + "source_line": null + }, + { + "name": "Collect Combine benchmark evidence", + "description": "Gather performance metrics from Combine benchmarks for QA packet", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 426, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ce2c1da4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 979, + "line_count": 18 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/next_tasks_metrics.json new file mode 100644 index 00000000..f5ed7333 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/83_Summary_of_Work_2025-10-Release_Prep/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 1649, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/R2_Fixture_Acquisition_metrics.json b/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/R2_Fixture_Acquisition_metrics.json new file mode 100644 index 00000000..d1d9b9ff --- /dev/null +++ b/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/R2_Fixture_Acquisition_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/84_R2_Fixture_Acquisition/R2_Fixture_Acquisition.md", + "n_spec": 8, + "n_func": 10, + "intent_atoms": [ + { + "type": "user_story", + "description": "Curate a catalog of MP4/QuickTime fixtures covering standard, fragmented, and vendor-specific atoms for parsing, validation, and benchmarking suites.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Produce a ranked list of sample sources with licensing notes and download metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ensure the catalog covers core MP4 families (progressive moov/mdat, fragmented moof/traf), metadata-heavy assets, and edge cases referenced in benchmarking runbooks.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Document storage and size requirements so CI or hardware runners can stage media without exhausting quotas.", + "source_line": null + }, + { + "type": "invariant", + "description": "All downloaded fixtures must have SHA-256 checksums recorded in a manifest for integrity verification.", + "source_line": null + }, + { + "type": "invariant", + "description": "License texts must be mirrored under Documentation/FixtureCatalog/licenses/ and referenced from the manifest to satisfy attribution requirements.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Store large assets under Distribution/Fixtures// while keeping lightweight regression fixtures inside the test bundle.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use Tests/ISOInspectorKitTests/Fixtures/generate_fixtures.py to ingest a manifest-driven remote download workflow with deterministic filenames.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fixture Catalog Manifest Generation", + "description": "Generate a manifest.json capturing source URL, SHA-256 checksum, license snippet, and coverage tags for each fixture", + "source_line": null + }, + { + "name": "Scripted Fixture Download Helper", + "description": "Extend generate_fixtures.py to download fixtures from URLs specified in the manifest and emit deterministic filenames", + "source_line": null + }, + { + "name": "Checksum Validation Process", + "description": "Validate downloaded files against recorded SHA-256 checksums and log digests for CI verification", + "source_line": null + }, + { + "name": "Storage Allocation Strategy", + "description": "Allocate and document storage targets (e.g., 40 GB macOS, 15 GB Linux) for staging media fixtures", + "source_line": null + }, + { + "name": "License Mirroring and Attribution", + "description": "Mirror license texts under Documentation/FixtureCatalog/licenses/ and reference them in the manifest to satisfy attribution requirements", + "source_line": null + }, + { + "name": "Vendor Telemetry Fixture Support", + "description": "Include vendor-specific UUID metadata boxes (GoPro, DJI) in fixture set for telemetry parsing coverage", + "source_line": null + }, + { + "name": "Progressive MP4 Coverage", + "description": "Provide progressive MP4 samples with canonical moov/mdat ordering from Apple and Bento4 sources", + "source_line": null + }, + { + "name": "Fragmented MP4 Coverage", + "description": "Provide fragmented MP4 samples (moof/traf) from Apple HLS, DASH-IF, GPAC datasets", + "source_line": null + }, + { + "name": "Metadata-Rich Asset Support", + "description": "Include high-bitrate cinematic MP4s with large co64 tables and metadata boxes from Blender Foundation and Xiph.org", + "source_line": null + }, + { + "name": "Malformed/Truncated Sample Inclusion", + "description": "Add intentionally malformed or truncated MP4 samples for parser regression testing (Xiph.org)", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 9621, + "line_count": 90 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/Summary_of_Work_metrics.json new file mode 100644 index 00000000..a5bbcc6f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/84_R2_Fixture_Acquisition/Summary_of_Work.md", + "n_spec": 2, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement manifest-driven fixture acquisition in generate_fixtures.py ensuring checksum validation and license mirroring accompany downloads.", + "source_line": null + }, + { + "type": "user_story", + "description": "Author fixture storage README describing mount paths and quotas for macOS runners and Linux caches once infrastructure is available.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fixture Catalog", + "description": "Provides a prioritized catalog of MP4 fixture families with metadata and storage recommendations", + "source_line": null + }, + { + "name": "Manifest Schema for Fixtures", + "description": "Defines the schema used to describe fixture acquisition manifests", + "source_line": null + }, + { + "name": "Scripted Fixture Download Tool", + "description": "Automates downloading fixtures based on manifests, including checksum verification and license mirroring", + "source_line": null + }, + { + "name": "Fixture Acquisition Workflow", + "description": "End-to-end process for acquiring, verifying, and storing fixtures in CI environments", + "source_line": null + }, + { + "name": "Documentation of Fixture Sources", + "description": "Documents ranked fixture sources, licensing notes, download pointers, storage sizing, and ingestion guidance", + "source_line": null + }, + { + "name": "Fixture Storage README", + "description": "Describes mount paths and quotas for macOS runners and Linux caches", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2247, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/next_tasks_metrics.json new file mode 100644 index 00000000..47971733 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/84_R2_Fixture_Acquisition/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/84_R2_Fixture_Acquisition/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 2159, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/PDD_45m_Wire_Generate_Fixtures_Manifest_metrics.json b/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/PDD_45m_Wire_Generate_Fixtures_Manifest_metrics.json new file mode 100644 index 00000000..49a462bf --- /dev/null +++ b/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/PDD_45m_Wire_Generate_Fixtures_Manifest_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/PDD_45m_Wire_Generate_Fixtures_Manifest.md", + "n_spec": 10, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement manifest-driven remote fixture acquisition so generate_fixtures.py can download, verify, and catalog large media assets required for benchmarking and validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "generate_fixtures.py accepts a manifest describing remote assets, downloads each entry, verifies SHA-256 checksums, and writes deterministic filenames under the documented storage structure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The script copies or references license texts for each source into Documentation/FixtureCatalog/licenses/ so redistribution requirements are met.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A tracked manifest (e.g., Documentation/FixtureCatalog/manifest.json) records URLs, checksums, coverage tags, and license references for CI/hardware runners.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Script output logs clearly indicate download status, verification results, and storage paths to aid future automation and troubleshooting.", + "source_line": null + }, + { + "type": "invariant", + "description": "The script must always verify SHA-256 checksums of downloaded assets before accepting them.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the Python script with a manifest loader, streaming download helpers (with resume-friendly temp files), and checksum validation; reuse existing fixture catalog patterns for deterministic naming.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Mirror each source license into a dedicated directory and link it from the manifest entry to satisfy attribution requirements before bundling fixtures with runners.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Stage large assets outside the test bundle under Distribution/Fixtures/ while keeping lightweight regression assets in-repo; document mount paths in the follow-up README task to align with storage guidance.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider adding a dry-run mode that validates checksums and license availability without downloading to support CI gating.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Manifest Loader", + "description": "Loads a manifest file describing remote assets, including URLs, checksums, coverage tags, and license references.", + "source_line": null + }, + { + "name": "Streaming Download Helper", + "description": "Downloads each asset from its URL using streaming with resume-friendly temporary files.", + "source_line": null + }, + { + "name": "Checksum Validator", + "description": "Verifies downloaded files against provided SHA-256 checksums.", + "source_line": null + }, + { + "name": "Deterministic Filename Generator", + "description": "Creates deterministic filenames for assets based on catalog patterns and writes them to the documented storage structure.", + "source_line": null + }, + { + "name": "License Mirroring", + "description": "Copies or references license texts for each source into Documentation/FixtureCatalog/licenses/ and links them from the manifest entry.", + "source_line": null + }, + { + "name": "Manifest Tracker Writer", + "description": "Writes a tracked manifest (e.g., Documentation/FixtureCatalog/manifest.json) recording URLs, checksums, coverage tags, and license references for CI/hardware runners.", + "source_line": null + }, + { + "name": "Logging Output", + "description": "Logs download status, verification results, and storage paths to aid automation and troubleshooting.", + "source_line": null + }, + { + "name": "Dry-Run Mode", + "description": "Validates checksums and license availability without downloading assets, useful for CI gating.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3242, + "line_count": 48 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/Summary_of_Work_metrics.json new file mode 100644 index 00000000..870547fd --- /dev/null +++ b/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/Summary_of_Work_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/Summary_of_Work.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Generate fixture files from a manifest that includes remote metadata and license texts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The generate_fixtures.py script must load the manifest.json file located in Documentation/FixtureCatalog/manifest.json.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The script must stream downloads of fixtures with SHA-256 checksum validation.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "License texts for each fixture must be mirrored under Documentation/FixtureCatalog/licenses/.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The script should support a dry-run mode that verifies the manifest without performing actual downloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests must cover successful download scenarios, checksum failures, and dry\u2011run behavior.", + "source_line": null + }, + { + "type": "invariant", + "description": "Checksum validation must always succeed for valid fixtures; if it fails, the process should abort.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Fixture metadata is stored in a JSON manifest file under Documentation/FixtureCatalog/manifest.json to keep track of remote resources.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "License texts are mirrored in separate folder\u00a0(\u2026\u00a0licenses\u00a0..).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "generate_fixtures.py", + "description": "Loads fixture manifests, streams downloads with SHA-256 validation, mirrors license texts, and supports dry-run verification.", + "source_line": null + }, + { + "name": "manifest.json", + "description": "Tracks remote fixture metadata and mirrored license texts for fixtures.", + "source_line": null + }, + { + "name": "Documentation/FixtureCatalog/licenses/", + "description": "Directory containing mirrored license texts for each fixture.", + "source_line": null + }, + { + "name": "Tests/test_generate_fixtures_manifest.py", + "description": "Unit tests exercising the manifest pipeline via unittest runner.", + "source_line": null + }, + { + "name": "Python command to run tests", + "description": "Runs all unit tests in Tests directory using python -m unittest.", + "source_line": null + }, + { + "name": "Dry-run command", + "description": "Executes generate_fixtures.py with skip-text-fixtures, manifest path, and dry-run flag for validation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1285, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/next_tasks_metrics.json new file mode 100644 index 00000000..717a0fd6 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/next_tasks_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/85_PDD_45m_Wire_Generate_Fixtures_Manifest/next_tasks.md", + "n_spec": 6, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Curated multi-source fixture catalog with licensing, download, and storage guidance.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend generate_fixtures.py to download fixtures from the curated manifest with checksum verification and license mirroring.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA following the release readiness runbook.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers under identical workloads.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS hardware with XCTest UI support to validate end-to-end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Execute the Combine-backed UI benchmark on macOS to capture latency metrics while maintaining throughput parity with the CLI harness.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "R2 Fixture Acquisition Research", + "description": "Curated multi-source fixture catalog with licensing, download, and storage guidance.", + "source_line": null + }, + { + "name": "PDD:45m Manifest-Driven Fixture Acquisition", + "description": "Download fixtures from the curated manifest with checksum verification and license mirroring via generate_fixtures.py.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2529, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/PDD_30m_Fixture_Storage_README_metrics.json b/DOCS/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/PDD_30m_Fixture_Storage_README_metrics.json new file mode 100644 index 00000000..ba6f4b22 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/PDD_30m_Fixture_Storage_README_metrics.json @@ -0,0 +1,83 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/PDD_30m_Fixture_Storage_README.md", + "n_spec": 8, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide operators with clear storage locations and mount expectations for large fixture downloads on macOS and Linux CI agents.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Spell out required disk quotas and mount paths for macOS runners (~40 GB) and Linux CI caches (~15 GB) with headroom recommendations.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provide directory layout diagrams tying together Documentation/FixtureCatalog/manifest.json, mirrored licenses, and Distribution/Fixtures// staging folders so operators know where downloads land.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Include setup steps for mounting or syncing caches on both platforms, referencing the existing generate_fixtures.py invocation patterns to keep tooling consistent.", + "source_line": null + }, + { + "type": "invariant", + "description": "The fixture storage guidance must align with current fixture tooling conventions under Distribution/Fixtures/ and accompanying license texts.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Confirm whether macOS runners expose writable volumes like /Volumes/Fixtures or use workspace-relative directories, describing fallback strategies such as symlinks if elevated permissions are unavailable.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Capture expectations for periodic cache refreshes, including checksum validation via the manifest helper to avoid stale or corrupted assets during release readiness rehearsals.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate fixture storage guidance with the release readiness runbook so it dovetails with notarization and benchmark preflight checklists tracked for macOS distribution sign-off.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Disk Quota Specification", + "description": "Defines required disk space and headroom for macOS runners (~40\u202fGB) and Linux CI caches (~15\u202fGB).", + "source_line": null + }, + { + "name": "Mount Path Definition", + "description": "Specifies the exact mount points or workspace-relative directories for fixture storage on macOS and Linux, including fallback strategies such as symlinks.", + "source_line": null + }, + { + "name": "Directory Layout Diagram", + "description": "Provides a visual layout tying together manifest.json, mirrored license texts, and Distribution/Fixtures// staging folders to show where downloads are stored.", + "source_line": null + }, + { + "name": "Setup Steps for Mounting/Synchronizing Caches", + "description": "Outlines commands or scripts to mount or sync fixture caches on both platforms, referencing generate_fixtures.py usage.", + "source_line": null + }, + { + "name": "Periodic Cache Refresh Policy", + "description": "Describes how often caches should be refreshed and includes checksum validation via the manifest helper to prevent stale or corrupted assets.", + "source_line": null + }, + { + "name": "Integration with Release Readiness Runbook", + "description": "Aligns fixture storage guidance with notarization, benchmark preflight checks, and other release readiness processes.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3235, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/Summary_of_Work_metrics.json new file mode 100644 index 00000000..134bfff8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README/Summary_of_Work.md", + "n_spec": 4, + "n_func": 3, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide documentation for fixture storage quotas, mount strategies, and cache maintenance steps for manifest-driven fixture downloads on macOS hardware runners and Linux CI agents.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation must include storage quotas, mount strategies, and cache maintenance steps as outlined in Documentation/FixtureCatalog/README.md.", + "source_line": null + }, + { + "type": "invariant", + "description": "The README should remain consistent with the manifest file and not allow fixture downloads during dry-run validation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use sparse bundle setup commands to ensure mounting precedes fixture sync on macOS runners, integrated into automation scripts or CI workflows.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Fixture Catalog Documentation", + "description": "Provides documentation on storage quotas, mount strategies, and cache maintenance for manifest-driven fixture downloads on macOS hardware runners and Linux CI agents.", + "source_line": null + }, + { + "name": "Generate Fixtures Script", + "description": "Python script to generate fixtures based on a manifest, with options to skip text fixtures and perform dry runs.", + "source_line": null + }, + { + "name": "Sparse Bundle Setup Commands", + "description": "Commands to set up sparse bundles for mounting fixtures before sync in automation scripts or CI workflows.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1116, + "line_count": 16 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/Summary_of_Work_metrics.json new file mode 100644 index 00000000..bbd3ef92 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must document macOS and Linux fixture storage quotas, mount expectations, and cache maintenance guidance in Documentation/FixtureCatalog/README.md.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Archive notes under DOCS/TASK_ARCHIVE/86_PDD_30m_Fixture_Storage_README to preserve historical context.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want to exercise the storage workflow end-to-end on macOS hardware so that I can validate the sparse bundle mount integration.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The CI job scripts must include commands to mount and test the sparse bundle after macOS hardware is available.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 492, + "line_count": 11 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/next_tasks_metrics.json new file mode 100644 index 00000000..a6ecbd95 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/87_Summary_of_Work_2025-10-18_Storage_Workflow/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 1842, + "line_count": 17 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/G6_Export_JSON_Actions_metrics.json b/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/G6_Export_JSON_Actions_metrics.json new file mode 100644 index 00000000..5be62fb5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/G6_Export_JSON_Actions_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/88_G6_Export_JSON_Actions/G6_Export_JSON_Actions.md", + "n_spec": 10, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Export the parsed box tree as JSON from the app UI, either the entire document or a selected subtree.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provide explicit export affordances (menu command + toolbar or context menu) for full document and selected subtree JSON captures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Wire UI actions to existing exporter pipeline so generated files match CLI schema, including offsets, sizes, and metadata fields.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Persist exported files to a user-chosen location via FilesystemAccessKit with proper sandbox-scoped bookmarks and error handling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Cover the feature with unit or UI tests that validate command availability and the structure of produced JSON for representative fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Update user-facing documentation or release notes if new UI elements are introduced.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend ISOInspectorApp scene commands and document toolbar with export options invoking JSON exporter APIs from ISOInspectorKit.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse existing document/session view models to scope exports (root vs. current selection) and ensure operations remain responsive by leveraging async tasks.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Integrate with FilesystemAccessKit save flows to present destination pickers on macOS/iPadOS/iOS and record bookmarks where required.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Coordinate with telemetry/logging to record export attempts and failures, following zero-trust logging conventions already in place.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Full Document JSON Export Command", + "description": "UI command to export the entire parsed box tree as a JSON file via the existing exporter pipeline", + "source_line": null + }, + { + "name": "Subtree JSON Export Command", + "description": "UI command to export only the currently selected subtree of the parsed box tree as JSON", + "source_line": null + }, + { + "name": "Export Menu Integration", + "description": "Adds menu items and toolbar/context menu entries for JSON export actions in ISOInspectorApp scene commands", + "source_line": null + }, + { + "name": "Filesystem Save Flow", + "description": "Presents a destination picker using FilesystemAccessKit, records sandbox-scoped bookmarks, and handles errors during file saving", + "source_line": null + }, + { + "name": "Exporter Pipeline Wiring", + "description": "Connects UI actions to ISOInspectorKit's JSON exporter APIs ensuring output matches CLI schema with offsets, sizes, and metadata", + "source_line": null + }, + { + "name": "Async Export Task Handling", + "description": "Runs export operations asynchronously to keep the UI responsive", + "source_line": null + }, + { + "name": "Telemetry Logging for Exports", + "description": "Records export attempts and failures following zero-trust logging conventions", + "source_line": null + }, + { + "name": "Unit/UI Test Coverage for Export Feature", + "description": "Tests that validate command availability and JSON structure against representative fixtures", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2376, + "line_count": 58 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/Summary_of_Work_metrics.json new file mode 100644 index 00000000..ff336033 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/Summary_of_Work_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/88_G6_Export_JSON_Actions/Summary_of_Work.md", + "n_spec": 7, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide users with the ability to export the entire document or a selected portion as JSON via toolbar buttons, command menu items, and outline context menu options.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "When the user initiates a JSON export, the system must use FilesystemAccessKit to write the file with a contextual filename and display status alerts in the UI indicating success or failure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Toolbar and context menu export controls should be enabled only when a selection is available, mirroring the availability of corresponding command menu items.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests must verify that exporter output matches expected JSON structure and that selection gating logic correctly enables or disables export actions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression tests should confirm that failure messages and diagnostics are shown when a selected node disappears or the save dialog fails, preventing silent regressions.", + "source_line": null + }, + { + "type": "invariant", + "description": "The DocumentSessionController must always orchestrate JSON exports through FilesystemAccessKit and propagate status alerts back to the UI.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "JSON export functionality is centralized in DocumentSessionController and shared across toolbar, command menu, and outline context menu via a common exporter pipeline.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Document-wide JSON Export", + "description": "Exports the entire document as a JSON file via toolbar, command menu, or outline context menu.", + "source_line": null + }, + { + "name": "Selection-scoped JSON Export", + "description": "Exports only the currently selected portion of the document as a JSON file through UI controls.", + "source_line": null + }, + { + "name": "Filesystem Access for Exports", + "description": "Handles writing exported JSON to disk using FilesystemAccessKit with contextual filenames.", + "source_line": null + }, + { + "name": "Status Alert Display", + "description": "Shows status alerts in the UI after export operations, indicating success or failure.", + "source_line": null + }, + { + "name": "Selection State Synchronization", + "description": "Keeps toolbar and context menu availability in sync with shared selection state.", + "source_line": null + }, + { + "name": "Export Gating Logic", + "description": "Prevents exports when no valid selection is present, enforcing selection gating.", + "source_line": null + }, + { + "name": "Error Handling for Missing Nodes", + "description": "Displays diagnostics when the selected node disappears during export.", + "source_line": null + }, + { + "name": "Error Handling for Save Dialog Failures", + "description": "Shows error messages if the save dialog fails to complete.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1555, + "line_count": 20 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/next_tasks_metrics.json new file mode 100644 index 00000000..9b633cc3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/88_G6_Export_JSON_Actions/next_tasks_metrics.json @@ -0,0 +1,27 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/88_G6_Export_JSON_Actions/next_tasks.md", + "n_spec": 3, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement Task G6 export actions so the app can produce JSON for the full tree or a selected subtree.", + "source_line": null + }, + { + "type": "invariant", + "description": "Task G6 export actions must correctly generate JSON for the full tree or a selected subtree.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Export actions produce valid JSON that matches expected structure for both full tree and selected subtree scenarios.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2062, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/89_Close_TODO_3/89_Close_TODO_3_metrics.json b/DOCS/TASK_ARCHIVE/89_Close_TODO_3/89_Close_TODO_3_metrics.json new file mode 100644 index 00000000..8c667208 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/89_Close_TODO_3/89_Close_TODO_3_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/89_Close_TODO_3/89_Close_TODO_3.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Confirm that backlog item `todo.md #3` is fully satisfied by existing VR-001 through VR-005 implementations and update the project trackers accordingly so the remaining TODO list reflects current reality.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`todo.md #3` is marked complete and references remain intact for each VR rule.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`DOCS/INPROGRESS/next_tasks.md` no longer lists an unassigned placeholder that simply points back to the backlog entry.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "New summary notes describe the close-out so future contributors see the reconciliation work in the PDD archive and the rolling `Summary_of_Work.md`.", + "source_line": null + }, + { + "type": "invariant", + "description": "VR ordering and structural rules were delivered across archived tasks `12_B5_VR001_VR002_Structural_Validation` and `13_B5_VR004_VR005_Ordering_Validation`, both of which document code-level validation behavior now present in the repository.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Audit existing code/tests in `Sources/ISOInspectorKit/Validation/` and `Tests/ISOInspectorKitTests/` to confirm VR-001\u2014VR-005 coverage before updating trackers.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Validate VR-001 through VR-005 implementation coverage", + "description": "Audit existing code and tests to confirm that validation rules VR-001 to VR-005 are fully implemented in the ISOInspectorKit repository.", + "source_line": null + }, + { + "name": "Update todo.md backlog status", + "description": "Mark backlog item #3 as complete and ensure all references to VR rules remain intact.", + "source_line": null + }, + { + "name": "Synchronize next_tasks.md tracker", + "description": "Remove placeholder entries related to backlog #3 from DOCS/INPROGRESS/next_tasks.md so the task list reflects current reality.", + "source_line": null + }, + { + "name": "Generate close\u2011out summary notes", + "description": "Create a new summary entry describing the reconciliation work and archive it in the PDD archive and Summary_of_Work.md.", + "source_line": null + }, + { + "name": "Run markdown formatting script", + "description": "Execute scripts/fix_markdown.py on updated Markdown files to normalize formatting.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1944, + "line_count": 23 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/89_Close_TODO_3/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/89_Close_TODO_3/Summary_of_Work_metrics.json new file mode 100644 index 00000000..2d43aa7e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/89_Close_TODO_3/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/89_Close_TODO_3/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 1068, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/89_Next_Tasks_Rollup/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/89_Next_Tasks_Rollup/next_tasks_metrics.json new file mode 100644 index 00000000..7842dd97 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/89_Next_Tasks_Rollup/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/89_Next_Tasks_Rollup/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 1971, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/Summary_of_Work_metrics.json new file mode 100644 index 00000000..f870d3c2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 495, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/next_tasks_metrics.json new file mode 100644 index 00000000..54c42443 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/90_Summary_of_Work_2025-10-19/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 2011, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/R3_Accessibility_Guidelines_metrics.json b/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/R3_Accessibility_Guidelines_metrics.json new file mode 100644 index 00000000..3bd5486a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/R3_Accessibility_Guidelines_metrics.json @@ -0,0 +1,78 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/R3_Accessibility_Guidelines.md", + "n_spec": 6, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Document VoiceOver, Dynamic Type, and keyboard navigation guidelines tailored to ISOInspector\u2019s SwiftUI tree, detail, and hex views so follow-on UI features stay aligned with the completed accessibility work.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Capture a written checklist covering VoiceOver labels, rotor navigation expectations, Dynamic Type behavior, and keyboard focus patterns for tree, detail, and hex surfaces.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Provide linkage to existing implementation touchpoints (e.g., accessibility identifiers, tests, and preview audits) plus gaps requiring follow-up bugs or research tasks.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Outline verification steps (Accessibility Inspector passes, XCTest coverage, manual QA scenarios) that future contributors must satisfy before shipping UI changes.", + "source_line": null + }, + { + "type": "invariant", + "description": "Non-functional requirement NFR-USAB-001 mandates VoiceOver and Dynamic Type support, and the product requirements emphasize keyboard navigation for all interactive components.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Existing NestedA11yIDs integration provides consistent identifiers, offering a baseline the guidelines should reference for automation and documentation touchpoints.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "VoiceOver Label Checklist", + "description": "A written checklist ensuring all UI components have appropriate VoiceOver labels and rotor navigation expectations.", + "source_line": null + }, + { + "name": "Dynamic Type Behavior Checklist", + "description": "A written checklist verifying that UI elements adapt correctly to Dynamic Type settings across breakpoints.", + "source_line": null + }, + { + "name": "Keyboard Navigation Verification", + "description": "Guidelines for testing keyboard focus patterns and shortcuts on tree, detail, and hex surfaces.", + "source_line": null + }, + { + "name": "Accessibility Identifier Mapping", + "description": "Linkage of existing accessibility identifiers (NestedA11yIDs) to implementation touchpoints for automation and documentation.", + "source_line": null + }, + { + "name": "Automated Test Integration", + "description": "Integration points for XCTest coverage and automated tests that validate accessibility compliance.", + "source_line": null + }, + { + "name": "Manual QA Scenarios", + "description": "Defined manual quality assurance scenarios using Accessibility Inspector and other tools.", + "source_line": null + }, + { + "name": "Platform Nuance Documentation", + "description": "Documentation of macOS vs. iPadOS/iOS differences in keyboard shortcuts, focus scopes, and Dynamic Type breakpoints.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2693, + "line_count": 46 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/Summary_of_Work_metrics.json new file mode 100644 index 00000000..b1f33f23 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/Summary_of_Work.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Developers can access and use the Accessibility Guidelines document to apply VoiceOver labels, Dynamic Type scaling, and keyboard navigation rules for parse tree explorer, detail inspector, and hex viewer.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Accessibility Guidelines document is linked from the DocC catalog and NestedA11yIDs integration notes so developers land on the checklist alongside identifier conventions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Running `swift test` covers ParseTreeAccessibilityIdentifierTests and accessibility formatter suites, ensuring identifier and descriptor regressions are protected.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The Accessibility Inspector manual audit checklist is updated in the Accessibility Guidelines document to direct future VoiceOver and rotor validation.", + "source_line": null + }, + { + "type": "invariant", + "description": "Accessibility gaps must be resolved before appending validation evidence to the summary for audit traceability.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Future rotor customization or phonetic spelling changes will be tracked as discrete @todo entries in todo.md once UX research scopes them.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Accessibility Guidelines Document", + "description": "Provides VoiceOver labels, Dynamic Type scaling, and keyboard navigation rules for parse tree explorer, detail inspector, and hex viewer.", + "source_line": null + }, + { + "name": "DocC Catalog Link to Accessibility Checklist", + "description": "Links the new guide from the DocC catalog and NestedA11yIDs integration notes so developers land on the checklist alongside identifier conventions.", + "source_line": null + }, + { + "name": "Swift Test Suite for Accessibility", + "description": "Runs swift test covering ParseTreeAccessibilityIdentifierTests and accessibility formatter suites protecting identifier and descriptor regressions.", + "source_line": null + }, + { + "name": "Accessibility Inspector Manual Audit Checklist", + "description": "Updated in the Accessibility Guidelines document to direct future VoiceOver and rotor validation.", + "source_line": null + }, + { + "name": "Todo Tracking System", + "description": "Tracks future rotor customization or phonetic spellings as discrete @todo entries, mirrored in todo.md when created.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1242, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/next_tasks_metrics.json new file mode 100644 index 00000000..03f3c89f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/next_tasks_metrics.json @@ -0,0 +1,33 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/91_R3_Accessibility_Guidelines/next_tasks.md", + "n_spec": 2, + "n_func": 2, + "intent_atoms": [ + { + "type": "user_story", + "description": "Evaluate rotor categories for validation issues once new UX research defines expected groupings.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture phonetic spellings or abbreviations for frequently announced hex byte patterns if VoiceOver pronunciation causes confusion during manual QA.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "Rotor Category Evaluation", + "description": "Evaluates rotor categories for validation issues based on new UX research groupings.", + "source_line": null + }, + { + "name": "Phonetic Spelling Capture for Hex Patterns", + "description": "Captures phonetic spellings or abbreviations for frequently announced hex byte patterns to improve VoiceOver pronunciation during manual QA.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 304, + "line_count": 4 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c567fc9a --- /dev/null +++ b/DOCS/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 976, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/next_tasks_metrics.json new file mode 100644 index 00000000..4e3ee9e2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/92_Summary_of_Work_2025-10-19_Accessibility_Guidelines/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 2112, + "line_count": 21 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/R4_Large_File_Performance_Benchmarks_metrics.json b/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/R4_Large_File_Performance_Benchmarks_metrics.json new file mode 100644 index 00000000..2007fda0 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/R4_Large_File_Performance_Benchmarks_metrics.json @@ -0,0 +1,128 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/R4_Large_File_Performance_Benchmarks.md", + "n_spec": 9, + "n_func": 14, + "intent_atoms": [ + { + "type": "user_story", + "description": "Validate ISOInspector against a 20 GB media file to ensure Phase F2 budgets of <100 MB peak memory and <200 ms UI latency remain credible before hardware validation.", + "source_line": null + }, + { + "type": "user_story", + "description": "Exercise both the CLI validator and the SwiftUI streaming bridge, which share the same streaming parser but surface different back\u2011pressure risks.", + "source_line": null + }, + { + "type": "user_story", + "description": "Capture repeatable metrics that can gate regressions inside XCTest Metric harnesses and inform release readiness sign\u2011off.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI validation sweep must complete within \u22647 minutes (\u224850\u202fMB/s sustained throughput), use <90\u202fMB RSS sustained, <100\u202fMB peak memory, and provide specified observability hooks.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI streaming export must complete within \u22649 minutes, use <95\u202fMB sustained, <105\u202fMB peak memory, and provide specified signposts and metrics.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI streaming session must render first frame in <350\u202fms, maintain steady\u2011state latency per update <200\u202fms, use <120\u202fMB peak combined app+CoreData caches, <80\u202fMB parser process memory, and provide specified logging and metric overlays.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI fragmented session must render initial frame in <500\u202fms, maintain steady\u2011state latency <250\u202fms per fragment batch, use same memory constraints as progressive scenario, and provide specified signposts and metrics.", + "source_line": null + }, + { + "type": "invariant", + "description": "All benchmark harnesses must enforce the defined runtime and memory budgets for each scenario.", + "source_line": null + }, + { + "type": "invariant", + "description": "Fixture creation recipes must produce deterministic 20\u202fGB assets with known layouts, verified by pre\u2011run analysis tools (ffprobe, mp4dump, etc.).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Validator Benchmark", + "description": "Runs isoinspector validate on a 20 GB progressive MP4 and measures runtime, memory, and signpost metrics", + "source_line": null + }, + { + "name": "CLI Streaming Export Benchmark", + "description": "Executes isoinspector inspect --stream on a 20 GB fragmented MP4, piping output to /dev/null while capturing throughput, CPU, and memory metrics", + "source_line": null + }, + { + "name": "SwiftUI Streaming Session Benchmark", + "description": "Automates ISOInspectorApp with a 20 GB progressive MP4, measuring first frame latency, steady-state update latency, and combined app/parser memory usage", + "source_line": null + }, + { + "name": "SwiftUI Fragmented Session Benchmark", + "description": "Automates ISOInspectorApp with a 20 GB fragmented MP4, capturing initial render latency, per-fragment batch latency, and parser memory metrics", + "source_line": null + }, + { + "name": "Synthetic Fixture Generation", + "description": "Creates deterministic 20 GB progressive MP4s using Bento4 mp4mux and dd padding, producing checksum manifests", + "source_line": null + }, + { + "name": "Fragmented Stressor Generation", + "description": "Fragments a synthetic asset into 8 MB segments with alternating track payloads via Bento4 mp4fragment, generating fragment boundary metadata", + "source_line": null + }, + { + "name": "Vendor Dataset Mirror Creation", + "description": "Mirrors publicly redistributable 4K mezzanine assets and expands them to 20 GB for realistic codec distribution benchmarks", + "source_line": null + }, + { + "name": "Synthetic Error Fixture Generation", + "description": "Injects malformed boxes or truncated fragments into synthetic fillers using GPAC MP4Box, producing error variants for regression testing", + "source_line": null + }, + { + "name": "Baseline Analysis Tooling", + "description": "Runs ffprobe, mp4dump, Bento4 mp4info to validate track tables and fragment layouts before benchmark runs", + "source_line": null + }, + { + "name": "XCTest Metrics Harness", + "description": "Collects timing, CPU, memory metrics via XCTestMetrics (e.g.,\u00a0XCTClockMetric\u00a0..), and enforces runtime/memory budgets", + "source_line": null + }, + { + "name": "Unified Logging & Signpost Collection", + "description": "Uses os_log categories and signposts to gather fine\u2011tuned latency data across scenarios", + "source_line": null + }, + { + "name": "Automated Fixture Provisioning Script", + "description": "Scripted workflow that generates fixtures, writes manifest files with SHA256 and cross\u2011linking; runs on macOS runner", + "source_line": null + }, + { + "name": "CI Benchmark Execution Pipeline", + "description": "Runs CI tests (Swift test/xcodebuild) for both CLI and UI benchmarks, automatically re\u2011runs if any metric exceeds thresholds", + "source_line": null + }, + { + "name": "Regression Dashboard Publishing", + "description": "Parses .xcresult metrics into benchmark\u2011tuning\u00a0JSON\u00a0and\u00a0..", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 8205, + "line_count": 82 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/Summary_of_Work_metrics.json new file mode 100644 index 00000000..e0b30d32 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/Summary_of_Work_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/Summary_of_Work.md", + "n_spec": 4, + "n_func": 7, + "intent_atoms": [ + { + "type": "invariant", + "description": "Runtime and memory budgets for CLI validation, CLI streaming export, and SwiftUI streaming sessions must be enforced by XCTest Metrics on 20 GB fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI and SwiftUI benchmarks must pass throughput expectations defined in the benchmark charter.", + "source_line": null + }, + { + "type": "user_story", + "description": "As a developer, I want to schedule macOS CLI/UI benchmark execution once hardware runners are available so that new benchmark assets can be consumed by UI automation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "The fixture generation, metric harness invocation, Instruments capture, and regression reporting workflow is orchestrated across macOS runners as documented in the tooling matrix.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "CLI Performance Benchmark Execution", + "description": "Execute command-line interface benchmarks for large file handling and validate throughput against defined runtime and memory budgets.", + "source_line": null + }, + { + "name": "SwiftUI Streaming Session Benchmarking", + "description": "Run SwiftUI streaming session benchmarks to measure performance with 20 GB fixtures, enforcing throughput expectations.", + "source_line": null + }, + { + "name": "Fixture Generation Workflow", + "description": "Generate test fixtures using synthetic fillers, fragmented stressors, vendor mirrors, and error scenarios according to documented acquisition strategy.", + "source_line": null + }, + { + "name": "Metric Harness Invocation", + "description": "Invoke XCTest metrics harnesses to capture performance data during benchmark runs.", + "source_line": null + }, + { + "name": "Instruments Capture Integration", + "description": "Collect detailed instrumentation data via Instruments during benchmark execution.", + "source_line": null + }, + { + "name": "Regression Reporting Pipeline", + "description": "Generate regression reports across macOS runners based on captured metrics and instrumentation results.", + "source_line": null + }, + { + "name": "Benchmark Execution Scheduling", + "description": "Schedule macOS CLI/UI benchmark executions once hardware runners become available, using the defined fixtures and instrumentation plan.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1362, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/next_tasks_metrics.json new file mode 100644 index 00000000..f8256b51 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/93_R4_Large_File_Performance_Benchmarks/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 2728, + "line_count": 26 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/H2_Unit_Tests_metrics.json b/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/H2_Unit_Tests_metrics.json new file mode 100644 index 00000000..f80f46d2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/H2_Unit_Tests_metrics.json @@ -0,0 +1,103 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/94_H2_Unit_Tests/H2_Unit_Tests.md", + "n_spec": 9, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish deterministic XCTest coverage for ISOInspectorKit parsing primitives so header math, container boundaries, and critical box field decoders remain stable across future refactors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests in Tests/ISOInspectorKitTests fail when header size arithmetic or parent/child range validation regresses.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Box-specific unit tests confirm decoded field values for key structures (ftyp, mvhd, tkhd, sample tables, codec configs).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Regression suite runs quickly enough for CI gating (<30s incremental) using lightweight fixtures.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation updated where necessary to reflect new test coverage expectations.", + "source_line": null + }, + { + "type": "invariant", + "description": "ISOInspectorKit modules (BoxHeader, BoxNode, FullBoxReader, targeted parsers) must correctly parse header math, container boundaries, and critical box fields.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use existing fixtures in Tests/ISOInspectorKitTests/Fixtures plus synthetic minimal boxes generated inline for edge cases.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Incorporate failure-case fixtures from the manifest workflow to assert error pathways without relying on macOS-specific tooling.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Consider using helper builders (e.g., TestFileHandle) to simulate truncated payloads or overlapping ranges.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ISOInspectorKit BoxHeader Parser", + "description": "Parses and validates MP4/MOV box headers for size and type", + "source_line": null + }, + { + "name": "ISOInspectorKit BoxNode Structure", + "description": "Represents hierarchical relationships between boxes in a media file", + "source_line": null + }, + { + "name": "FullBoxReader Decoder", + "description": "Decodes full-box fields such as version, flags, and extended data", + "source_line": null + }, + { + "name": "FTYP Box Field Decoder", + "description": "Validates and extracts major brand, compatible brands from ftyp box", + "source_line": null + }, + { + "name": "MVHD Box Field Decoder", + "description": "Parses movie header information like creation time, duration, etc.", + "source_line": null + }, + { + "name": "TKHD Box Field Decoder", + "description": "Parses track header details including track ID, duration, and dimensions", + "source_line": null + }, + { + "name": "Sample Table Parser", + "description": "Processes sample tables for media data extraction", + "source_line": null + }, + { + "name": "Codec Configuration Parser", + "description": "Decodes codec configuration boxes such as AVC/H.264, HEVC, etc.", + "source_line": null + }, + { + "name": "TestFileHandle Builder", + "description": "Simulates file handles for truncated or overlapping payloads in unit tests", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2001, + "line_count": 42 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/Summary_of_Work_metrics.json new file mode 100644 index 00000000..098c2d5c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/Summary_of_Work_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/94_H2_Unit_Tests/Summary_of_Work.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 646, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/next_tasks_metrics.json new file mode 100644 index 00000000..d1b8ad5c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/94_H2_Unit_Tests/next_tasks_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/94_H2_Unit_Tests/next_tasks.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 2938, + "line_count": 30 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/C4_mdhd_Media_Header_Parser_metrics.json b/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/C4_mdhd_Media_Header_Parser_metrics.json new file mode 100644 index 00000000..ce32903b --- /dev/null +++ b/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/C4_mdhd_Media_Header_Parser_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/C4_mdhd_Media_Header_Parser.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a concrete parser for mdhd (Media Header) boxes so the streaming pipeline, CLI exports, and SwiftUI detail panes surface creation/modification timestamps, media timescale, duration, and ISO-639-2/T language codes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers an mdhd parser that consumes the full box header via FullBoxReader and extracts creation and modification timestamps (32- or 64-bit based on version), timescale and duration fields, language code (converted from the packed 5-bit characters), optional pre-roll or reserved fields documented in the PRD.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser returns a ParsedBoxPayload that powers CLI JSON export and SwiftUI detail views with descriptive labels and byte ranges.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests cover both version 0 and version 1 payload layouts, including malformed/short payload handling.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Hex/detail UI reflects parsed values for representative fixtures without regressions in existing tests.", + "source_line": null + }, + { + "type": "invariant", + "description": "mdhd parser gracefully returns nil when payload length is insufficient, matching registry conventions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse FullBoxReader to handle version/flags and derive the payload cursor.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use helper utilities (extend if necessary) to decode the 15-bit language code into a three\u2011letter identifier.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "mdhd Box Parser", + "description": "Parses 'mdhd' Media Header boxes extracting creation/modification timestamps, timescale, duration, language code, and optional fields using FullBoxReader.", + "source_line": null + }, + { + "name": "FullBoxReader Integration", + "description": "Utilizes FullBoxReader to read versioned full box headers and provide payload cursor for mdhd parsing.", + "source_line": null + }, + { + "name": "Language Code Decoder", + "description": "Decodes 15-bit packed language codes into three-letter ISO-639-2/T identifiers.", + "source_line": null + }, + { + "name": "CLI JSON Exporter", + "description": "Outputs parsed mdhd data as JSON for command-line interface exports.", + "source_line": null + }, + { + "name": "SwiftUI Detail View Renderer", + "description": "Displays parsed mdhd information with descriptive labels and byte ranges in SwiftUI detail panes.", + "source_line": null + }, + { + "name": "Unit Test Suite for mdhd Parser", + "description": "Tests both version 0 and version 1 payload layouts, malformed/short payload handling, and fixture validation.", + "source_line": null + }, + { + "name": "Parser Registry Entry", + "description": "Registers the mdhd parser in BoxParserRegistry so it can be invoked during parsing.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2406, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..d6f66cb7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/Summary_of_Work.md", + "n_spec": 6, + "n_func": 1, + "intent_atoms": [ + { + "type": "user_story", + "description": "Parse mdhd (Media Header) boxes to expose media header metadata in CLI exports, streaming pipeline, and SwiftUI detail panes.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser must read versioned timestamps, timescale, duration, language, and reserved fields for both 32-bit and 64-bit layouts using FullBoxReader.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Language code decoding helpers are added and short payloads cause the parser to return nil instead of partial data.", + "source_line": null + }, + { + "type": "invariant", + "description": "Parser must always register with BoxParserRegistry so that all components can surface media header metadata.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Use FullBoxReader for reading mdhd boxes and return a structured ParsedBoxPayload.", + "source_line": null + }, + { + "type": "user_story", + "description": "Implement hdlr (handler) parser to finish remaining Phase C backlog item referenced in MVP checklists.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "mdhd Box Parser", + "description": "Parses mdhd (Media Header) boxes from ISO media files, extracting versioned timestamps, timescale, duration, language, and reserved fields into a structured ParsedBoxPayload for both 32-bit and 64\u2011bit layouts.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1347, + "line_count": 24 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..293e5071 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/next_tasks_metrics.json @@ -0,0 +1,57 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/95_C4_mdhd_Media_Header_Parser/next_tasks.md", + "n_spec": 9, + "n_func": 0, + "intent_atoms": [ + { + "type": "invariant", + "description": "The system must always register a parser for mdhd boxes in ISOInspectorKit and provide tests validating timestamp, timescale, duration, and language metadata extraction.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using the R4 protocol once dedicated hardware runners are available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS automation with Instruments support must be available to run the large-file benchmark; fixtures and manifest revisions should be tracked in the specified documentation.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA once runners are available following the release readiness runbook.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS infrastructure must support DocC generation, notarization, TestFlight export and QA; relevant runbooks and archival notes must be referenced.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute random slice benchmark suite on macOS hardware once Combine support is available to compare mapped vs. chunked readers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "macOS runner with Combine must present identical workloads for benchmarking; documentation references must follow.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI support to validate SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The\u00a0\u2026", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2567, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/C5_hdlr_Handler_Parser_metrics.json b/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/C5_hdlr_Handler_Parser_metrics.json new file mode 100644 index 00000000..9b3342c8 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/C5_hdlr_Handler_Parser_metrics.json @@ -0,0 +1,98 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/C5_hdlr_Handler_Parser.md", + "n_spec": 8, + "n_func": 9, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a concrete parser for the ISO BMFF `hdlr` (handler reference) box so media, metadata, and streaming contexts expose handler type and name details across the CLI, SwiftUI detail panes, and JSON exports.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "`BoxParserRegistry` registers a `hdlr` parser that extracts handler type, subtype, and name strings using the shared `FullBoxReader` for `(version, flags)`.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing representative fixtures populates structured data for movie (`mdia/hdlr`) and metadata (`meta/hdlr`) boxes, with unit tests covering text vs. null-terminated names.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming pipeline, CLI exports, and SwiftUI detail panes render handler metadata without regressions (update snapshots or fixtures if required).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation and backlog entries referencing the missing `hdlr` parser are updated to reflect active work and eventual completion.", + "source_line": null + }, + { + "type": "invariant", + "description": "The parser must gracefully handle null-terminated names and empty strings, matching expectations in Bento4 sample files located under `DOCS/SAMPLES`. ", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse `FullBoxReader` to consume the header, then parse `pre_defined`, `handler_type`, `reserved` fields, and the UTF-8/Pascal name as described in ISO/IEC 14496-12.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the `HandlerType` model (if present) or introduce a lightweight wrapper to expose common handlers (..).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "hdlr Box Parser", + "description": "Parses ISO BMFF handler reference boxes extracting handler type, subtype, and name strings using FullBoxReader.", + "source_line": null + }, + { + "name": "FullBoxReader Integration", + "description": "Consumes version and flags from full box headers for hdlr parsing.", + "source_line": null + }, + { + "name": "HandlerType Model Extension", + "description": "Provides lightweight wrapper or extension to expose common handler types such as vide, soun, hint, mdir.", + "source_line": null + }, + { + "name": "Null-Terminated Name Handling", + "description": "Gracefully parses null-terminated names and empty strings in hdlr boxes.", + "source_line": null + }, + { + "name": "BoxParserRegistry Update", + "description": "Registers the hdlr parser in the registry's default parser map.", + "source_line": null + }, + { + "name": "JSON Export Schema Translation", + "description": "Ensures handler metadata is preserved through JSON exports.", + "source_line": null + }, + { + "name": "CLI Export Rendering", + "description": "Renders handler metadata in command-line interface outputs.", + "source_line": null + }, + { + "name": "SwiftUI Detail Pane Rendering", + "description": "Displays handler metadata in SwiftUI detail panes.", + "source_line": null + }, + { + "name": "Unit Tests for hdlr Parsing", + "description": "Tests that read fixtures and assert correct handler metadata extraction.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2518, + "line_count": 39 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..1e83037d --- /dev/null +++ b/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,58 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/Summary_of_Work.md", + "n_spec": 4, + "n_func": 5, + "intent_atoms": [ + { + "type": "architectural_decision", + "description": "Implemented a concrete parser for the `hdlr` box in BoxParserRegistry that decodes version, flags, handler_type, normalized handler categories, and UTF-8 handler names using FullBoxReader.", + "source_line": null + }, + { + "type": "user_story", + "description": "Provide human-friendly handler category display by introducing a reusable HandlerType model to classify common four-character codes such as vide, soun, mdir.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Ensure that handler metadata propagates from the streaming pipeline into JSON exports and on-screen annotations via CLI export path and SwiftUI detail flows.", + "source_line": null + }, + { + "type": "invariant", + "description": "Handler names must be decoded using UTF-8 encoding.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "hdlr handler parser", + "description": "Parses 'hdlr' boxes decoding version, flags, handler_type, normalizes categories and UTF-8 names using FullBoxReader", + "source_line": null + }, + { + "name": "HandlerType model", + "description": "Classifies common handler four-character codes into human-friendly categories for downstream exports", + "source_line": null + }, + { + "name": "CLI export path extension", + "description": "Extends CLI to include handler metadata in JSON exports", + "source_line": null + }, + { + "name": "SwiftUI detail flow update", + "description": "Displays handler metadata on-screen annotations in SwiftUI views", + "source_line": null + }, + { + "name": "Regression tests for handler metadata propagation", + "description": "Ensures handler data flows from streaming pipeline into JSON and UI", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1052, + "line_count": 19 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..3ce233d7 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/next_tasks_metrics.json @@ -0,0 +1,72 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/96_C5_hdlr_Handler_Parser/next_tasks.md", + "n_spec": 12, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement the hdlr parser to close out remaining Phase C backlog item referenced in MVP checklists and surface handler metadata alongside mdhd parser coverage.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The hdlr parser must integrate with BoxParserRegistry wiring so that streaming pipeline, CLI exports, and SwiftUI detail panes display handler metadata.", + "source_line": null + }, + { + "type": "invariant", + "description": "Handler metadata must be consistently available across all interfaces (streaming pipeline, CLI, SwiftUI).", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using the R4 protocol once dedicated hardware runners are online.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmarks should run on macOS with Instruments support and track fixtures and manifest revisions as documented.", + "source_line": null + }, + { + "type": "invariant", + "description": "Benchmark results must be reproducible and recorded in specified documentation files.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA once runners are available following the release readiness runbook.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All steps of the release readiness runbook must be completed and documented in the specified guides.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute random slice benchmark suite on macOS to compare mapped vs. chunked readers under identical workloads once Combine support is available.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results should reflect comparable workloads and be recorded as per archival notes.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI support to validate end\u2011to\u2011end SwiftUI automation flow.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Test suite must run successfully on macOS and confirm that the automation flow works.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2657, + "line_count": 25 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/C6_stsd_Sample_Description_Parser_metrics.json b/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/C6_stsd_Sample_Description_Parser_metrics.json new file mode 100644 index 00000000..5b70a7e3 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/C6_stsd_Sample_Description_Parser_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/C6_stsd_Sample_Description_Parser.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement parsing support for the stsd (Sample Description) box so the pipeline can enumerate media sample entries, classify audio versus visual codecs, and expose structured metadata for downstream validation and UI layers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers a parser for stsd, returning a ParsedBoxPayload that surfaces entry_count plus a collection of parsed sample entries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each sample entry records its format (fourcc), size, and critical header fields (e.g., width/height for visual, channel/sample rate for audio).", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests feed representative audio and visual fixtures to ensure parsed entries align with ISO/IEC 14496-12 structure.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Exporters and UI components can render the parsed metadata without additional manual decoding.", + "source_line": null + }, + { + "type": "invariant", + "description": "Byte range calculations guard against malformed lengths, matching validation expectations outlined in existing structural rules.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse FullBoxReader helpers for version/flags to simplify parsing and maintain consistent byte range accounting.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Leverage streaming tree builders to attach parsed entry data to ParseTreeNode instances so validation and export layers consume a uniform structure.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Start with baseline support for ISO base media sample entries (mp4a, avc1, hvc1, hev1) and design extensible decoding to add codecs iteratively.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stsd Box Parser", + "description": "Parses the 'stsd' (Sample Description) box and returns a ParsedBoxPayload containing entry_count and parsed sample entries.", + "source_line": null + }, + { + "name": "Parsed Sample Entry Representation", + "description": "Each sample entry includes format (fourcc), size, and critical header fields such as width/height for visual codecs or channel/sample rate for audio codecs.", + "source_line": null + }, + { + "name": "FullBoxReader Integration", + "description": "Utilizes FullBoxReader helpers to read version and flags of the stsd box during parsing.", + "source_line": null + }, + { + "name": "ParseTreeNode Attachment", + "description": "Attaches parsed entry data to ParseTreeNode instances for uniform consumption by validation, export, and UI layers.", + "source_line": null + }, + { + "name": "Baseline Codec Support", + "description": "Provides initial decoding support for ISO base media sample entries: mp4a, avc1, hvc1, hev1.", + "source_line": null + }, + { + "name": "Byte Range Validation", + "description": "Calculates byte ranges and guards against malformed lengths to satisfy structural validation rules.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2619, + "line_count": 37 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c565679e --- /dev/null +++ b/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,48 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/Summary_of_Work.md", + "n_spec": 6, + "n_func": 1, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a sample description parser that can enumerate each sample entry, record byte lengths, and capture shared header fields such as the data reference index.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The parser must recognize baseline visual codecs (avc1, hvc1, hev1) and audio codec mp4a, exposing width/height or channel configuration and sample rate metadata for downstream consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit tests (StsdSampleDescriptionParserTests) must validate parsed metadata against ISO/IEC 14496-12 layout expectations using representative avc1 and mp4a fixtures.", + "source_line": null + }, + { + "type": "invariant", + "description": "The parser should always record entry byte lengths accurately for each sample entry.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Add a full-box parser to BoxParserRegistry that enumerates sample entries and captures shared header fields.", + "source_line": null + }, + { + "type": "user_story", + "description": "Extend the parser with additional codec-specific field extraction (e.g., avcC, hvcC, encrypted variants) as future tasks define required metadata surface.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "stsd sample description parser", + "description": "Parses MP4 'stsd' boxes to enumerate sample entries, record byte lengths, and expose shared header fields such as data reference index, width/height for visual codecs (avc1,hvc1,hev1) and channel configuration/sample rate for audio codec mp4a.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1194, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..a068164c --- /dev/null +++ b/DOCS/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/next_tasks_metrics.json @@ -0,0 +1,62 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/97_C6_stsd_Sample_Description_Parser/next_tasks.md", + "n_spec": 10, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement the stsd sample description parser to enumerate media sample entries.", + "source_line": null + }, + { + "type": "invariant", + "description": "The stsd parser must correctly enumerate all media sample entries as defined in the specification.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "The implementation is considered complete when the parser produces the expected enumeration of media sample entries and passes all relevant unit tests.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate additional handler type categorizations if future boxes require specialized roles beyond the current mapping set.", + "source_line": null + }, + { + "type": "invariant", + "description": "Handler type categorizations must remain consistent with existing mappings unless a new requirement is identified.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "A refined categorization scheme is documented and reviewed when new handler types are added.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule macOS CLI/UI large-file benchmark execution using the R4 protocol.", + "source_line": null + }, + { + "type": "invariant", + "description": "Benchmark results must reflect accurate performance metrics for large files.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmarks run on dedicated macOS hardware and executed with the R4 protocol, resulting in a report.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS DocC generation, notarization\u2026", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 2712, + "line_count": 29 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/H3_JSON_Export_Snapshot_Tests_metrics.json b/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/H3_JSON_Export_Snapshot_Tests_metrics.json new file mode 100644 index 00000000..00cef6c2 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/H3_JSON_Export_Snapshot_Tests_metrics.json @@ -0,0 +1,93 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/H3_JSON_Export_Snapshot_Tests.md", + "n_spec": 9, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Establish deterministic snapshot coverage for ISOInspectorKit's JSON export pipeline using representative fixture files so schema or formatting regressions are detected automatically.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot fixtures exist for at least one small MP4 sample per major track type (video, audio, metadata) covering nested containers and parsed fields.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Running swift test exercises new snapshot cases that fail when JSON output changes unexpectedly.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot baselines live alongside existing exporter tests with documentation on how to update them after intentional schema revisions.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests run in CI without macOS-only requirements and complete within current suite timing targets.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse ParseTreeBuilder to generate deterministic tree structures from fixture parse events before exporting via JSONParseTreeExporter.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Store JSON baselines in the Tests target using stable formatting (sorted keys, pretty-printed) to minimize churn.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Cover both CLI-facing and Swift API entry points if they produce distinct export code paths; otherwise document why a single path suffices.", + "source_line": null + }, + { + "type": "invariant", + "description": "Snapshot files reside in Tests/ISOInspectorKitTests/Fixtures/Snapshots/ and are generated in pretty-printed form to reduce churn.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSONExportSnapshotTests", + "description": "Runs snapshot tests comparing exported JSON trees against stored baselines for various media fixture files", + "source_line": null + }, + { + "name": "ParseTreeBuilder usage in tests", + "description": "Generates deterministic parse tree structures from fixture parse events before exporting", + "source_line": null + }, + { + "name": "JSONParseTreeExporter", + "description": "Exports parse trees to JSON format used by snapshot tests", + "source_line": null + }, + { + "name": "CLI-facing export path", + "description": "Entry point for exporting via command line that may produce distinct code paths", + "source_line": null + }, + { + "name": "Swift API export path", + "description": "Programmatic entry point for exporting parse trees to JSON", + "source_line": null + }, + { + "name": "Snapshot baseline storage", + "description": "Stores pretty\u2011printed, sorted\u2011key JSON baselines in Tests/ISOInspectorKitTests/Fixtures/Snapshots/", + "source_line": null + }, + { + "name": "Snapshot update workflow", + "description": "Environment variable ISOINSPECTOR_REGENERATE_SNAPSHOTS triggers regeneration of snapshot files during test run", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2904, + "line_count": 62 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/Summary_of_Work_metrics.json new file mode 100644 index 00000000..58859dbf --- /dev/null +++ b/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/Summary_of_Work_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/Summary_of_Work.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Provide a mechanism to export JSON snapshots for ISOInspectorKit tests", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshots must be stored in Tests/ISOInspectorKitTests/Fixtures/Snapshots/ with pretty-printed, sorted JSON", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot update workflow requires running ISOINSPECTOR_REGENERATE_SNAPSHOTS=1 swift test --filter JSONExportSnapshotTests and reviewing regenerated files before re-running the suite", + "source_line": null + }, + { + "type": "invariant", + "description": "Combine-dependent benchmarks remain skipped on Linux containers", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 732, + "line_count": 13 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/next_tasks_metrics.json new file mode 100644 index 00000000..62e55120 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/next_tasks_metrics.json @@ -0,0 +1,123 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/98_H3_JSON_Export_Snapshot_Tests/next_tasks.md", + "n_spec": 14, + "n_func": 8, + "intent_atoms": [ + { + "type": "user_story", + "description": "Extend the stsd sample description parser to extract codec-specific fields such as avcC, hvcC, and encrypted variants when future tasks define required metadata surface.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parser must correctly extract codec-specific fields for supported codecs once metadata surface is defined.", + "source_line": null + }, + { + "type": "user_story", + "description": "Evaluate additional handler type categorizations in the hdlr parser if future boxes require specialized roles beyond current mapping set.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Handler type categorization should accommodate new specialized roles as identified.", + "source_line": null + }, + { + "type": "user_story", + "description": "Schedule and execute macOS CLI/UI large-file benchmark using R4 protocol on dedicated hardware runners.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results must be captured and documented once macOS automation with Instruments support is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute macOS DocC generation, notarization, TestFlight export, and hardware-dependent QA following release readiness runbook.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "All steps of the release readiness runbook must be completed and documented once macOS infrastructure is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run random slice benchmark suite on macOS hardware to compare mapped vs. chunked readers under identical workloads using Combine support.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Benchmark results should show comparable performance metrics between mapped and chunked readers when Combine is available.", + "source_line": null + }, + { + "type": "user_story", + "description": "Run ParseTreeStreamingSelectionAutomationTests on macOS with XCTest UI to validate SwiftUI automation flow for streaming selection.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Automation tests must pass and confirm end-to-end SwiftUI flow works as introduced.", + "source_line": null + }, + { + "type": "user_story", + "description": "Execute Combine-backed UI benchmark on macOS to capture latency metrics while maintaining CLI throughput parity.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Latency metrics should be captured and recorded with Combine support, ensuring throughput remains consistent with CLI harness.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "JSON Export Snapshot Tests", + "description": "Captures baseline snapshots of JSON export for representative fixtures", + "source_line": null + }, + { + "name": "stsd Sample Description Parser Extension", + "description": "Parses codec-specific fields such as avcC, hvcC and encrypted variants from stsd boxes", + "source_line": null + }, + { + "name": "hdlr Handler Type Categorization Evaluation", + "description": "Evaluates additional handler type categorizations for specialized roles in hdlr boxes", + "source_line": null + }, + { + "name": "macOS CLI/UI Large-File Performance Benchmark Execution", + "description": "Runs large-file benchmarks on macOS using the R4 protocol to measure performance of CLI and UI paths", + "source_line": null + }, + { + "name": "Release Readiness Validation Workflow", + "description": "Executes DocC generation, notarization, TestFlight export and hardware QA for release readiness", + "source_line": null + }, + { + "name": "Random Slice Benchmark Suite Execution", + "description": "Runs random slice benchmark suite on macOS to compare mapped vs. chunked readers", + "source_line": null + }, + { + "name": "ParseTree Streaming Selection Automation Tests", + "description": "Automates SwiftUI UI flow to validate end-to-end streaming selection in parse trees", + "source_line": null + }, + { + "name": "Combine-Backed UI Benchmark Execution", + "description": "Captures latency metrics for Combine-backed UI benchmarks on macOS", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2940, + "line_count": 33 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/C1_ftyp_Box_Parser_metrics.json b/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/C1_ftyp_Box_Parser_metrics.json new file mode 100644 index 00000000..3b346093 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/C1_ftyp_Box_Parser_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/C1_ftyp_Box_Parser.md", + "n_spec": 9, + "n_func": 6, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement a streaming parser for the ftyp box that extracts major_brand, minor_version, and ordered compatible_brands so downstream validation and UI layers can display compatibility metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "BoxParserRegistry registers a concrete ftyp parser that emits typed field values for major_brand, minor_version, and every compatible_brand detected in payload order.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Parsing logic handles payload lengths that are not multiples of four gracefully, rejecting malformed brand lists via existing validation pathways.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Snapshot/fixture coverage exercises representative MP4 samples to verify decoded values and confirm JSON exports surface the new metadata fields.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "CLI and UI layers surface decoded ftyp metadata without regressions in streaming order validation.", + "source_line": null + }, + { + "type": "invariant", + "description": "The parser must integrate with the existing registry and streaming pipeline from Tasks B1\u2013B5 to correctly identify the first ftyp occurrence for VR-004 ordering validation.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend the streaming parser event model to attach a structured payload (e.g., FtypBox) while preserving existing node construction behavior.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Reuse shared RandomAccessReader utilities for big-endian four-character codes and integers introduced in Tasks B1\u2013B3.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Update JSON export schemas and any UI detail presenters to include the new fields; coordinate with existing snapshot tests to capture schema evolution.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ftyp Box Parser", + "description": "Streams and parses the ftyp box extracting major_brand, minor_version, and ordered compatible_brands for downstream validation and UI display.", + "source_line": null + }, + { + "name": "BoxParserRegistry Registration", + "description": "Registers the concrete ftyp parser in the registry so it can be invoked during parsing.", + "source_line": null + }, + { + "name": "Payload Length Validation", + "description": "Handles non-multiple-of-four payload lengths gracefully, rejecting malformed brand lists via existing validation pathways.", + "source_line": null + }, + { + "name": "Structured Payload Attachment", + "description": "Extends the streaming parser event model to attach a structured FtypBox payload while preserving node construction behavior.", + "source_line": null + }, + { + "name": "JSON Export Schema Update", + "description": "Updates JSON export schemas and UI detail presenters to include new ftyp metadata fields.", + "source_line": null + }, + { + "name": "CLI/UI Display of ftyp Metadata", + "description": "Ensures CLI and UI layers surface decoded ftyp metadata without regressions in streaming order validation.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2652, + "line_count": 41 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/Summary_of_Work_metrics.json new file mode 100644 index 00000000..c8bd1ad4 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "invariant", + "description": "ParsedBoxPayload must always include structured fileType detail containing major_brand, minor_version, and ordered compatible_brands list when parsing ftyp box.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "BoxParserRegistry implementation updated to populate structured payload while maintaining byte-range aware field extraction for UI annotations and exports.", + "source_line": null + }, + { + "type": "user_story", + "description": "JSON parse tree exporter should persist the new structured payload in snapshot outputs so CLI exports, fixtures, and downstream consumers can surface parsed metadata.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and integration tests must verify that structured payload propagates through registry, live pipeline, and deterministic JSON exporter.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ftyp box parser", + "description": "Parses the ftyp box of media files and extracts structured metadata such as major_brand, minor_version, and compatible_brands while preserving byte-range annotations for UI and export purposes.", + "source_line": null + }, + { + "name": "ParsedBoxPayload enhancement", + "description": "Extends ParsedBoxPayload to include a structured fileType detail that carries decoded brand information for downstream consumers.", + "source_line": null + }, + { + "name": "BoxParserRegistry update", + "description": "Populates the structured ftyp payload during parsing, maintaining field extraction for annotations and exports.", + "source_line": null + }, + { + "name": "JSON parse tree exporter extension", + "description": "Exports the structured ftyp payload in snapshot outputs so CLI exports, fixtures, and downstream consumers can access parsed metadata.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 1337, + "line_count": 22 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/next_tasks_metrics.json b/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/next_tasks_metrics.json new file mode 100644 index 00000000..04e88867 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/next_tasks_metrics.json @@ -0,0 +1,22 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/99_C1_ftyp_Box_Parser/next_tasks.md", + "n_spec": 2, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate ftyp brand metadata with codec inference so that CLI and UI flows can present combined brand/codec summaries.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ftyp brand metadata is integrated with codec inference once stsd payload models expose the required hooks.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 283, + "line_count": 3 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/ARCHIVE_SUMMARY_metrics.json b/DOCS/TASK_ARCHIVE/ARCHIVE_SUMMARY_metrics.json new file mode 100644 index 00000000..141eb230 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/ARCHIVE_SUMMARY_metrics.json @@ -0,0 +1,232 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/ARCHIVE_SUMMARY.md", + "n_spec": 0, + "n_func": 44, + "intent_atoms": [], + "functional_units": [ + { + "name": "Permanently Blocked Tasks Archive", + "description": "Central repository for tasks that cannot proceed due to missing resources; provides documentation and conditions required to resume.", + "source_line": null + }, + { + "name": "CI Pipeline Configuration", + "description": "Automated GitHub Actions workflow that builds and tests ISOInspector Swift package on every pull request, with status checks and caching.", + "source_line": null + }, + { + "name": "ParsePipeline Streaming Interface Evaluation", + "description": "Documentation of asynchronous ParsePipeline event model, parser integration guidance, and fixture planning for streaming validation.", + "source_line": null + }, + { + "name": "ParsePipeline Live Streaming Implementation", + "description": "Implementation of ParsePipeline.live() for nested box traversal, offset accounting, and regression unit tests.", + "source_line": null + }, + { + "name": "ParsePipeline Live Integration with Production Walker", + "description": "Wiring of ParsePipeline.live() to the production StreamingBoxWalker, validating nested traversal and cancellation propagation.", + "source_line": null + }, + { + "name": "MP4RA Metadata Catalog Integration", + "description": "Integration of MP4RA-backed BoxCatalog into streaming pipeline, including bundled metadata fixture and diagnostics coverage.", + "source_line": null + }, + { + "name": "MP4RA Catalog Refresh Automation", + "description": "CLI automation for regenerating MP4RABoxes.json and maintaining catalog alignment with upstream registry.", + "source_line": null + }, + { + "name": "Metadata-Driven Validation & Reporting Extension", + "description": "Extension of MP4RA metadata-aware validation layer, integration of EventConsoleFormatter, and reporting updates exposing catalog-backed context.", + "source_line": null + }, + { + "name": "VR-003 Metadata Comparison Rule Implementation", + "description": "CLI and validation pipeline warning flow for comparing metadata against catalog data with expanded coverage for truncated payloads.", + "source_line": null + }, + { + "name": "VR-003 Metadata Validation Tests", + "description": "Unit and live parse integration tests ensuring VR-003 comparison behavior remains warning-free.", + "source_line": null + }, + { + "name": "Structural Validation Rules VR-001/VR-002", + "description": "Validation of impossible box sizes, boundary drift detection, and regression coverage in BoxValidatorTests.", + "source_line": null + }, + { + "name": "Ordering Validation Rules VR-004/VR-005", + "description": "State tracking for ftyp precedence, streaming-aware exceptions for fragmented layouts, and unit/integration coverage.", + "source_line": null + }, + { + "name": "VR-006 Research Logging Delivery", + "description": "Persistent research logging shared by CLI and UI consumers with configurable log handling and expanded pipeline coverage.", + "source_line": null + }, + { + "name": "Research Log Monitoring & Adoption", + "description": "Audit helper and monitoring checklist for VR-006 diagnostics across SwiftUI previews and UI smoke telemetry.", + "source_line": null + }, + { + "name": "SwiftUI Preview Integration of ResearchLogMonitor", + "description": "Integration of ResearchLogMonitor.audit(logURL:) into SwiftUI previews, deterministic VR-006 fixtures, preview diagnostics views.", + "source_line": null + }, + { + "name": "Telemetry Smoke Tests for VR-006", + "description": "Automated tests exercising ResearchLogTelemetryProbe and Snapshot across CLI and SwiftUI entry points.", + "source_line": null + }, + { + "name": "Combine Bridge & ParseTree Store Integration", + "description": "Combine-based bridge fans out ParseEvent streams to @MainActor parse tree store aggregating validation issues for SwiftUI consumers.", + "source_line": null + }, + { + "name": "SwiftUI Tree View Virtualization", + "description": "Outline explorer powered by ParseTreeStore with severity filtering, search, and preview data seeding for virtualization experiments.", + "source_line": null + }, + { + "name": "Streaming Outline Explorer Integration", + "description": "Explorer consuming live ParseTreeStore snapshots, latency instrumentation via Logger signposts, and removal of preview-only sample data.", + "source_line": null + }, + { + "name": "Outline Filters Extension", + "description": "Reusable box classification helpers and streaming metadata toggles extending outline explorer filters while maintaining performance.", + "source_line": null + }, + { + "name": "Detail & Hex Inspectors", + "description": "SwiftUI detail and hex inspectors bound to ParseTreeSnapshot updates with metadata panes, validation issue listings, and synchronized hex slices.", + "source_line": null + }, + { + "name": "Field Subrange Highlighting", + "description": "Synchronized SwiftUI detail pane annotations and hex highlighting for selectable field subranges.", + "source_line": null + }, + { + "name": "Category Filtering in Outline Explorer", + "description": "MP4RA catalog enrichment adding category chips and streaming toggles to outline explorer without regression.", + "source_line": null + }, + { + "name": "Automated Fixture Corpus Development", + "description": "Roadmap and implementation of automated test fixtures covering fragmented, DASH, large payload, and malformed samples.", + "source_line": null + }, + { + "name": "CoreData Annotation Persistence", + "description": "CoreData-backed annotation and bookmark store with sync between persistence layer and SwiftUI consumers.", + "source_line": null + }, + { + "name": "JSON & Binary Export Modules", + "description": "Reusable parse tree builder plus JSON and binary exporters in ISOInspectorKit with CLI smoke coverage.", + "source_line": null + }, + { + "name": "CLI Export Commands", + "description": "Implementation of export-json and export-capture commands, option parsing, output validation, and integration with ISOInspectorKit exporters.", + "source_line": null + }, + { + "name": "DocC Catalog Setup & Publishing CI", + "description": "Scaffolding for ISOInspectorKit DocC catalog, automation scripts, and GitHub Actions job for publishing archives.", + "source_line": null + }, + { + "name": "Accessibility Features Rollout", + "description": "VoiceOver descriptors, keyboard focus management, Dynamic Type validation, and XCTest coverage for UI components.", + "source_line": null + }, + { + "name": "NestedA11yIDs Integration", + "description": "Integration of NestedA11yIDs across ISOInspector App parse tree explorer and CLI/UI metadata consumption.", + "source_line": null + }, + { + "name": "CLI Base Command Scaffold", + "description": "Root isoinspector command with placeholder subcommands inspect, validate, export.", + "source_line": null + }, + { + "name": "Streaming CLI Commands", + "description": "Implementation of streaming inspect and validate commands with asynchronous environment wiring and logging.", + "source_line": null + }, + { + "name": "SwiftUI App Shell Build", + "description": "Navigation shell with AppShellView, persisted DocumentRecentsStore, and DocumentSessionController integration.", + "source_line": null + }, + { + "name": "Performance Benchmark Harnesses", + "description": "Benchmarks for CLI validation throughput and Combine\u2011based UI latency metrics.", + "source_line": null + }, + { + "name": "Parser Event Pipeline Integration", + "description": "Wiring of streaming parser bridge into application shell, automatic selection of first parsed node.", + "source_line": null + }, + { + "name": "Streaming Export Routing", + "description": "Routing of isoinspector export JSON/Binary flows through shared streaming capture utilities.", + "source_line": null + }, + { + "name": "Combine UI Benchmark macOS", + "description": "Benchmark plan for measuring Combine\u2011based UI performance on macOS.", + "source_line": null + }, + { + "name": "UI Automation for Streaming Default Selection", + "description": "XCTest UI automation harness that asserts outline/detail synchronization during live updates.", + "source_line": null + }, + { + "name": "CLI Global Logging & Telemetry Toggles", + "description": "Global logging and telemetry toggles for CLI, including dependency-injectable view wiring.", + "source_line": null + }, + { + "name": "SwiftUI Preview Integration of ResearchLogMonitor (duplicate)", + "description": "Same as earlier preview integration.", + "source_line": null + }, + { + "name": "Research Log Monitoring (duplicate)", + "description": "Same as earlier monitoring.", + "source_line": null + }, + { + "name": "Tolerant Parsing Configuration", + "description": "Configuration options for parsing with strict or tolerant mode, including status and issues tracking.", + "source_line": null + }, + { + "name": "ParseIssue Model & Tolerance Metrics", + "description": "Model for ParseIssue with severity, code, byte range, and node reference; metrics aggregation in CLI/SwiftUI.", + "source_line": null + }, + { + "name": "ParsePipeline Options", + "description": "Options struct for\u00a0Parse\u2011\u00a0\u2026", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 185606, + "line_count": 1805 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/BLOCKED/2025-10-27_VoiceOver_Regression_Pass_metrics.json b/DOCS/TASK_ARCHIVE/BLOCKED/2025-10-27_VoiceOver_Regression_Pass_metrics.json new file mode 100644 index 00000000..df663ed5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/BLOCKED/2025-10-27_VoiceOver_Regression_Pass_metrics.json @@ -0,0 +1,11 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/BLOCKED/2025-10-27_VoiceOver_Regression_Pass.md", + "n_spec": 0, + "n_func": 0, + "intent_atoms": [], + "functional_units": [], + "metadata": { + "file_size_bytes": 730, + "line_count": 7 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/BLOCKED/README_metrics.json b/DOCS/TASK_ARCHIVE/BLOCKED/README_metrics.json new file mode 100644 index 00000000..63c0735f --- /dev/null +++ b/DOCS/TASK_ARCHIVE/BLOCKED/README_metrics.json @@ -0,0 +1,32 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/BLOCKED/README.md", + "n_spec": 4, + "n_func": 0, + "intent_atoms": [ + { + "type": "user_story", + "description": "Store permanently blocked tasks in a dedicated directory to keep the day\u2011to\u2011day blocked list focused on recoverable issues.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each archived task file must contain: 1) a descriptive title and date of retirement; 2) the reason it is permanently blocked; 3) prerequisite conditions that would allow work to resume; 4) links to historical context in DOCS/TASK_ARCHIVE or related specs.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Archived tasks must be moved from DOCS/INPROGRESS/blocked.md into this folder when they are deemed permanently blocked.", + "source_line": null + }, + { + "type": "invariant", + "description": "The day\u2011to\u2011day blocked list (DOCS/INPROGRESS/blocked.md) should only contain recoverable issues.", + "source_line": null + } + ], + "functional_units": [], + "metadata": { + "file_size_bytes": 745, + "line_count": 10 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/C6_Integrate_ResearchLogMonitor_Previews_metrics.json b/DOCS/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/C6_Integrate_ResearchLogMonitor_Previews_metrics.json new file mode 100644 index 00000000..7ae4c9e5 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/C6_Integrate_ResearchLogMonitor_Previews_metrics.json @@ -0,0 +1,88 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/C6_Integrate_ResearchLogMonitor_Previews.md", + "n_spec": 8, + "n_func": 7, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate ResearchLogMonitor audit results into SwiftUI previews so UI contributors can see VR-006 auditing without running the full app.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "SwiftUI preview definitions instantiate ResearchLogAuditPreview snapshots for ready, missing fixture, and schema mismatch cases using ResearchLogPreviewProvider, ensuring previews render audit metadata without runtime errors.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Preview rendering surfaces diagnostics text for schema mismatch and missing fixture scenarios that mirrors ResearchLogMonitor expectations, keeping VR-006 schema drift visible in design tools.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Tests cover the preview provider fixtures and accessibility identifiers so the audit previews remain synchronized with VR-006 schema and NestedA11yIDs contracts.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Documentation references the preview audit capability so contributors know how to validate VR-006 fixtures locally.", + "source_line": null + }, + { + "type": "invariant", + "description": "Preview fixture bundles (VR006PreviewLog*.json) must live alongside the SwiftUI preview target and remain synchronized with ResearchLogSchema.fieldNames.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend or validate ResearchLogPreviewProvider and ResearchLogAuditPreview to emit consistent diagnostics strings and accessibility identifiers for automation tests and DocC snapshots.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Augment ResearchLogPreviewProviderTests and ResearchLogAccessibilityIdentifierTests to assert the ready/missing/schema mismatch flows remain stable when previews load audit snapshots.", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogAuditPreview SwiftUI component", + "description": "Renders audit diagnostics UI for research log fixtures in SwiftUI previews, displaying ready, missing, and schema mismatch states.", + "source_line": null + }, + { + "name": "ResearchLogPreviewProvider helper", + "description": "Provides deterministic fixture states (ready, missing, schema mismatch) and diagnostic metadata for preview rendering.", + "source_line": null + }, + { + "name": "SwiftUI preview definitions for VR-006 cases", + "description": "Instantiate ResearchLogAuditPreview snapshots for each fixture scenario using ResearchLogPreviewProvider in the SwiftUI preview target.", + "source_line": null + }, + { + "name": "Accessibility identifiers for audit previews", + "description": "Assigns accessibility IDs to UI elements in ResearchLogAuditPreview for automation and DocC snapshot testing.", + "source_line": null + }, + { + "name": "ResearchLogPreviewProviderTests unit tests", + "description": "Verify that preview provider emits correct ready/missing/schema mismatch flows and diagnostics strings when loading audit snapshots.", + "source_line": null + }, + { + "name": "ResearchLogAccessibilityIdentifierTests unit tests", + "description": "Assert accessibility identifiers remain stable across preview audit states.", + "source_line": null + }, + { + "name": "DocC/README documentation updates", + "description": "Document the new preview audit capability, including usage instructions for validating VR-006 fixtures locally.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 3068, + "line_count": 38 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/Summary_of_Work_metrics.json new file mode 100644 index 00000000..824b9c97 --- /dev/null +++ b/DOCS/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/Summary_of_Work_metrics.json @@ -0,0 +1,53 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/C6_Integrate_ResearchLogMonitor_Previews/Summary_of_Work.md", + "n_spec": 4, + "n_func": 4, + "intent_atoms": [ + { + "type": "user_story", + "description": "Integrate ResearchLogMonitor audit results into SwiftUI previews", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "ResearchLogPreviewProvider snapshots must execute ResearchLogMonitor.audit against VR-006 fixtures and wire diagnostics into ResearchLogAuditPreview preview states", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Missing fixture and schema mismatch states in the preview-only audit flows must expose NestedA11yIDs identifiers as asserted by ResearchLogAccessibilityIdentifierTests", + "source_line": null + }, + { + "type": "invariant", + "description": "ResearchLogMonitor.audit must always be executed when snapshots are taken for VR-006 fixtures", + "source_line": null + } + ], + "functional_units": [ + { + "name": "ResearchLogPreviewProvider snapshots execution", + "description": "Executes ResearchLogMonitor.audit against VR-006 fixtures and provides snapshot data for SwiftUI previews.", + "source_line": null + }, + { + "name": "ResearchLogAuditPreview preview states", + "description": "Wires diagnostics into preview states to display audit results in SwiftUI previews.", + "source_line": null + }, + { + "name": "NestedA11yIDs identifier exposure", + "description": "Exposes NestedA11yIDs identifiers when missing fixture or schema mismatch states occur during preview-only audit flows.", + "source_line": null + }, + { + "name": "DocC guidance update", + "description": "Updates documentation and PRD trackers to highlight the SwiftUI preview audit workflow.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 788, + "line_count": 12 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/D1_mvex_trex_Defaults/D1_mvex_trex_Defaults_metrics.json b/DOCS/TASK_ARCHIVE/D1_mvex_trex_Defaults/D1_mvex_trex_Defaults_metrics.json new file mode 100644 index 00000000..bfff40ed --- /dev/null +++ b/DOCS/TASK_ARCHIVE/D1_mvex_trex_Defaults/D1_mvex_trex_Defaults_metrics.json @@ -0,0 +1,68 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/D1_mvex_trex_Defaults/D1_mvex_trex_Defaults.md", + "n_spec": 6, + "n_func": 5, + "intent_atoms": [ + { + "type": "user_story", + "description": "Implement parsing support for the fragmented movie extension (mvex) and its track extends entries (trex) so the parser surfaces default sample parameters required by movie fragments.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "mvex boxes are registered as containers whose children are parsed and attached to the tree.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Each trex child exposes track ID, default sample description index, duration, size, and flags fields with correct numeric widths.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Streaming parser preserves byte ranges and flag semantics for export/validation consumers.", + "source_line": null + }, + { + "type": "acceptance_criteria", + "description": "Unit and snapshot tests cover fixtures with fragmented files to guard regressions.", + "source_line": null + }, + { + "type": "architectural_decision", + "description": "Extend BoxParserRegistry with dedicated handlers for mvex (container) and trex (full box with fixed payload layout).", + "source_line": null + } + ], + "functional_units": [ + { + "name": "mvex Container Parser", + "description": "Registers and parses mvex boxes as containers, attaching child trex entries to the parse tree.", + "source_line": null + }, + { + "name": "trex Full Box Parser", + "description": "Parses each trex entry exposing track ID, default sample description index, duration, size, and flags with correct numeric widths.", + "source_line": null + }, + { + "name": "FullBoxReader Utilization", + "description": "Uses existing FullBoxReader utilities for version/flags handling and big-endian integer decoding across 32-bit fields.", + "source_line": null + }, + { + "name": "Byte Range Preservation in Streaming Parser", + "description": "Ensures streaming parser preserves byte ranges and flag semantics for export/validation consumers.", + "source_line": null + }, + { + "name": "Fragmented MP4 Default Sample Parameters Exposure", + "description": "Provides parsed default sample parameters to downstream fragment interpretation and validation workflows.", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 2192, + "line_count": 28 + } +} \ No newline at end of file diff --git a/DOCS/TASK_ARCHIVE/D1_mvex_trex_Defaults/Summary_of_Work_metrics.json b/DOCS/TASK_ARCHIVE/D1_mvex_trex_Defaults/Summary_of_Work_metrics.json new file mode 100644 index 00000000..916d6aae --- /dev/null +++ b/DOCS/TASK_ARCHIVE/D1_mvex_trex_Defaults/Summary_of_Work_metrics.json @@ -0,0 +1,37 @@ +{ + "file_path": "SPECS/SIB/INTENT/TASK_ARCHIVE/D1_mvex_trex_Defaults/Summary_of_Work.md", + "n_spec": 0, + "n_func": 5, + "intent_atoms": [], + "functional_units": [ + { + "name": "mvex container parsing", + "description": "Parses the mvex container to expose default sample metadata and structured details for fragment processing", + "source_line": null + }, + { + "name": "trex track extends payload parsing", + "description": "Parses trex track-extends payloads within mvex to surface default values for tracks", + "source_line": null + }, + { + "name": "ParsedBoxPayload JSON export enhancement", + "description": "Extends ParsedBoxPayload/JSON export structures with a dedicated track-extends model for downstream consumers and UI views", + "source_line": null + }, + { + "name": "Unit tests for new parsers", + "description": "Provides focused unit coverage testing the mvex/trex parsing logic", + "source_line": null + }, + { + "name": "End-to-end export snapshot test", + "description": "Refreshes fragmented-stream-init snapshot fixture to exercise mvex/trex defaults in full exports", + "source_line": null + } + ], + "metadata": { + "file_size_bytes": 876, + "line_count": 14 + } +} \ No newline at end of file diff --git a/Derived/Sources/TuistBundle+ISOInspectorAppIOS.swift b/Derived/Sources/TuistBundle+ISOInspectorAppIOS.swift index 20867957..9071c131 100644 --- a/Derived/Sources/TuistBundle+ISOInspectorAppIOS.swift +++ b/Derived/Sources/TuistBundle+ISOInspectorAppIOS.swift @@ -22,4 +22,4 @@ public final class ISOInspectorAppIOSResources: NSObject { } } // swiftformat:enable all -// swiftlint:enable all +// swiftlint:enable all \ No newline at end of file diff --git a/Derived/Sources/TuistBundle+ISOInspectorAppIPadOS.swift b/Derived/Sources/TuistBundle+ISOInspectorAppIPadOS.swift index 5acc736b..dea70a4d 100644 --- a/Derived/Sources/TuistBundle+ISOInspectorAppIPadOS.swift +++ b/Derived/Sources/TuistBundle+ISOInspectorAppIPadOS.swift @@ -22,4 +22,4 @@ public final class ISOInspectorAppIPadOSResources: NSObject { } } // swiftformat:enable all -// swiftlint:enable all +// swiftlint:enable all \ No newline at end of file diff --git a/Derived/Sources/TuistBundle+ISOInspectorAppMacOS.swift b/Derived/Sources/TuistBundle+ISOInspectorAppMacOS.swift index ab75529b..61f5ec78 100644 --- a/Derived/Sources/TuistBundle+ISOInspectorAppMacOS.swift +++ b/Derived/Sources/TuistBundle+ISOInspectorAppMacOS.swift @@ -22,4 +22,4 @@ public final class ISOInspectorAppMacOSResources: NSObject { } } // swiftformat:enable all -// swiftlint:enable all +// swiftlint:enable all \ No newline at end of file diff --git a/Derived/Sources/TuistBundle+ISOInspectorKit.swift b/Derived/Sources/TuistBundle+ISOInspectorKit.swift index a8a7950c..a2c77d25 100644 --- a/Derived/Sources/TuistBundle+ISOInspectorKit.swift +++ b/Derived/Sources/TuistBundle+ISOInspectorKit.swift @@ -22,4 +22,4 @@ public final class ISOInspectorKitResources: NSObject { } } // swiftformat:enable all -// swiftlint:enable all +// swiftlint:enable all \ No newline at end of file diff --git a/Derived/Sources/TuistBundle+ISOInspectorKitTests.swift b/Derived/Sources/TuistBundle+ISOInspectorKitTests.swift index 9ce5c03c..23eac929 100644 --- a/Derived/Sources/TuistBundle+ISOInspectorKitTests.swift +++ b/Derived/Sources/TuistBundle+ISOInspectorKitTests.swift @@ -22,4 +22,4 @@ public final class ISOInspectorKitTestsResources: NSObject { } } // swiftformat:enable all -// swiftlint:enable all +// swiftlint:enable all \ No newline at end of file diff --git a/Documentation/Quality/foundationui-coverage-report-20260205-005538.txt b/Documentation/Quality/foundationui-coverage-report-20260205-005538.txt new file mode 100644 index 00000000..7361fa4a --- /dev/null +++ b/Documentation/Quality/foundationui-coverage-report-20260205-005538.txt @@ -0,0 +1,206 @@ + +================================================================================ +Layer 0: DesignTokens +================================================================================ + Animation.swift 14 LOC ( 129 total) + Colors.swift 36 LOC ( 144 total) + Radius.swift 12 LOC ( 95 total) + Spacing.swift 22 LOC ( 97 total) + Typography.swift 12 LOC ( 93 total) + + TOTAL 96 LOC ( 558 total) + + Constructs: + Functions: 1 + Structs: 0 + Classes: 0 + Enums: 6 + Extensions: 5 + Properties: 33 + + Test Files: + TokenValidationTests.swift 142 LOC ( 255 total) + + TEST TOTAL 142 LOC ( 255 total) + + Test/Code Ratio: 147.9% + Coverage Estimate: GOOD + +================================================================================ +Layer 1: Modifiers +================================================================================ + BadgeChipStyle.swift 111 LOC ( 246 total) + CardStyle.swift 174 LOC ( 319 total) + CopyableModifier.swift 134 LOC ( 312 total) + InteractiveStyle.swift 181 LOC ( 348 total) + SurfaceStyle.swift 179 LOC ( 351 total) + + TOTAL 779 LOC ( 1576 total) + + Constructs: + Functions: 15 + Structs: 6 + Classes: 0 + Enums: 4 + Extensions: 5 + Properties: 48 + + Test Files: + BadgeChipStyleTests.swift 87 LOC ( 197 total) + CardStyleTests.swift 127 LOC ( 274 total) + CopyableModifierTests.swift 147 LOC ( 275 total) + InteractiveStyleTests.swift 131 LOC ( 275 total) + SurfaceStyleTests.swift 125 LOC ( 266 total) + + TEST TOTAL 617 LOC ( 1287 total) + + Test/Code Ratio: 79.2% + Coverage Estimate: GOOD + +================================================================================ +Layer 2: Components +================================================================================ + Badge.swift 125 LOC ( 254 total) + Card.swift 270 LOC ( 439 total) + Copyable.swift 122 LOC ( 275 total) + Indicator.swift 241 LOC ( 359 total) + KeyValueRow.swift 179 LOC ( 332 total) + SectionHeader.swift 111 LOC ( 204 total) + + TOTAL 1048 LOC ( 1863 total) + + Constructs: + Functions: 10 + Structs: 11 + Classes: 0 + Enums: 4 + Extensions: 13 + Properties: 104 + + Test Files: + BadgeTests.swift 137 LOC ( 243 total) + CardTests.swift 163 LOC ( 309 total) + CopyableTests.swift 200 LOC ( 333 total) + IndicatorTests.swift 72 LOC ( 115 total) + KeyValueRowTests.swift 137 LOC ( 256 total) + SectionHeaderTests.swift 85 LOC ( 163 total) + + TEST TOTAL 794 LOC ( 1419 total) + + Test/Code Ratio: 75.8% + Coverage Estimate: GOOD + +================================================================================ +Layer 3: Patterns +================================================================================ + BoxTreePattern+Previews+Inspector.swift 171 LOC ( 204 total) + BoxTreePattern+Previews.swift 165 LOC ( 197 total) + BoxTreePattern.swift 162 LOC ( 313 total) + InspectorPattern.swift 272 LOC ( 372 total) + NavigationSplitScaffold.swift 211 LOC ( 396 total) + SidebarPattern+Previews+Dynamic.swift 192 LOC ( 220 total) + SidebarPattern+Previews.swift 227 LOC ( 255 total) + SidebarPattern.swift 127 LOC ( 220 total) + ToolbarPattern+Previews.swift 313 LOC ( 352 total) + ToolbarPattern.swift 335 LOC ( 436 total) + + TOTAL 2175 LOC ( 2965 total) + + Constructs: + Functions: 24 + Structs: 45 + Classes: 2 + Enums: 6 + Extensions: 10 + Properties: 236 + + Test Files: + BoxTreePatternTests.swift 215 LOC ( 369 total) + InspectorPatternTests.swift 191 LOC ( 337 total) + NavigationSplitScaffoldTests.swift 408 LOC ( 636 total) + SidebarPatternTests.swift 342 LOC ( 508 total) + ToolbarPatternTests.swift 292 LOC ( 482 total) + + TEST TOTAL 1448 LOC ( 2332 total) + + Test/Code Ratio: 66.6% + Coverage Estimate: GOOD + +================================================================================ +Layer 4: Contexts +================================================================================ + AccessibilityContext.swift 108 LOC ( 229 total) + ColorSchemeAdapter.swift 243 LOC ( 715 total) + PlatformAdaptation.swift 169 LOC ( 476 total) + PlatformExtensions.swift 181 LOC ( 473 total) + SurfaceStyleKey.swift 133 LOC ( 417 total) + + TOTAL 834 LOC ( 2310 total) + + Constructs: + Functions: 21 + Structs: 27 + Classes: 5 + Enums: 4 + Extensions: 11 + Properties: 112 + + Test Files: + AccessibilityContextTests.swift 154 LOC ( 244 total) + ColorSchemeAdapterTests.swift 191 LOC ( 519 total) + ContextIntegrationTests.swift 217 LOC ( 414 total) + PlatformAdaptationIntegrationTests.swift 503 LOC ( 1001 total) + PlatformAdaptationTests.swift 137 LOC ( 219 total) + PlatformExtensionsTests.swift 137 LOC ( 230 total) + SurfaceStyleKeyTests.swift 103 LOC ( 291 total) + + TEST TOTAL 1442 LOC ( 2918 total) + + Test/Code Ratio: 172.9% + Coverage Estimate: GOOD + +================================================================================ +Utilities: Utilities +================================================================================ + AccessibilityHelpers.swift 307 LOC ( 799 total) + CopyableText.swift 44 LOC ( 145 total) + DynamicTypeSize+Extensions.swift 8 LOC ( 62 total) + KeyboardShortcuts.swift 287 LOC ( 521 total) + + TOTAL 646 LOC ( 1527 total) + + Constructs: + Functions: 26 + Structs: 4 + Classes: 0 + Enums: 6 + Extensions: 6 + Properties: 81 + + Test Files: + AccessibilityHelpersTests.swift 187 LOC ( 304 total) + CopyableTextTests.swift 77 LOC ( 176 total) + DynamicTypeSizeExtensionsTests.swift 136 LOC ( 177 total) + KeyboardShortcutsTests.swift 119 LOC ( 178 total) + + TEST TOTAL 519 LOC ( 835 total) + + Test/Code Ratio: 80.3% + Coverage Estimate: GOOD + +================================================================================ +SUMMARY +================================================================================ + +Total Source LOC: 5,578 +Total Test LOC: 4,962 +Overall Test/Code Ratio: 89.0% + +Layer Source LOC Test LOC Ratio +------------------------------------------------------------ +Layer 0 96 142 147.9% +Layer 1 779 617 79.2% +Layer 2 1,048 794 75.8% +Layer 3 2,175 1,448 66.6% +Layer 4 834 1,442 172.9% +Utilities 646 519 80.3% diff --git a/Documentation/Quality/foundationui-coverage-test-20260205-005538.log b/Documentation/Quality/foundationui-coverage-test-20260205-005538.log new file mode 100644 index 00000000..eb4addc4 --- /dev/null +++ b/Documentation/Quality/foundationui-coverage-test-20260205-005538.log @@ -0,0 +1,3203 @@ +warning: 'foundationui': found 9 file(s) which are unhandled; explicitly declare them as resources or exclude from the target + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorCatalogDarkMode.macOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorCatalogLightMode.iPadOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorCatalogLightMode.iOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorCatalogDarkMode.iOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorSingleLightMode.iPadOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorSingleLightMode.macOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorCatalogDarkMode.iPadOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorSingleLightMode.iOS.png + /Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/SnapshotTests/__Snapshots__/IndicatorSnapshotTests/testIndicatorCatalogLightMode.macOS.png +[0/1] Planning build +Building for debugging... +[0/9] Write swift-version--58304C5D6DBC2206.txt +[1/9] Compiling reader.c +[2/9] Compiling parser.c +[3/9] Compiling writer.c +[4/9] Compiling api.c +[5/9] Compiling emitter.c +[6/9] Compiling scanner.c +[8/30] Compiling Yams Node.Sequence.swift +[9/30] Compiling Yams Node.swift +[10/30] Compiling Yams Emitter.swift +[11/30] Compiling Yams Encoder.swift +[12/30] Compiling Yams Constructor.swift +[13/30] Compiling Yams Decoder.swift +[14/30] Compiling Yams String+Yams.swift +[15/30] Compiling Yams Tag.swift +[16/30] Compiling Yams AliasDereferencingStrategy.swift +[17/30] Compiling Yams Anchor.swift +[18/30] Emitting module Yams +[19/30] Compiling Yams Node.Mapping.swift +[20/30] Compiling Yams Node.Scalar.swift +[21/30] Compiling Yams YamlAnchorProviding.swift +[22/30] Compiling Yams Representer.swift +[23/30] Compiling Yams Resolver.swift +[24/30] Compiling Yams Parser.swift +[25/30] Compiling Yams RedundancyAliasingStrategy.swift +[26/30] Compiling Yams Mark.swift +[27/30] Compiling Yams Node.Alias.swift +[28/30] Compiling Yams YamlError.swift +[29/31] Compiling Yams YamlTagProviding.swift +[30/71] Compiling FoundationUI Colors.swift +[31/71] Compiling FoundationUI Radius.swift +[32/71] Compiling FoundationUI Spacing.swift +[33/71] Compiling FoundationUI Typography.swift +[34/74] Compiling FoundationUI PlatformAdaptation.swift +[35/74] Compiling FoundationUI PlatformExtensions.swift +[36/74] Compiling FoundationUI SurfaceStyleKey.swift +[37/74] Compiling FoundationUI Animation.swift +[38/74] Compiling FoundationUI NavigationModel.swift +[39/74] Compiling FoundationUI BadgeChipStyle.swift +[40/74] Compiling FoundationUI CardStyle.swift +[41/74] Compiling FoundationUI CopyableModifier.swift +[42/74] Compiling FoundationUI BoxTreePattern+Previews.swift +[43/74] Compiling FoundationUI BoxTreePattern.swift +[44/74] Compiling FoundationUI InspectorPattern.swift +[45/74] Compiling FoundationUI InteractiveStyle.swift +[46/74] Compiling FoundationUI SurfaceStyle.swift +[47/74] Compiling FoundationUI BoxTreePattern+Previews+Inspector.swift +[48/74] Compiling FoundationUI PlatformComparisonPreviews+Interactions.swift +[49/74] Compiling FoundationUI PlatformComparisonPreviews.swift +[50/74] Compiling FoundationUI AccessibilityHelpers.swift +[51/74] Compiling FoundationUI KeyValueRow.swift +[52/74] Compiling FoundationUI SectionHeader.swift +[53/74] Compiling FoundationUI AccessibilityContext.swift +[54/74] Compiling FoundationUI ColorSchemeAdapter.swift +[55/74] Emitting module FoundationUI +[56/74] Compiling FoundationUI Badge.swift +[57/74] Compiling FoundationUI Card.swift +[58/74] Compiling FoundationUI Copyable.swift +[59/74] Compiling FoundationUI Indicator.swift +[60/74] Compiling FoundationUI AgentDescribable.swift +[61/74] Compiling FoundationUI YAMLParser.swift +[62/74] Compiling FoundationUI YAMLValidator.swift +[63/74] Compiling FoundationUI YAMLViewGenerator.swift +[64/74] Compiling FoundationUI SidebarPattern.swift +[65/74] Compiling FoundationUI ToolbarPattern+Previews.swift +[66/74] Compiling FoundationUI ToolbarPattern.swift +[67/74] Compiling FoundationUI NavigationSplitScaffold.swift +[68/74] Compiling FoundationUI SidebarPattern+Previews+Dynamic.swift +[69/74] Compiling FoundationUI SidebarPattern+Previews.swift +[70/74] Compiling FoundationUI CopyableText.swift +[71/74] Compiling FoundationUI DynamicTypeSize+Extensions.swift +[72/74] Compiling FoundationUI KeyboardShortcuts.swift +[73/137] Emitting module FoundationUITests +[74/142] Compiling FoundationUITests CardStyleTests.swift +[75/142] Compiling FoundationUITests CopyableModifierTests.swift +[76/142] Compiling FoundationUITests InteractiveStyleTests.swift +[77/142] Compiling FoundationUITests SurfaceStyleTests.swift +[78/142] Compiling FoundationUITests PatternIntegrationFixture.swift +[79/142] Compiling FoundationUITests YAMLViewGeneratorTests.swift +[80/142] Compiling FoundationUITests BadgeTests.swift +[81/142] Compiling FoundationUITests CardTests.swift +[82/142] Compiling FoundationUITests CopyableTests.swift +[83/142] Compiling FoundationUITests IndicatorTests.swift +[84/142] Compiling FoundationUITests KeyValueRowTests.swift +[85/142] Compiling FoundationUITests AccessibilityIntegrationTests.swift +[86/142] Compiling FoundationUITests AccessibilityTestHelpers.swift +[87/142] Compiling FoundationUITests BadgeAccessibilityTests.swift +[88/142] Compiling FoundationUITests CardAccessibilityTests.swift +[89/142] Compiling FoundationUITests ComponentAccessibilityIntegrationTests.swift +[90/142] Compiling FoundationUITests ContrastRatioTests.swift +[91/142] Compiling FoundationUITests PlatformExtensionsTests.swift +[92/142] Compiling FoundationUITests SurfaceStyleKeyTests.swift +[93/142] Compiling FoundationUITests TokenValidationTests.swift +[94/142] Compiling FoundationUITests ComponentIntegrationTests.swift +[95/142] Compiling FoundationUITests CopyableArchitectureIntegrationTests.swift +[96/142] Compiling FoundationUITests InspectorPatternIntegrationTests.swift +[97/142] Compiling FoundationUITests KeyValueRowPerformanceTests.swift +[98/142] Compiling FoundationUITests PatternsPerformanceTests.swift +[99/142] Compiling FoundationUITests PerformanceTestHelpers.swift +[100/142] Compiling FoundationUITests SectionHeaderPerformanceTests.swift +[101/142] Compiling FoundationUITests UtilitiesPerformanceTests.swift +[102/142] Compiling FoundationUITests NavigationScaffoldIntegrationTests.swift +[103/142] Compiling FoundationUITests AccessibilityHelpersIntegrationTests.swift +[104/142] Compiling FoundationUITests CopyableTextIntegrationTests.swift +[105/142] Compiling FoundationUITests CrossUtilityIntegrationTests.swift +[106/142] Compiling FoundationUITests KeyboardShortcutsIntegrationTests.swift +[107/142] Compiling FoundationUITests BadgeChipStyleTests.swift +[108/142] Compiling FoundationUITests DynamicTypeTests.swift +[109/142] Compiling FoundationUITests IndicatorAccessibilityTests.swift +[110/142] Compiling FoundationUITests KeyValueRowAccessibilityTests.swift +[111/142] Compiling FoundationUITests SectionHeaderAccessibilityTests.swift +[112/142] Compiling FoundationUITests TouchTargetTests.swift +[113/142] Compiling FoundationUITests VoiceOverTests.swift +[114/142] Compiling FoundationUITests AgentDescribableTests.swift +[115/142] Compiling FoundationUITests ComponentAgentDescribableTests.swift +[116/142] Compiling FoundationUITests PatternAgentDescribableTests.swift +[117/142] Compiling FoundationUITests YAMLIntegrationTests.swift +[118/142] Compiling FoundationUITests YAMLParserTests.swift +[119/142] Compiling FoundationUITests YAMLValidatorTests.swift +[120/142] Compiling FoundationUITests IndicatorSnapshotTests.swift +[121/142] Compiling FoundationUITests AccessibilityHelpersTests.swift +[122/142] Compiling FoundationUITests CopyableTextTests.swift +[123/142] Compiling FoundationUITests DynamicTypeSizeExtensionsTests.swift +[124/142] Compiling FoundationUITests KeyboardShortcutsTests.swift +[125/142] Compiling FoundationUITests PatternIntegrationTests.swift +[126/142] Compiling FoundationUITests BoxTreePatternTests.swift +[127/142] Compiling FoundationUITests InspectorPatternTests.swift +[128/142] Compiling FoundationUITests NavigationSplitScaffoldTests.swift +[129/142] Compiling FoundationUITests SidebarPatternTests.swift +[130/142] Compiling FoundationUITests ToolbarPatternTests.swift +[131/142] Compiling FoundationUITests BadgePerformanceTests.swift +[132/142] Compiling FoundationUITests CardPerformanceTests.swift +[133/142] Compiling FoundationUITests ComponentHierarchyPerformanceTests.swift +[134/142] Compiling FoundationUITests IndicatorPerformanceTests.swift +[135/142] Compiling FoundationUITests SectionHeaderTests.swift +[136/142] Compiling FoundationUITests AccessibilityContextTests.swift +[137/142] Compiling FoundationUITests ColorSchemeAdapterTests.swift +[138/142] Compiling FoundationUITests ContextIntegrationTests.swift +[139/142] Compiling FoundationUITests PlatformAdaptationIntegrationTests.swift +[140/142] Compiling FoundationUITests PlatformAdaptationTests.swift +[141/144] Compiling FoundationUIPackageTests runner.swift +[142/144] Emitting module FoundationUIPackageTests +[142/144] Write Objects.LinkFileList +[143/144] Linking FoundationUIPackageTests +Build complete! (15.18s) +Test Suite 'All tests' started at 2026-02-05 00:55:55.032. +Test Suite 'FoundationUIPackageTests.xctest' started at 2026-02-05 00:55:55.033. +Test Suite 'AccessibilityContextTests' started at 2026-02-05 00:55:55.033. +Test Case '-[FoundationUITests.AccessibilityContextTests testBoldText_UsesBoldWeight]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testBoldText_UsesBoldWeight]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testContextAnimation_RespectsReduceMotionSetting]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testContextAnimation_RespectsReduceMotionSetting]' passed (0.002 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testContextEquality_ComparesAllProperties]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testContextEquality_ComparesAllProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testContextWithHighContrastAndAccessibilitySize_UsesMaximumSpacing]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testContextWithHighContrastAndAccessibilitySize_UsesMaximumSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testContextWithIncreasedContrast_DerivesCorrectSpacing]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testContextWithIncreasedContrast_DerivesCorrectSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testDefaultContext_UsesSystemDefaults]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testDefaultContext_UsesSystemDefaults]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testEnvironmentValues_AccessibilityContextRoundTrip]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testEnvironmentValues_AccessibilityContextRoundTrip]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testEnvironmentValues_DerivesDefaultsFromEnvironment]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testEnvironmentValues_DerivesDefaultsFromEnvironment]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testHighContrastAccessibilitySpacing_UsesXLSpacing]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testHighContrastAccessibilitySpacing_UsesXLSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testIncreasedContrast_UsesLargeSpacing]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testIncreasedContrast_UsesLargeSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testReduceMotion_AllowsAnimations]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testReduceMotion_AllowsAnimations]' passed (0.001 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testReduceMotion_DisablesAnimations]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testReduceMotion_DisablesAnimations]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityContextTests testViewModifier_IsComposable]' started. +Test Case '-[FoundationUITests.AccessibilityContextTests testViewModifier_IsComposable]' passed (0.006 seconds). +Test Suite 'AccessibilityContextTests' passed at 2026-02-05 00:55:55.044. + Executed 13 tests, with 0 failures (0 unexpected) in 0.011 (0.011) seconds +Test Suite 'AccessibilityHelpersIntegrationTests' started at 2026-02-05 00:55:55.044. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityAuditOnInspectorPattern]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityAuditOnInspectorPattern]' passed (0.003 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityAuditOnToolbarPattern]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityAuditOnToolbarPattern]' passed (0.007 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityAuditPerformanceOnComplexViews]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/IntegrationTests/UtilityIntegrationTests/AccessibilityHelpersIntegrationTests.swift:306: Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityAuditPerformanceOnComplexViews]' measured [Time, seconds] average: 0.000, relative standard deviation: 119.086%, values: [0.000742, 0.000128, 0.000103, 0.000099, 0.000094, 0.000093, 0.000094, 0.000094, 0.000092, 0.000087], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityAuditPerformanceOnComplexViews]' passed (0.407 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityContextWithComponents]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilityContextWithComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilitySizeDetectionInComponents]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibilitySizeDetectionInComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleButtonModifierOnRealButton]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleButtonModifierOnRealButton]' passed (0.002 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleHeadingModifierOnSectionHeaders]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleHeadingModifierOnSectionHeaders]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleToggleModifierOnExpandableSection]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleToggleModifierOnExpandableSection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleValueModifierOnKeyValueRow]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAccessibleValueModifierOnKeyValueRow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAllBadgeLevelsMeetWCAG_AA]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testAllBadgeLevelsMeetWCAG_AA]' passed (0.011 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeErrorColor]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeErrorColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeInfoColor]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeInfoColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeSuccessColor]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeSuccessColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeWarningColor]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnBadgeWarningColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnCardBackgrounds]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testContrastValidationOnCardBackgrounds]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testDynamicTypeScalingWithRealTypography]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testDynamicTypeScalingWithRealTypography]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testFocusOrderValidationInSidebar]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testFocusOrderValidationInSidebar]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testHighContrastContextIntegration]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testHighContrastContextIntegration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testKeyboardNavigationInComplexHierarchy]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testKeyboardNavigationInComplexHierarchy]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testMacOSKeyboardNavigationAccessibility]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testMacOSKeyboardNavigationAccessibility]' passed (0.001 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testReducedMotionContextIntegration]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testReducedMotionContextIntegration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testTouchTargetValidationOnCardButtons]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testTouchTargetValidationOnCardButtons]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testVoiceOverHintsWithBadgeComponent]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testVoiceOverHintsWithBadgeComponent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testVoiceOverHintsWithKeyValueRowActions]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersIntegrationTests testVoiceOverHintsWithKeyValueRowActions]' passed (0.000 seconds). +Test Suite 'AccessibilityHelpersIntegrationTests' passed at 2026-02-05 00:55:55.477. + Executed 24 tests, with 0 failures (0 unexpected) in 0.432 (0.433) seconds +Test Suite 'AccessibilityHelpersTests' started at 2026-02-05 00:55:55.477. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityAuditFailures]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityAuditFailures]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityAuditForView]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityAuditForView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityContextIntegration]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityContextIntegration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityLabelValidation]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibilityLabelValidation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleButtonModifier]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleButtonModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleFocusModifier]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleFocusModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleHeadingModifier]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleHeadingModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleToggleModifier]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleToggleModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleValueModifier]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAccessibleValueModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAuditPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/UtilitiesTests/AccessibilityHelpersTests.swift:285: Test Case '-[FoundationUITests.AccessibilityHelpersTests testAuditPerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 49.516%, values: [0.000230, 0.000101, 0.000128, 0.000145, 0.000087, 0.000062, 0.000061, 0.000063, 0.000080, 0.000066], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.AccessibilityHelpersTests testAuditPerformance]' passed (0.260 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioCalculation]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioCalculation]' passed (0.001 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/UtilitiesTests/AccessibilityHelpersTests.swift:276: Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioPerformance]' measured [Time, seconds] average: 0.007, relative standard deviation: 38.227%, values: [0.012140, 0.011430, 0.008839, 0.007574, 0.006548, 0.005850, 0.005019, 0.004814, 0.004483, 0.004282], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioPerformance]' passed (0.324 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioWCAG_AA_Compliance]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioWCAG_AA_Compliance]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioWCAG_AAA_Compliance]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioWCAG_AAA_Compliance]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioWithDSColors]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testContrastRatioWithDSColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testDesignSystemTokenUsage]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testDesignSystemTokenUsage]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testDynamicTypeScaling]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testDynamicTypeScaling]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testFocusOrderValidation]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testFocusOrderValidation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testIsAccessibilitySize]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testIsAccessibilitySize]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testMacOSKeyboardNavigation]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testMacOSKeyboardNavigation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testTouchTargetSizeValidation]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testTouchTargetSizeValidation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testVoiceOverHintBuilder]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testVoiceOverHintBuilder]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testVoiceOverHintForButton]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testVoiceOverHintForButton]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityHelpersTests testVoiceOverHintForToggle]' started. +Test Case '-[FoundationUITests.AccessibilityHelpersTests testVoiceOverHintForToggle]' passed (0.000 seconds). +Test Suite 'AccessibilityHelpersTests' passed at 2026-02-05 00:55:56.065. + Executed 24 tests, with 0 failures (0 unexpected) in 0.587 (0.588) seconds +Test Suite 'AccessibilityIntegrationTests' started at 2026-02-05 00:55:56.065. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testAccessibilityContext_PropagatesThroughViewHierarchy]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testAccessibilityContext_PropagatesThroughViewHierarchy]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testAccessibilityHelpers_WorksAcrossAllComponents]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testAccessibilityHelpers_WorksAcrossAllComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testAccessibilityState_PropagatesThroughBindings]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testAccessibilityState_PropagatesThroughBindings]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testBoxTreeInSidebarWithInspectorDetails_SelectionFlow]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testBoxTreeInSidebarWithInspectorDetails_SelectionFlow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testCardWithBadgeAndKeyValueRows_FullyAccessible]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testCardWithBadgeAndKeyValueRows_FullyAccessible]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testComprehensiveAccessibilityIntegration]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testComprehensiveAccessibilityIntegration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testDesignTokensToComponents_ContrastMaintained]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testDesignTokensToComponents_ContrastMaintained]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testDynamicContentUpdates_AnnouncedToVoiceOver]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testDynamicContentUpdates_AnnouncedToVoiceOver]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testErrorMessages_Accessible]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testErrorMessages_Accessible]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testInspectorWithMultipleSections_NavigableWithVoiceOver]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testInspectorWithMultipleSections_NavigableWithVoiceOver]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testISOInspectorWorkflow_FullAccessibility]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testISOInspectorWorkflow_FullAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testKeyboardNavigation_ThroughCompleteInterface]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testKeyboardNavigation_ThroughCompleteInterface]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testKeyboardShortcuts_WorkWithVoiceOver]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testKeyboardShortcuts_WorkWithVoiceOver]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testMacOSIntegration_KeyboardShortcutsInMenus]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testMacOSIntegration_KeyboardShortcutsInMenus]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testMacOSIntegration_MenuBarAccessibility]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testMacOSIntegration_MenuBarAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testMultipleComponentsWithCopyableText_AllAccessible]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testMultipleComponentsWithCopyableText_AllAccessible]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testNestedPatterns_MaintainAccessibility]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testNestedPatterns_MaintainAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testSidebarWithToolbarAndInspector_ThreeColumnLayout]' started. +Test Case '-[FoundationUITests.AccessibilityIntegrationTests testSidebarWithToolbarAndInspector_ThreeColumnLayout]' passed (0.000 seconds). +Test Suite 'AccessibilityIntegrationTests' passed at 2026-02-05 00:55:56.067. + Executed 18 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds +Test Suite 'AgentDescribableTests' started at 2026-02-05 00:55:56.067. +Test Case '-[FoundationUITests.AgentDescribableTests testAgentDescribableWorksWithStructs]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testAgentDescribableWorksWithStructs]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testComplexPropertyValuesAreSupported]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testComplexPropertyValuesAreSupported]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testComponentTypeReturnsCorrectIdentifier]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testComponentTypeReturnsCorrectIdentifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testEmptyPropertiesDictionaryIsValid]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testEmptyPropertiesDictionaryIsValid]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testMultipleComponentsCanConformToProtocol]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testMultipleComponentsCanConformToProtocol]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testPropertiesCanBeSerializedToJSON]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testPropertiesCanBeSerializedToJSON]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testPropertiesDictionaryContainsExpectedValues]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testPropertiesDictionaryContainsExpectedValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testProtocolDefinesComponentType]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testProtocolDefinesComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testProtocolDefinesProperties]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testProtocolDefinesProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testProtocolDefinesSemantics]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testProtocolDefinesSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.AgentDescribableTests testSemanticsProvidesMeaningfulDescription]' started. +Test Case '-[FoundationUITests.AgentDescribableTests testSemanticsProvidesMeaningfulDescription]' passed (0.000 seconds). +Test Suite 'AgentDescribableTests' passed at 2026-02-05 00:55:56.068. + Executed 11 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'BadgeAccessibilityTests' started at 2026-02-05 00:55:56.068. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testAllBadgeLevelsHaveAccessibilityLabels]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testAllBadgeLevelsHaveAccessibilityLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testAllBadgeLevelsHaveColors]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testAllBadgeLevelsHaveColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testAllBadgeLevelsHaveIcons]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testAllBadgeLevelsHaveIcons]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeAccessibilityOnCurrentPlatform]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeAccessibilityOnCurrentPlatform]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeComponentPreservesAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeComponentPreservesAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeComponentWithIconPreservesAccessibility]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeComponentWithIconPreservesAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeErrorLevelHasAppropriateIcon]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeErrorLevelHasAppropriateIcon]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeErrorLevelHasColors]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeErrorLevelHasColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeErrorLevelHasCorrectAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeErrorLevelHasCorrectAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeInfoLevelHasAppropriateIcon]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeInfoLevelHasAppropriateIcon]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeInfoLevelHasColors]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeInfoLevelHasColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeInfoLevelHasCorrectAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeInfoLevelHasCorrectAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeMinimumTouchTargetSize]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeMinimumTouchTargetSize]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeSuccessLevelHasAppropriateIcon]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeSuccessLevelHasAppropriateIcon]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeSuccessLevelHasColors]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeSuccessLevelHasColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeSuccessLevelHasCorrectAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeSuccessLevelHasCorrectAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeUsesDesignSystemColors]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeUsesDesignSystemColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWarningLevelHasAppropriateIcon]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWarningLevelHasAppropriateIcon]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWarningLevelHasColors]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWarningLevelHasColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWarningLevelHasCorrectAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWarningLevelHasCorrectAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWithEmptyTextStillHasAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWithEmptyTextStillHasAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWithLongTextMaintainsAccessibility]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWithLongTextMaintainsAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWithNilTextFallsBackToLevelAccessibility]' started. +Test Case '-[FoundationUITests.BadgeAccessibilityTests testBadgeWithNilTextFallsBackToLevelAccessibility]' passed (0.000 seconds). +Test Suite 'BadgeAccessibilityTests' passed at 2026-02-05 00:55:56.070. + Executed 23 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds +Test Suite 'BadgeChipStyleTests' started at 2026-02-05 00:55:56.070. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeChipStyleUsesDesignSystemTokens]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeChipStyleUsesDesignSystemTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelEquality]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelErrorHasAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelErrorHasAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelErrorHasCorrectBackgroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelErrorHasCorrectBackgroundColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelErrorHasForegroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelErrorHasForegroundColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelInfoHasAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelInfoHasAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelInfoHasCorrectBackgroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelInfoHasCorrectBackgroundColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelInfoHasForegroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelInfoHasForegroundColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelSuccessHasAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelSuccessHasAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelSuccessHasCorrectBackgroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelSuccessHasCorrectBackgroundColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelSuccessHasForegroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelSuccessHasForegroundColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelWarningHasAccessibilityLabel]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelWarningHasAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelWarningHasCorrectBackgroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelWarningHasCorrectBackgroundColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelWarningHasForegroundColor]' started. +Test Case '-[FoundationUITests.BadgeChipStyleTests testBadgeLevelWarningHasForegroundColor]' passed (0.000 seconds). +Test Suite 'BadgeChipStyleTests' passed at 2026-02-05 00:55:56.071. + Executed 14 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'BadgePerformanceTests' started at 2026-02-05 00:55:56.071. +Test Case '-[FoundationUITests.BadgePerformanceTests testAllBadgeLevelsRenderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:53: Test Case '-[FoundationUITests.BadgePerformanceTests testAllBadgeLevelsRenderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.012%, values: [0.000094, 0.000088, 0.000088, 0.000086, 0.000089], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:53: Test Case '-[FoundationUITests.BadgePerformanceTests testAllBadgeLevelsRenderPerformance]' measured [CPU Instructions Retired, kI] average: 4013.540, relative standard deviation: 0.213%, values: [4030.240000, 4010.674000, 4009.257000, 4011.371000, 4006.157000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:53: Test Case '-[FoundationUITests.BadgePerformanceTests testAllBadgeLevelsRenderPerformance]' measured [CPU Cycles, kC] average: 798.623, relative standard deviation: 6.263%, values: [884.656000, 824.828000, 768.084000, 766.442000, 749.103000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:53: Test Case '-[FoundationUITests.BadgePerformanceTests testAllBadgeLevelsRenderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.903%, values: [0.000251, 0.000226, 0.000212, 0.000216, 0.000207], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testAllBadgeLevelsRenderPerformance]' passed (0.009 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInHStackPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:177: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInHStackPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 20.493%, values: [0.000007, 0.000008, 0.000006, 0.000011, 0.000007], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:177: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInHStackPerformance]' measured [CPU Instructions Retired, kI] average: 2146.030, relative standard deviation: 0.527%, values: [2132.022000, 2154.595000, 2153.446000, 2157.564000, 2132.524000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:177: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInHStackPerformance]' measured [CPU Cycles, kC] average: 493.235, relative standard deviation: 6.165%, values: [474.668000, 490.818000, 546.284000, 498.937000, 455.466000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:177: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInHStackPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.137%, values: [0.000119, 0.000123, 0.000137, 0.000125, 0.000114], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInHStackPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInScrollViewPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:194: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInScrollViewPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 7.291%, values: [0.000007, 0.000006, 0.000006, 0.000006, 0.000006], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:194: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInScrollViewPerformance]' measured [CPU Instructions Retired, kI] average: 2148.441, relative standard deviation: 0.493%, values: [2169.597000, 2144.136000, 2143.145000, 2142.851000, 2142.476000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:194: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInScrollViewPerformance]' measured [CPU Cycles, kC] average: 461.499, relative standard deviation: 3.090%, values: [482.360000, 471.797000, 459.847000, 451.060000, 442.430000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:194: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInScrollViewPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.069%, values: [0.000121, 0.000118, 0.000115, 0.000113, 0.000111], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInScrollViewPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInVStackPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:159: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInVStackPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.013%, values: [0.000008, 0.000010, 0.000008, 0.000007, 0.000007], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:159: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInVStackPerformance]' measured [CPU Instructions Retired, kI] average: 2128.264, relative standard deviation: 0.259%, values: [2130.943000, 2132.526000, 2131.805000, 2128.439000, 2117.608000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:159: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInVStackPerformance]' measured [CPU Cycles, kC] average: 462.083, relative standard deviation: 5.941%, values: [516.113000, 456.100000, 449.319000, 448.180000, 440.702000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:159: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInVStackPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.413%, values: [0.000131, 0.000121, 0.000120, 0.000115, 0.000111], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeInVStackPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithIconRenderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:39: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithIconRenderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.050%, values: [0.000043, 0.000042, 0.000044, 0.000041, 0.000041], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:39: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithIconRenderPerformance]' measured [CPU Instructions Retired, kI] average: 2969.961, relative standard deviation: 0.249%, values: [2964.461000, 2966.224000, 2980.434000, 2961.664000, 2977.020000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:39: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithIconRenderPerformance]' measured [CPU Cycles, kC] average: 573.933, relative standard deviation: 4.548%, values: [566.857000, 553.413000, 623.933000, 553.136000, 572.327000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:39: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithIconRenderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.913%, values: [0.000147, 0.000149, 0.000165, 0.000143, 0.000150], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithIconRenderPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithVaryingTextLengthPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:75: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithVaryingTextLengthPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.100%, values: [0.000041, 0.000037, 0.000042, 0.000041, 0.000040], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:75: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithVaryingTextLengthPerformance]' measured [CPU Instructions Retired, kI] average: 2982.944, relative standard deviation: 0.626%, values: [2968.006000, 2982.944000, 2968.591000, 2976.571000, 3018.609000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:75: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithVaryingTextLengthPerformance]' measured [CPU Cycles, kC] average: 578.078, relative standard deviation: 3.422%, values: [566.034000, 586.288000, 559.947000, 564.832000, 613.290000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:75: Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithVaryingTextLengthPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.554%, values: [0.000147, 0.000151, 0.000146, 0.000147, 0.000165], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testBadgeWithVaryingTextLengthPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testErrorBadgePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:235: Test Case '-[FoundationUITests.BadgePerformanceTests testErrorBadgePerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.786%, values: [0.000042, 0.000054, 0.000040, 0.000040, 0.000040], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:235: Test Case '-[FoundationUITests.BadgePerformanceTests testErrorBadgePerformance]' measured [CPU Instructions Retired, kI] average: 3021.749, relative standard deviation: 0.347%, values: [3010.659000, 3037.521000, 3011.734000, 3018.756000, 3030.073000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:235: Test Case '-[FoundationUITests.BadgePerformanceTests testErrorBadgePerformance]' measured [CPU Cycles, kC] average: 585.883, relative standard deviation: 2.658%, values: [589.218000, 611.912000, 571.511000, 568.263000, 588.513000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:235: Test Case '-[FoundationUITests.BadgePerformanceTests testErrorBadgePerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.328%, values: [0.000147, 0.000168, 0.000142, 0.000142, 0.000147], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testErrorBadgePerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testInfoBadgePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:215: Test Case '-[FoundationUITests.BadgePerformanceTests testInfoBadgePerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 2.577%, values: [0.000045, 0.000042, 0.000043, 0.000044, 0.000044], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:215: Test Case '-[FoundationUITests.BadgePerformanceTests testInfoBadgePerformance]' measured [CPU Instructions Retired, kI] average: 3017.713, relative standard deviation: 0.191%, values: [3010.768000, 3017.717000, 3027.317000, 3019.700000, 3013.063000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:215: Test Case '-[FoundationUITests.BadgePerformanceTests testInfoBadgePerformance]' measured [CPU Cycles, kC] average: 579.112, relative standard deviation: 2.260%, values: [580.957000, 603.489000, 572.656000, 572.502000, 565.955000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:215: Test Case '-[FoundationUITests.BadgePerformanceTests testInfoBadgePerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.636%, values: [0.000157, 0.000146, 0.000154, 0.000153, 0.000148], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testInfoBadgePerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_100Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:125: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_100Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 2.629%, values: [0.000145, 0.000146, 0.000151, 0.000155, 0.000145], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:125: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_100Instances]' measured [CPU Instructions Retired, kI] average: 5847.133, relative standard deviation: 0.161%, values: [5848.432000, 5843.290000, 5848.686000, 5862.217000, 5833.042000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:125: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_100Instances]' measured [CPU Cycles, kC] average: 1018.330, relative standard deviation: 1.216%, values: [1027.812000, 1027.714000, 1015.939000, 1025.051000, 995.136000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:125: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_100Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.768%, values: [0.000255, 0.000257, 0.000258, 0.000260, 0.000247], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_100Instances]' passed (0.004 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_10Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:91: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_10Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.035%, values: [0.000020, 0.000022, 0.000021, 0.000022, 0.000022], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:91: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_10Instances]' measured [CPU Instructions Retired, kI] average: 2454.413, relative standard deviation: 0.345%, values: [2453.119000, 2443.083000, 2447.819000, 2463.204000, 2464.839000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:91: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_10Instances]' measured [CPU Cycles, kC] average: 486.634, relative standard deviation: 1.743%, values: [500.759000, 479.176000, 476.835000, 489.519000, 486.881000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:91: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_10Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.714%, values: [0.000130, 0.000129, 0.000127, 0.000133, 0.000128], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_10Instances]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_50Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:108: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_50Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.835%, values: [0.000079, 0.000078, 0.000075, 0.000078, 0.000078], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:108: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_50Instances]' measured [CPU Instructions Retired, kI] average: 3954.269, relative standard deviation: 0.170%, values: [3948.465000, 3966.652000, 3956.155000, 3949.853000, 3950.218000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:108: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_50Instances]' measured [CPU Cycles, kC] average: 712.541, relative standard deviation: 1.259%, values: [718.207000, 723.267000, 716.648000, 706.043000, 698.542000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:108: Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_50Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.543%, values: [0.000185, 0.000185, 0.000179, 0.000181, 0.000179], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testMultipleBadges_50Instances]' passed (0.004 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testSingleBadgeRenderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:26: Test Case '-[FoundationUITests.BadgePerformanceTests testSingleBadgeRenderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 7.405%, values: [0.000041, 0.000038, 0.000034, 0.000040, 0.000043], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:26: Test Case '-[FoundationUITests.BadgePerformanceTests testSingleBadgeRenderPerformance]' measured [CPU Instructions Retired, kI] average: 2976.905, relative standard deviation: 0.348%, values: [2968.914000, 2997.254000, 2970.577000, 2973.178000, 2974.601000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:26: Test Case '-[FoundationUITests.BadgePerformanceTests testSingleBadgeRenderPerformance]' measured [CPU Cycles, kC] average: 587.016, relative standard deviation: 2.903%, values: [590.262000, 594.031000, 612.863000, 574.958000, 562.968000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:26: Test Case '-[FoundationUITests.BadgePerformanceTests testSingleBadgeRenderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.326%, values: [0.000154, 0.000152, 0.000152, 0.000149, 0.000144], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testSingleBadgeRenderPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testSuccessBadgePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:245: Test Case '-[FoundationUITests.BadgePerformanceTests testSuccessBadgePerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.138%, values: [0.000040, 0.000041, 0.000040, 0.000040, 0.000040], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:245: Test Case '-[FoundationUITests.BadgePerformanceTests testSuccessBadgePerformance]' measured [CPU Instructions Retired, kI] average: 3023.739, relative standard deviation: 0.396%, values: [3012.994000, 3015.654000, 3034.318000, 3041.832000, 3013.899000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:245: Test Case '-[FoundationUITests.BadgePerformanceTests testSuccessBadgePerformance]' measured [CPU Cycles, kC] average: 590.067, relative standard deviation: 2.091%, values: [583.416000, 591.319000, 604.788000, 600.495000, 570.317000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:245: Test Case '-[FoundationUITests.BadgePerformanceTests testSuccessBadgePerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.134%, values: [0.000145, 0.000147, 0.000151, 0.000150, 0.000142], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testSuccessBadgePerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.BadgePerformanceTests testWarningBadgePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:225: Test Case '-[FoundationUITests.BadgePerformanceTests testWarningBadgePerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 0.889%, values: [0.000044, 0.000043, 0.000043, 0.000044, 0.000043], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:225: Test Case '-[FoundationUITests.BadgePerformanceTests testWarningBadgePerformance]' measured [CPU Instructions Retired, kI] average: 3021.320, relative standard deviation: 0.246%, values: [3013.710000, 3029.800000, 3012.891000, 3029.913000, 3020.284000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:225: Test Case '-[FoundationUITests.BadgePerformanceTests testWarningBadgePerformance]' measured [CPU Cycles, kC] average: 573.625, relative standard deviation: 1.046%, values: [581.522000, 576.259000, 568.271000, 576.891000, 565.184000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/BadgePerformanceTests.swift:225: Test Case '-[FoundationUITests.BadgePerformanceTests testWarningBadgePerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.060%, values: [0.000151, 0.000149, 0.000148, 0.000155, 0.000146], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.BadgePerformanceTests testWarningBadgePerformance]' passed (0.003 seconds). +Test Suite 'BadgePerformanceTests' passed at 2026-02-05 00:55:56.126. + Executed 14 tests, with 0 failures (0 unexpected) in 0.054 (0.055) seconds +Test Suite 'BadgeTests' started at 2026-02-05 00:55:56.126. +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForError]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForError]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForInfo]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForInfo]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForSuccess]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForSuccess]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForWarning]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeAccessibilityLabelForWarning]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeIconOnlySemanticsFallbacksToLevel]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeIconOnlySemanticsFallbacksToLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithErrorLevel]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithErrorLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithInfoLevel]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithInfoLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithSuccessLevel]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithSuccessLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithWarningLevel]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeInitializationWithWarningLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeIsAView]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeIsAView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeLevelEquality]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeLevelEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeLevelUsesDesignSystemColors]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeLevelUsesDesignSystemColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeSupportsAllBadgeLevels]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeSupportsAllBadgeLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeTextContent]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeTextContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeWithEmptyText]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeWithEmptyText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeWithLongText]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeWithLongText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BadgeTests testBadgeWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.BadgeTests testBadgeWithSpecialCharacters]' passed (0.000 seconds). +Test Suite 'BadgeTests' passed at 2026-02-05 00:55:56.127. + Executed 17 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'BoxTreePatternTests' started at 2026-02-05 00:55:56.127. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternAnimatesExpandCollapse]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternAnimatesExpandCollapse]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternCalculatesCorrectIndentationForDeepNesting]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternCalculatesCorrectIndentationForDeepNesting]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternCollapsesNode]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternCollapsesNode]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternConformsToView]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternConformsToView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternExpandsNode]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternExpandsNode]' passed (0.001 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternHandlesLargeDataSet]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternHandlesLargeDataSet]' passed (0.004 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternInitializesWithEmptyTree]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternInitializesWithEmptyTree]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternInitializesWithSelectionBinding]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternInitializesWithSelectionBinding]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternInitializesWithSimpleTree]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternInitializesWithSimpleTree]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternPreservesExpandedStateAfterUpdate]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternPreservesExpandedStateAfterUpdate]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternProvidesExpandedCollapsedAnnouncements]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternProvidesExpandedCollapsedAnnouncements]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsAccessibilityLabels]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsAccessibilityLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsMultiSelection]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsMultiSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsNilSelection]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsNilSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsSelection]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternSupportsSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesDesignSystemAnimation]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesDesignSystemAnimation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesDesignSystemSpacingForIndentation]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesDesignSystemSpacingForIndentation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesLazyRenderingForPerformance]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesLazyRenderingForPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesOnlyDesignSystemTokens]' started. +Test Case '-[FoundationUITests.BoxTreePatternTests testBoxTreePatternUsesOnlyDesignSystemTokens]' passed (0.000 seconds). +Test Suite 'BoxTreePatternTests' passed at 2026-02-05 00:55:56.138. + Executed 19 tests, with 0 failures (0 unexpected) in 0.010 (0.011) seconds +Test Suite 'CardAccessibilityTests' started at 2026-02-05 00:55:56.138. +Test Case '-[FoundationUITests.CardAccessibilityTests testAllCardElevationLevels]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testAllCardElevationLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationEquality]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationHighHasProminentShadow]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationHighHasProminentShadow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationLowHasSubtleShadow]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationLowHasSubtleShadow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationMediumHasStandardShadow]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationMediumHasStandardShadow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationNoneHasNoShadow]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardElevationNoneHasNoShadow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardOnCurrentPlatform]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardOnCurrentPlatform]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardPreservesChildAccessibility]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardPreservesChildAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardShadowIsSupplementaryNotSemantic]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardShadowIsSupplementaryNotSemantic]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardUsesDesignSystemRadiusTokens]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardUsesDesignSystemRadiusTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithAllCustomizations]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithAllCustomizations]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithBadgeContent]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithBadgeContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithComplexContentPreservesStructure]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithComplexContentPreservesStructure]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithComplexHierarchy]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithComplexHierarchy]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithCustomCornerRadius]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithCustomCornerRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithDefaultCornerRadius]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithDefaultCornerRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithEmptyContent]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithEmptyContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithKeyValueRowContent]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithKeyValueRowContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithoutMaterial]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithoutMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithRegularMaterial]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithRegularMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithSectionHeaderContent]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithSectionHeaderContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithThickMaterial]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithThickMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithThinMaterial]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testCardWithThinMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testMultipleNestedCardsHaveDistinctElevations]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testMultipleNestedCardsHaveDistinctElevations]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardAccessibilityTests testNestedCardsPreserveAccessibility]' started. +Test Case '-[FoundationUITests.CardAccessibilityTests testNestedCardsPreserveAccessibility]' passed (0.000 seconds). +Test Suite 'CardAccessibilityTests' passed at 2026-02-05 00:55:56.143. + Executed 25 tests, with 0 failures (0 unexpected) in 0.004 (0.005) seconds +Test Suite 'CardPerformanceTests' started at 2026-02-05 00:55:56.143. +Test Case '-[FoundationUITests.CardPerformanceTests testAllElevationLevelsPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:60: Test Case '-[FoundationUITests.CardPerformanceTests testAllElevationLevelsPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.250%, values: [0.000111, 0.000109, 0.000109, 0.000109, 0.000113], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:60: Test Case '-[FoundationUITests.CardPerformanceTests testAllElevationLevelsPerformance]' measured [CPU Instructions Retired, kI] average: 4500.912, relative standard deviation: 0.054%, values: [4498.075000, 4501.634000, 4503.869000, 4502.936000, 4498.047000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:60: Test Case '-[FoundationUITests.CardPerformanceTests testAllElevationLevelsPerformance]' measured [CPU Cycles, kC] average: 855.572, relative standard deviation: 0.517%, values: [860.111000, 852.714000, 849.222000, 854.921000, 860.893000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:60: Test Case '-[FoundationUITests.CardPerformanceTests testAllElevationLevelsPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.556%, values: [0.000224, 0.000217, 0.000217, 0.000218, 0.000224], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testAllElevationLevelsPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testAllMaterialBackgroundsPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:80: Test Case '-[FoundationUITests.CardPerformanceTests testAllMaterialBackgroundsPerformance]' measured [Clock Monotonic Time, s] average: 0.001, relative standard deviation: 1.362%, values: [0.000701, 0.000690, 0.000685, 0.000678, 0.000675], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:80: Test Case '-[FoundationUITests.CardPerformanceTests testAllMaterialBackgroundsPerformance]' measured [CPU Instructions Retired, kI] average: 16100.734, relative standard deviation: 0.072%, values: [16102.968000, 16080.881000, 16108.597000, 16114.471000, 16096.752000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:80: Test Case '-[FoundationUITests.CardPerformanceTests testAllMaterialBackgroundsPerformance]' measured [CPU Cycles, kC] average: 3244.645, relative standard deviation: 0.953%, values: [3283.127000, 3281.509000, 3225.461000, 3216.363000, 3216.767000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:80: Test Case '-[FoundationUITests.CardPerformanceTests testAllMaterialBackgroundsPerformance]' measured [CPU Time, s] average: 0.001, relative standard deviation: 1.088%, values: [0.000811, 0.000805, 0.000797, 0.000791, 0.000787], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testAllMaterialBackgroundsPerformance]' passed (0.008 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testCardInScrollViewPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:294: Test Case '-[FoundationUITests.CardPerformanceTests testCardInScrollViewPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 8.782%, values: [0.000010, 0.000009, 0.000009, 0.000008, 0.000008], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:294: Test Case '-[FoundationUITests.CardPerformanceTests testCardInScrollViewPerformance]' measured [CPU Instructions Retired, kI] average: 2105.553, relative standard deviation: 0.506%, values: [2123.331000, 2095.912000, 2111.578000, 2095.216000, 2101.727000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:294: Test Case '-[FoundationUITests.CardPerformanceTests testCardInScrollViewPerformance]' measured [CPU Cycles, kC] average: 454.380, relative standard deviation: 3.165%, values: [448.498000, 482.647000, 450.495000, 442.459000, 447.801000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:294: Test Case '-[FoundationUITests.CardPerformanceTests testCardInScrollViewPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.879%, values: [0.000121, 0.000130, 0.000122, 0.000115, 0.000121], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testCardInScrollViewPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testCardInVStackPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:280: Test Case '-[FoundationUITests.CardPerformanceTests testCardInVStackPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.214%, values: [0.000005, 0.000005, 0.000005, 0.000005, 0.000005], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:280: Test Case '-[FoundationUITests.CardPerformanceTests testCardInVStackPerformance]' measured [CPU Instructions Retired, kI] average: 2118.412, relative standard deviation: 0.563%, values: [2126.265000, 2095.459000, 2126.931000, 2117.863000, 2125.544000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:280: Test Case '-[FoundationUITests.CardPerformanceTests testCardInVStackPerformance]' measured [CPU Cycles, kC] average: 443.798, relative standard deviation: 1.559%, values: [432.672000, 447.846000, 443.886000, 453.409000, 441.176000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:280: Test Case '-[FoundationUITests.CardPerformanceTests testCardInVStackPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.581%, values: [0.000108, 0.000112, 0.000111, 0.000114, 0.000111], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testCardInVStackPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithComplexVStackPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:215: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithComplexVStackPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 18.545%, values: [0.000027, 0.000019, 0.000018, 0.000024, 0.000017], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:215: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithComplexVStackPerformance]' measured [CPU Instructions Retired, kI] average: 2273.284, relative standard deviation: 0.893%, values: [2303.892000, 2281.288000, 2250.488000, 2279.793000, 2250.959000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:215: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithComplexVStackPerformance]' measured [CPU Cycles, kC] average: 514.303, relative standard deviation: 4.400%, values: [556.465000, 495.894000, 496.726000, 518.844000, 503.585000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:215: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithComplexVStackPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.409%, values: [0.000140, 0.000124, 0.000125, 0.000130, 0.000126], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithComplexVStackPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithListContentPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:238: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithListContentPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 10.066%, values: [0.000009, 0.000007, 0.000007, 0.000009, 0.000009], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:238: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithListContentPerformance]' measured [CPU Instructions Retired, kI] average: 2128.426, relative standard deviation: 0.952%, values: [2151.729000, 2123.973000, 2152.374000, 2107.445000, 2106.607000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:238: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithListContentPerformance]' measured [CPU Cycles, kC] average: 457.186, relative standard deviation: 3.433%, values: [478.996000, 462.791000, 463.045000, 448.817000, 432.283000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:238: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithListContentPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.879%, values: [0.000120, 0.000116, 0.000116, 0.000116, 0.000113], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithListContentPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithTextContentPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:41: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithTextContentPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.198%, values: [0.000188, 0.000186, 0.000206, 0.000192, 0.000183], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:41: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithTextContentPerformance]' measured [CPU Instructions Retired, kI] average: 5120.996, relative standard deviation: 0.310%, values: [5098.472000, 5107.866000, 5124.951000, 5131.342000, 5142.348000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:41: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithTextContentPerformance]' measured [CPU Cycles, kC] average: 1198.555, relative standard deviation: 3.793%, values: [1187.422000, 1173.506000, 1283.388000, 1198.749000, 1149.709000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:41: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithTextContentPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.070%, values: [0.000295, 0.000291, 0.000323, 0.000302, 0.000289], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithTextContentPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithVaryingCornerRadiusPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:101: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithVaryingCornerRadiusPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.532%, values: [0.000183, 0.000184, 0.000177, 0.000167, 0.000173], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:101: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithVaryingCornerRadiusPerformance]' measured [CPU Instructions Retired, kI] average: 5332.665, relative standard deviation: 0.201%, values: [5335.544000, 5312.979000, 5338.817000, 5344.385000, 5331.602000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:101: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithVaryingCornerRadiusPerformance]' measured [CPU Cycles, kC] average: 1143.425, relative standard deviation: 2.897%, values: [1207.064000, 1142.768000, 1124.277000, 1128.879000, 1114.138000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:101: Test Case '-[FoundationUITests.CardPerformanceTests testCardWithVaryingCornerRadiusPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.613%, values: [0.000305, 0.000287, 0.000283, 0.000278, 0.000277], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testCardWithVaryingCornerRadiusPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testDeeplyNestedCardsPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:189: Test Case '-[FoundationUITests.CardPerformanceTests testDeeplyNestedCardsPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 6.428%, values: [0.000029, 0.000026, 0.000025, 0.000025, 0.000028], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:189: Test Case '-[FoundationUITests.CardPerformanceTests testDeeplyNestedCardsPerformance]' measured [CPU Instructions Retired, kI] average: 2289.954, relative standard deviation: 0.685%, values: [2291.639000, 2274.938000, 2274.551000, 2291.073000, 2317.568000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:189: Test Case '-[FoundationUITests.CardPerformanceTests testDeeplyNestedCardsPerformance]' measured [CPU Cycles, kC] average: 504.519, relative standard deviation: 2.390%, values: [517.923000, 495.266000, 491.434000, 497.787000, 520.186000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:189: Test Case '-[FoundationUITests.CardPerformanceTests testDeeplyNestedCardsPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.394%, values: [0.000136, 0.000129, 0.000129, 0.000130, 0.000136], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testDeeplyNestedCardsPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testHighElevationCardPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:350: Test Case '-[FoundationUITests.CardPerformanceTests testHighElevationCardPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.572%, values: [0.000133, 0.000131, 0.000132, 0.000127, 0.000130], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:350: Test Case '-[FoundationUITests.CardPerformanceTests testHighElevationCardPerformance]' measured [CPU Instructions Retired, kI] average: 4376.025, relative standard deviation: 0.419%, values: [4356.125000, 4360.325000, 4368.397000, 4392.733000, 4402.543000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:350: Test Case '-[FoundationUITests.CardPerformanceTests testHighElevationCardPerformance]' measured [CPU Cycles, kC] average: 948.047, relative standard deviation: 1.219%, values: [949.362000, 944.583000, 937.347000, 969.587000, 939.356000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:350: Test Case '-[FoundationUITests.CardPerformanceTests testHighElevationCardPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.345%, values: [0.000245, 0.000245, 0.000238, 0.000240, 0.000238], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testHighElevationCardPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testLowElevationCardPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:330: Test Case '-[FoundationUITests.CardPerformanceTests testLowElevationCardPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.263%, values: [0.000128, 0.000124, 0.000128, 0.000127, 0.000126], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:330: Test Case '-[FoundationUITests.CardPerformanceTests testLowElevationCardPerformance]' measured [CPU Instructions Retired, kI] average: 4389.061, relative standard deviation: 0.225%, values: [4407.886000, 4378.524000, 4385.647000, 4386.659000, 4386.587000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:330: Test Case '-[FoundationUITests.CardPerformanceTests testLowElevationCardPerformance]' measured [CPU Cycles, kC] average: 934.049, relative standard deviation: 2.468%, values: [977.605000, 911.783000, 933.616000, 928.436000, 918.807000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:330: Test Case '-[FoundationUITests.CardPerformanceTests testLowElevationCardPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.393%, values: [0.000249, 0.000236, 0.000241, 0.000234, 0.000234], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testLowElevationCardPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testMediumElevationCardPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:340: Test Case '-[FoundationUITests.CardPerformanceTests testMediumElevationCardPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.626%, values: [0.000131, 0.000127, 0.000128, 0.000127, 0.000131], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:340: Test Case '-[FoundationUITests.CardPerformanceTests testMediumElevationCardPerformance]' measured [CPU Instructions Retired, kI] average: 4415.428, relative standard deviation: 0.113%, values: [4423.197000, 4411.792000, 4419.536000, 4411.034000, 4411.579000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:340: Test Case '-[FoundationUITests.CardPerformanceTests testMediumElevationCardPerformance]' measured [CPU Cycles, kC] average: 934.392, relative standard deviation: 1.305%, values: [947.645000, 911.289000, 936.825000, 937.771000, 938.432000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:340: Test Case '-[FoundationUITests.CardPerformanceTests testMediumElevationCardPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.391%, values: [0.000242, 0.000233, 0.000239, 0.000234, 0.000238], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testMediumElevationCardPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_100Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:150: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_100Instances]' measured [Clock Monotonic Time, s] average: 0.001, relative standard deviation: 1.614%, values: [0.000702, 0.000695, 0.000673, 0.000694, 0.000678], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:150: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_100Instances]' measured [CPU Instructions Retired, kI] average: 15195.013, relative standard deviation: 0.148%, values: [15218.112000, 15222.653000, 15172.754000, 15193.490000, 15168.055000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:150: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_100Instances]' measured [CPU Cycles, kC] average: 3264.932, relative standard deviation: 1.496%, values: [3335.297000, 3291.275000, 3210.728000, 3278.645000, 3208.716000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:150: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_100Instances]' measured [CPU Time, s] average: 0.001, relative standard deviation: 1.715%, values: [0.000817, 0.000804, 0.000781, 0.000799, 0.000783], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_100Instances]' passed (0.007 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_10Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:117: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_10Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 5.593%, values: [0.000075, 0.000065, 0.000068, 0.000065, 0.000071], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:117: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_10Instances]' measured [CPU Instructions Retired, kI] average: 3173.508, relative standard deviation: 0.371%, values: [3169.847000, 3185.852000, 3186.907000, 3155.317000, 3169.617000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:117: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_10Instances]' measured [CPU Cycles, kC] average: 696.298, relative standard deviation: 2.577%, values: [714.767000, 715.528000, 668.579000, 697.665000, 684.953000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:117: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_10Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.182%, values: [0.000184, 0.000180, 0.000173, 0.000177, 0.000181], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_10Instances]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_50Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:133: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_50Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 0.978%, values: [0.000346, 0.000344, 0.000349, 0.000350, 0.000342], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:133: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_50Instances]' measured [CPU Instructions Retired, kI] average: 8586.599, relative standard deviation: 0.039%, values: [8589.326000, 8586.306000, 8581.544000, 8591.054000, 8584.766000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:133: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_50Instances]' measured [CPU Cycles, kC] average: 1832.912, relative standard deviation: 1.572%, values: [1876.130000, 1813.442000, 1849.997000, 1832.239000, 1792.750000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:133: Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_50Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.455%, values: [0.000464, 0.000451, 0.000460, 0.000456, 0.000446], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testMultipleCards_50Instances]' passed (0.005 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testNestedCardsPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:169: Test Case '-[FoundationUITests.CardPerformanceTests testNestedCardsPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 14.450%, values: [0.000021, 0.000027, 0.000021, 0.000017, 0.000022], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:169: Test Case '-[FoundationUITests.CardPerformanceTests testNestedCardsPerformance]' measured [CPU Instructions Retired, kI] average: 2223.463, relative standard deviation: 1.101%, values: [2204.956000, 2215.259000, 2200.323000, 2268.517000, 2228.259000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:169: Test Case '-[FoundationUITests.CardPerformanceTests testNestedCardsPerformance]' measured [CPU Cycles, kC] average: 497.347, relative standard deviation: 5.339%, values: [540.878000, 494.925000, 465.074000, 509.426000, 476.431000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:169: Test Case '-[FoundationUITests.CardPerformanceTests testNestedCardsPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.841%, values: [0.000141, 0.000131, 0.000126, 0.000130, 0.000130], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testNestedCardsPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testNoneElevationCardPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:320: Test Case '-[FoundationUITests.CardPerformanceTests testNoneElevationCardPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.713%, values: [0.000128, 0.000131, 0.000129, 0.000126, 0.000125], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:320: Test Case '-[FoundationUITests.CardPerformanceTests testNoneElevationCardPerformance]' measured [CPU Instructions Retired, kI] average: 4375.718, relative standard deviation: 0.151%, values: [4371.380000, 4380.983000, 4364.760000, 4380.456000, 4381.010000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:320: Test Case '-[FoundationUITests.CardPerformanceTests testNoneElevationCardPerformance]' measured [CPU Cycles, kC] average: 920.807, relative standard deviation: 1.089%, values: [922.648000, 938.271000, 918.801000, 916.687000, 907.627000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:320: Test Case '-[FoundationUITests.CardPerformanceTests testNoneElevationCardPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.723%, values: [0.000233, 0.000241, 0.000234, 0.000232, 0.000230], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testNoneElevationCardPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CardPerformanceTests testSingleEmptyCardRenderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:29: Test Case '-[FoundationUITests.CardPerformanceTests testSingleEmptyCardRenderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.198%, values: [0.000064, 0.000065, 0.000063, 0.000066, 0.000065], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:29: Test Case '-[FoundationUITests.CardPerformanceTests testSingleEmptyCardRenderPerformance]' measured [CPU Instructions Retired, kI] average: 3292.049, relative standard deviation: 0.305%, values: [3283.011000, 3310.583000, 3293.693000, 3283.879000, 3289.079000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:29: Test Case '-[FoundationUITests.CardPerformanceTests testSingleEmptyCardRenderPerformance]' measured [CPU Cycles, kC] average: 664.185, relative standard deviation: 1.320%, values: [651.381000, 678.437000, 664.830000, 665.839000, 660.437000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/CardPerformanceTests.swift:29: Test Case '-[FoundationUITests.CardPerformanceTests testSingleEmptyCardRenderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.731%, values: [0.000167, 0.000175, 0.000171, 0.000174, 0.000170], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.CardPerformanceTests testSingleEmptyCardRenderPerformance]' passed (0.004 seconds). +Test Suite 'CardPerformanceTests' passed at 2026-02-05 00:55:56.219. + Executed 18 tests, with 0 failures (0 unexpected) in 0.076 (0.077) seconds +Test Suite 'CardStyleTests' started at 2026-02-05 00:55:56.219. +Test Case '-[FoundationUITests.CardStyleTests testCardElevationAllCasesExist]' started. +Test Case '-[FoundationUITests.CardStyleTests testCardElevationAllCasesExist]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testCardStyleUsesDesignSystemRadiusTokens]' started. +Test Case '-[FoundationUITests.CardStyleTests testCardStyleUsesDesignSystemRadiusTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelEquality]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighAccessibilityLabel]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighHasShadow]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighHasShadow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighShadowOpacity]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighShadowOpacity]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighShadowRadius]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighShadowRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighShadowYOffset]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelHighShadowYOffset]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowAccessibilityLabel]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowHasShadow]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowHasShadow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowShadowOpacity]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowShadowOpacity]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowShadowRadius]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowShadowRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowShadowYOffset]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelLowShadowYOffset]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumAccessibilityLabel]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumHasShadow]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumHasShadow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumShadowOpacity]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumShadowOpacity]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumShadowRadius]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumShadowRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumShadowYOffset]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelMediumShadowYOffset]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelNoneAccessibilityLabel]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelNoneAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelNoneHasNoShadow]' started. +Test Case '-[FoundationUITests.CardStyleTests testElevationLevelNoneHasNoShadow]' passed (0.000 seconds). +Test Suite 'CardStyleTests' passed at 2026-02-05 00:55:56.221. + Executed 20 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'CardTests' started at 2026-02-05 00:55:56.221. +Test Case '-[FoundationUITests.CardTests testCardAcceptsComplexContent]' started. +Test Case '-[FoundationUITests.CardTests testCardAcceptsComplexContent]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CardTests testCardAcceptsEmptyContent]' started. +Test Case '-[FoundationUITests.CardTests testCardAcceptsEmptyContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardAcceptsHStackContent]' started. +Test Case '-[FoundationUITests.CardTests testCardAcceptsHStackContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardAcceptsTextContent]' started. +Test Case '-[FoundationUITests.CardTests testCardAcceptsTextContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardAcceptsVStackContent]' started. +Test Case '-[FoundationUITests.CardTests testCardAcceptsVStackContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardCanBeNestedInOtherViews]' started. +Test Case '-[FoundationUITests.CardTests testCardCanBeNestedInOtherViews]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardCompilesOnAllPlatforms]' started. +Test Case '-[FoundationUITests.CardTests testCardCompilesOnAllPlatforms]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardDefaultCornerRadiusUsesCardToken]' started. +Test Case '-[FoundationUITests.CardTests testCardDefaultCornerRadiusUsesCardToken]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardDefaultElevationIsMedium]' started. +Test Case '-[FoundationUITests.CardTests testCardDefaultElevationIsMedium]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardInitializationWithAllParameters]' started. +Test Case '-[FoundationUITests.CardTests testCardInitializationWithAllParameters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardInitializationWithCustomCornerRadius]' started. +Test Case '-[FoundationUITests.CardTests testCardInitializationWithCustomCornerRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardInitializationWithCustomElevation]' started. +Test Case '-[FoundationUITests.CardTests testCardInitializationWithCustomElevation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardInitializationWithDefaultParameters]' started. +Test Case '-[FoundationUITests.CardTests testCardInitializationWithDefaultParameters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardInitializationWithMaterial]' started. +Test Case '-[FoundationUITests.CardTests testCardInitializationWithMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardIsAView]' started. +Test Case '-[FoundationUITests.CardTests testCardIsAView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardMaintainsAccessibilityForContent]' started. +Test Case '-[FoundationUITests.CardTests testCardMaintainsAccessibilityForContent]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CardTests testCardSupportsAllElevationLevels]' started. +Test Case '-[FoundationUITests.CardTests testCardSupportsAllElevationLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardSupportsAllMaterialTypes]' started. +Test Case '-[FoundationUITests.CardTests testCardSupportsAllMaterialTypes]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardSupportsNestedCards]' started. +Test Case '-[FoundationUITests.CardTests testCardSupportsNestedCards]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardUsesDesignSystemRadiusTokens]' started. +Test Case '-[FoundationUITests.CardTests testCardUsesDesignSystemRadiusTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardUsesOnlyDesignSystemTokens]' started. +Test Case '-[FoundationUITests.CardTests testCardUsesOnlyDesignSystemTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardWithVeryLargeCornerRadius]' started. +Test Case '-[FoundationUITests.CardTests testCardWithVeryLargeCornerRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CardTests testCardWithZeroCornerRadius]' started. +Test Case '-[FoundationUITests.CardTests testCardWithZeroCornerRadius]' passed (0.000 seconds). +Test Suite 'CardTests' passed at 2026-02-05 00:55:56.229. + Executed 23 tests, with 0 failures (0 unexpected) in 0.007 (0.008) seconds +Test Suite 'ColorSchemeAdapterTests' started at 2026-02-05 00:55:56.229. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveBackground_DarkMode_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveBackground_DarkMode_ReturnsColor]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveBackground_LightMode_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveBackground_LightMode_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveBorderColor_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveBorderColor_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveDividerColor_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveDividerColor_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveElevatedSurface_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveElevatedSurface_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveSecondaryBackground_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveSecondaryBackground_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveSecondaryTextColor_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveSecondaryTextColor_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveTextColor_DarkMode_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveTextColor_DarkMode_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveTextColor_LightMode_ReturnsColor]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AdaptiveTextColor_LightMode_ReturnsColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AllAdaptiveColors_ExistInBothModes]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_AllAdaptiveColors_ExistInBothModes]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_CrossPlatform_ProvidesConsistentAPI]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_CrossPlatform_ProvidesConsistentAPI]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_Immutability_ReturnsConsistentValues]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_Immutability_ReturnsConsistentValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_InitWithDarkMode_ReturnsCorrectScheme]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_InitWithDarkMode_ReturnsCorrectScheme]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_InitWithLightMode_ReturnsCorrectScheme]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_InitWithLightMode_ReturnsCorrectScheme]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_IsDarkMode_DarkScheme_ReturnsTrue]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_IsDarkMode_DarkScheme_ReturnsTrue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_IsDarkMode_LightScheme_ReturnsFalse]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_IsDarkMode_LightScheme_ReturnsFalse]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_IsDarkMode_ReflectsColorSchemeChanges]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_IsDarkMode_ReflectsColorSchemeChanges]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_macOS_UsesNSColorSystemColors]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_macOS_UsesNSColorSystemColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_Performance_LightweightInitialization]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/ColorSchemeAdapterTests.swift:509: Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_Performance_LightweightInitialization]' measured [Time, seconds] average: 0.000, relative standard deviation: 29.371%, values: [0.000530, 0.000318, 0.000352, 0.000317, 0.000310, 0.000305, 0.000306, 0.000302, 0.000332, 0.000632], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_Performance_LightweightInitialization]' passed (0.262 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_RapidSchemeChanges_MaintainsCorrectState]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_RapidSchemeChanges_MaintainsCorrectState]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_SystemColors_AdaptAutomatically]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testColorSchemeAdapter_SystemColors_AdaptAutomatically]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testView_AdaptiveColorSchemeModifier_Exists]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testView_AdaptiveColorSchemeModifier_Exists]' passed (0.003 seconds). +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testView_AdaptiveColorSchemeModifier_WorksWithComplexViews]' started. +Test Case '-[FoundationUITests.ColorSchemeAdapterTests testView_AdaptiveColorSchemeModifier_WorksWithComplexViews]' passed (0.003 seconds). +Test Suite 'ColorSchemeAdapterTests' passed at 2026-02-05 00:55:56.501. + Executed 23 tests, with 0 failures (0 unexpected) in 0.271 (0.272) seconds +Test Suite 'ComponentAccessibilityIntegrationTests' started at 2026-02-05 00:55:56.501. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testBadgeInsideCard]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testBadgeInsideCard]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testBadgeLevelsHaveColorDefinitions]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testBadgeLevelsHaveColorDefinitions]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testCardWithSectionHeaderAndKeyValueRows]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testCardWithSectionHeaderAndKeyValueRows]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testColorSchemeInNestedComponents]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testColorSchemeInNestedComponents]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testComplexComponentHierarchy]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testComplexComponentHierarchy]' passed (0.003 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testComponentsOnCurrentPlatform]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testComponentsOnCurrentPlatform]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testComponentsWithDynamicType]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testComponentsWithDynamicType]' passed (0.002 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testCopyableKeyValueRowInsideCard]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testCopyableKeyValueRowInsideCard]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testInspectorViewPattern]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testInspectorViewPattern]' passed (0.005 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testMetadataDisplayPattern]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testMetadataDisplayPattern]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testMultipleBadgesInsideCard]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testMultipleBadgesInsideCard]' passed (0.002 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testMultipleSectionsWithComponents]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testMultipleSectionsWithComponents]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testNestedCardsWithMultipleComponents]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testNestedCardsWithMultipleComponents]' passed (0.002 seconds). +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testSectionHeaderWithKeyValueRows]' started. +Test Case '-[FoundationUITests.ComponentAccessibilityIntegrationTests testSectionHeaderWithKeyValueRows]' passed (0.001 seconds). +Test Suite 'ComponentAccessibilityIntegrationTests' passed at 2026-02-05 00:55:56.522. + Executed 14 tests, with 0 failures (0 unexpected) in 0.020 (0.021) seconds +Test Suite 'ComponentAgentDescribableTests' started at 2026-02-05 00:55:56.522. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeAgentDescription]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeAllLevels]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeAllLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeComponentType]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeEmptyText]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeEmptyText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeJSONSerialization]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeProperties]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgePropertiesUsesStringValue]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgePropertiesUsesStringValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeSemantics]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testBadgeSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardAgentDescription]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardComponentType]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardDefaultValues]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardDefaultValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardElevationLevels]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardElevationLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardJSONSerialization]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardProperties]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardSemantics]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testCardSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowAgentDescription]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowComponentType]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowDefaultValues]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowDefaultValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowJSONSerialization]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowLayoutOptions]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowLayoutOptions]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowProperties]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowSemantics]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testKeyValueRowSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderAgentDescription]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderComponentType]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderDefaultDivider]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderDefaultDivider]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderJSONSerialization]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderLongTitle]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderLongTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderProperties]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderSemantics]' started. +Test Case '-[FoundationUITests.ComponentAgentDescribableTests testSectionHeaderSemantics]' passed (0.000 seconds). +Test Suite 'ComponentAgentDescribableTests' passed at 2026-02-05 00:55:56.527. + Executed 29 tests, with 0 failures (0 unexpected) in 0.004 (0.005) seconds +Test Suite 'ComponentHierarchyPerformanceTests' started at 2026-02-05 00:55:56.527. +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardListPerformance_10Cards]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:175: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardListPerformance_10Cards]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 26.858%, values: [0.000017, 0.000028, 0.000017, 0.000015, 0.000016], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:175: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardListPerformance_10Cards]' measured [CPU Instructions Retired, kI] average: 2102.948, relative standard deviation: 0.631%, values: [2118.512000, 2094.816000, 2119.665000, 2090.864000, 2090.884000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:175: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardListPerformance_10Cards]' measured [CPU Cycles, kC] average: 486.731, relative standard deviation: 8.218%, values: [509.662000, 550.478000, 482.257000, 448.048000, 443.210000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:175: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardListPerformance_10Cards]' measured [CPU Time, s] average: 0.000, relative standard deviation: 9.372%, values: [0.000280, 0.000270, 0.000237, 0.000225, 0.000225], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardListPerformance_10Cards]' passed (0.008 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionHeaderHierarchyPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:40: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionHeaderHierarchyPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 6.485%, values: [0.000192, 0.000166, 0.000164, 0.000162, 0.000167], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:40: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionHeaderHierarchyPerformance]' measured [CPU Instructions Retired, kI] average: 3777.001, relative standard deviation: 0.301%, values: [3799.721000, 3771.391000, 3771.418000, 3771.098000, 3771.376000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:40: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionHeaderHierarchyPerformance]' measured [CPU Cycles, kC] average: 821.121, relative standard deviation: 3.969%, values: [826.408000, 806.331000, 881.491000, 787.724000, 803.650000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:40: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionHeaderHierarchyPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.793%, values: [0.000401, 0.000370, 0.000378, 0.000341, 0.000349], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionHeaderHierarchyPerformance]' passed (0.007 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionKeyValueHierarchyPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:57: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionKeyValueHierarchyPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 1.312%, values: [0.000144, 0.000141, 0.000140, 0.000144, 0.000140], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:57: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionKeyValueHierarchyPerformance]' measured [CPU Instructions Retired, kI] average: 3819.793, relative standard deviation: 0.361%, values: [3838.015000, 3834.644000, 3806.543000, 3813.657000, 3806.107000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:57: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionKeyValueHierarchyPerformance]' measured [CPU Cycles, kC] average: 788.647, relative standard deviation: 0.953%, values: [801.848000, 789.435000, 780.073000, 782.843000, 789.034000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:57: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionKeyValueHierarchyPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 0.953%, values: [0.000309, 0.000305, 0.000301, 0.000306, 0.000309], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testCardSectionKeyValueHierarchyPerformance]' passed (0.006 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexCardListPerformance_50Cards]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:198: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexCardListPerformance_50Cards]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 13.445%, values: [0.000014, 0.000011, 0.000010, 0.000010, 0.000010], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:198: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexCardListPerformance_50Cards]' measured [CPU Instructions Retired, kI] average: 2119.757, relative standard deviation: 0.250%, values: [2119.711000, 2129.422000, 2114.927000, 2119.866000, 2114.858000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:198: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexCardListPerformance_50Cards]' measured [CPU Cycles, kC] average: 441.484, relative standard deviation: 1.966%, values: [451.303000, 449.859000, 443.434000, 430.102000, 432.724000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:198: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexCardListPerformance_50Cards]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.241%, values: [0.000182, 0.000166, 0.000159, 0.000154, 0.000155], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexCardListPerformance_50Cards]' passed (0.005 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexInspectorPanelPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:136: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexInspectorPanelPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 6.482%, values: [0.000012, 0.000011, 0.000011, 0.000010, 0.000010], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:136: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexInspectorPanelPerformance]' measured [CPU Instructions Retired, kI] average: 2140.656, relative standard deviation: 0.108%, values: [2139.785000, 2139.729000, 2140.190000, 2145.112000, 2138.465000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:136: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexInspectorPanelPerformance]' measured [CPU Cycles, kC] average: 441.490, relative standard deviation: 0.755%, values: [443.006000, 443.355000, 435.025000, 444.290000, 441.775000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:136: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexInspectorPanelPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.475%, values: [0.000147, 0.000149, 0.000145, 0.000144, 0.000143], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testComplexInspectorPanelPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testDeeplyNestedHierarchyPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:261: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testDeeplyNestedHierarchyPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 8.654%, values: [0.000021, 0.000025, 0.000021, 0.000021, 0.000020], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:261: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testDeeplyNestedHierarchyPerformance]' measured [CPU Instructions Retired, kI] average: 2246.230, relative standard deviation: 0.121%, values: [2241.663000, 2246.308000, 2246.602000, 2246.326000, 2250.252000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:261: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testDeeplyNestedHierarchyPerformance]' measured [CPU Cycles, kC] average: 481.100, relative standard deviation: 3.079%, values: [508.643000, 483.345000, 474.520000, 466.240000, 472.754000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:261: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testDeeplyNestedHierarchyPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.109%, values: [0.000165, 0.000161, 0.000157, 0.000155, 0.000157], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testDeeplyNestedHierarchyPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testISOBoxInspectorPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:346: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testISOBoxInspectorPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 6.582%, values: [0.000030, 0.000025, 0.000026, 0.000025, 0.000026], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:346: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testISOBoxInspectorPerformance]' measured [CPU Instructions Retired, kI] average: 2307.445, relative standard deviation: 0.228%, values: [2312.098000, 2300.964000, 2311.639000, 2301.040000, 2311.486000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:346: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testISOBoxInspectorPerformance]' measured [CPU Cycles, kC] average: 493.055, relative standard deviation: 2.138%, values: [509.483000, 500.295000, 490.734000, 481.953000, 482.812000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:346: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testISOBoxInspectorPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.146%, values: [0.000163, 0.000161, 0.000157, 0.000154, 0.000155], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testISOBoxInspectorPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testLargeScaleComponentCompositionPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:295: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testLargeScaleComponentCompositionPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 9.134%, values: [0.000010, 0.000008, 0.000008, 0.000008, 0.000008], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:295: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testLargeScaleComponentCompositionPerformance]' measured [CPU Instructions Retired, kI] average: 2109.279, relative standard deviation: 0.549%, values: [2091.353000, 2100.015000, 2120.033000, 2114.894000, 2120.099000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:295: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testLargeScaleComponentCompositionPerformance]' measured [CPU Cycles, kC] average: 446.713, relative standard deviation: 0.620%, values: [445.016000, 449.888000, 449.686000, 442.657000, 446.316000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:295: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testLargeScaleComponentCompositionPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.017%, values: [0.000134, 0.000137, 0.000130, 0.000133, 0.000130], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testLargeScaleComponentCompositionPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMediumInspectorPanelPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:98: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMediumInspectorPanelPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 11.156%, values: [0.000023, 0.000024, 0.000023, 0.000021, 0.000029], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:98: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMediumInspectorPanelPerformance]' measured [CPU Instructions Retired, kI] average: 2268.456, relative standard deviation: 0.590%, values: [2243.708000, 2268.975000, 2279.754000, 2268.980000, 2280.861000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:98: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMediumInspectorPanelPerformance]' measured [CPU Cycles, kC] average: 488.477, relative standard deviation: 3.335%, values: [486.648000, 474.112000, 492.279000, 472.028000, 517.319000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:98: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMediumInspectorPanelPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.787%, values: [0.000139, 0.000143, 0.000145, 0.000136, 0.000151], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMediumInspectorPanelPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMultiBoxInspectorPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:389: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMultiBoxInspectorPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 9.129%, values: [0.000010, 0.000009, 0.000009, 0.000008, 0.000008], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:389: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMultiBoxInspectorPerformance]' measured [CPU Instructions Retired, kI] average: 2091.214, relative standard deviation: 0.699%, values: [2086.073000, 2088.127000, 2081.187000, 2080.798000, 2119.884000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:389: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMultiBoxInspectorPerformance]' measured [CPU Cycles, kC] average: 437.742, relative standard deviation: 2.307%, values: [451.485000, 440.255000, 427.635000, 424.828000, 444.508000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:389: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMultiBoxInspectorPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.768%, values: [0.000128, 0.000119, 0.000116, 0.000115, 0.000121], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testMultiBoxInspectorPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testNestedCardsWithComplexContentPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:234: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testNestedCardsWithComplexContentPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 8.042%, values: [0.000020, 0.000019, 0.000016, 0.000019, 0.000016], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:234: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testNestedCardsWithComplexContentPerformance]' measured [CPU Instructions Retired, kI] average: 2221.458, relative standard deviation: 0.338%, values: [2214.595000, 2231.882000, 2212.299000, 2220.651000, 2227.864000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:234: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testNestedCardsWithComplexContentPerformance]' measured [CPU Cycles, kC] average: 474.987, relative standard deviation: 2.552%, values: [474.902000, 498.240000, 464.951000, 466.517000, 470.325000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:234: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testNestedCardsWithComplexContentPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.527%, values: [0.000128, 0.000134, 0.000121, 0.000124, 0.000122], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testNestedCardsWithComplexContentPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleCardTextHierarchyPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:28: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleCardTextHierarchyPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 2.942%, values: [0.000155, 0.000147, 0.000142, 0.000147, 0.000144], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:28: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleCardTextHierarchyPerformance]' measured [CPU Instructions Retired, kI] average: 4720.470, relative standard deviation: 0.126%, values: [4716.711000, 4716.491000, 4731.983000, 4716.840000, 4720.326000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:28: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleCardTextHierarchyPerformance]' measured [CPU Cycles, kC] average: 1003.768, relative standard deviation: 1.533%, values: [1034.367000, 996.347000, 995.599000, 998.771000, 993.755000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:28: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleCardTextHierarchyPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.769%, values: [0.000262, 0.000252, 0.000251, 0.000251, 0.000249], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleCardTextHierarchyPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleInspectorPanelPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:76: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleInspectorPanelPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.690%, values: [0.000025, 0.000021, 0.000019, 0.000021, 0.000017], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:76: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleInspectorPanelPerformance]' measured [CPU Instructions Retired, kI] average: 2238.137, relative standard deviation: 0.268%, values: [2232.702000, 2232.455000, 2234.962000, 2243.492000, 2247.075000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:76: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleInspectorPanelPerformance]' measured [CPU Cycles, kC] average: 481.000, relative standard deviation: 1.941%, values: [493.656000, 470.628000, 471.570000, 489.750000, 479.394000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/ComponentHierarchyPerformanceTests.swift:76: Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleInspectorPanelPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.232%, values: [0.000130, 0.000123, 0.000124, 0.000130, 0.000125], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.ComponentHierarchyPerformanceTests testSimpleInspectorPanelPerformance]' passed (0.003 seconds). +Test Suite 'ComponentHierarchyPerformanceTests' passed at 2026-02-05 00:55:56.586. + Executed 13 tests, with 0 failures (0 unexpected) in 0.058 (0.059) seconds +Test Suite 'ComponentIntegrationTests' started at 2026-02-05 00:55:56.586. +Test Case '-[FoundationUITests.ComponentIntegrationTests testAccessibilityContainmentInCard]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testAccessibilityContainmentInCard]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testAccessibilityLabelsPropagateInNestedComponents]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testAccessibilityLabelsPropagateInNestedComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testAllBadgeLevelsInSingleCard]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testAllBadgeLevelsInSingleCard]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testBadgesIntegratedWithKeyValueRows]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testBadgesIntegratedWithKeyValueRows]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainBadges]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainBadges]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainKeyValueRows]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainKeyValueRows]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainMultipleSectionHeaders]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainMultipleSectionHeaders]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainSectionHeader]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardCanContainSectionHeader]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardWithCustomCornerRadiusContainingComponents]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardWithCustomCornerRadiusContainingComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardWithOnlySectionHeader]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testCardWithOnlySectionHeader]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testColorSchemePropagatesToNestedComponents]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testColorSchemePropagatesToNestedComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testComplexComponentNesting]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testComplexComponentNesting]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testComponentCompositionOnAllPlatforms]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testComponentCompositionOnAllPlatforms]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testComponentsWithCardMaterialBackgrounds]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testComponentsWithCardMaterialBackgrounds]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testDeepComponentNesting]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testDeepComponentNesting]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testDynamicTypePropagatesToNestedComponents]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testDynamicTypePropagatesToNestedComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testEmptyCardContent]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testEmptyCardContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testHorizontalAndVerticalLayoutCombinations]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testHorizontalAndVerticalLayoutCombinations]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testLargeComponentHierarchyComposition]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testLargeComponentHierarchyComposition]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testMultipleCopyableRowsInCard]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testMultipleCopyableRowsInCard]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testMultipleMaterialBackgroundLevels]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testMultipleMaterialBackgroundLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testMultipleStatefulComponentsInCard]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testMultipleStatefulComponentsInCard]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testNestedCardsWithDifferentElevations]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testNestedCardsWithDifferentElevations]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testNestedComponentsUseDesignSystemTokens]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testNestedComponentsUseDesignSystemTokens]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testRealWorldInspectorLayout]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testRealWorldInspectorLayout]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ComponentIntegrationTests testStatefulComponentComposition]' started. +Test Case '-[FoundationUITests.ComponentIntegrationTests testStatefulComponentComposition]' passed (0.000 seconds). +Test Suite 'ComponentIntegrationTests' passed at 2026-02-05 00:55:56.596. + Executed 26 tests, with 0 failures (0 unexpected) in 0.009 (0.010) seconds +Test Suite 'ContextIntegrationTests' started at 2026-02-05 00:55:56.596. +Test Case '-[FoundationUITests.ContextIntegrationTests testColorSchemeAdapter_AdaptiveColors]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testColorSchemeAdapter_AdaptiveColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testColorSchemeAdapter_WithAllComponents]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testColorSchemeAdapter_WithAllComponents]' passed (0.002 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testColorSchemeAdapter_WithEnvironment]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testColorSchemeAdapter_WithEnvironment]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testContextIntegration_Performance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/ContextIntegrationTests.swift:359: Test Case '-[FoundationUITests.ContextIntegrationTests testContextIntegration_Performance]' measured [Time, seconds] average: 0.001, relative standard deviation: 15.360%, values: [0.000707, 0.000670, 0.001046, 0.001100, 0.001046, 0.001032, 0.001038, 0.001041, 0.001096, 0.000905], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.ContextIntegrationTests testContextIntegration_Performance]' passed (0.268 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testContexts_NoConflicts]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testContexts_NoConflicts]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testContexts_OrderIndependence]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testContexts_OrderIndependence]' passed (0.004 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testCrossContext_AllThreeContexts]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testCrossContext_AllThreeContexts]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testEdgeCase_ExtremeNesting]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testEdgeCase_ExtremeNesting]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testEdgeCase_NilSizeClass]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testEdgeCase_NilSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testInspectorScreen_AllContexts]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testInspectorScreen_AllContexts]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testMultipleEnvironmentKeys_Propagation]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testMultipleEnvironmentKeys_Propagation]' passed (0.002 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testPlatformAdapter_ModifierIntegration]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testPlatformAdapter_ModifierIntegration]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testPlatformAdapter_WithComponents]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testPlatformAdapter_WithComponents]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testPlatformSpacing_InComplexHierarchy]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testPlatformSpacing_InComplexHierarchy]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testSidebarLayout_PlatformAdaptive]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testSidebarLayout_PlatformAdaptive]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testSizeClass_CompactAdaptation]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testSizeClass_CompactAdaptation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testSizeClass_RegularAdaptation]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testSizeClass_RegularAdaptation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testSizeClass_ViewIntegration]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testSizeClass_ViewIntegration]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContextIntegrationTests testSurfaceStylePropagation_NestedComponents]' started. +Test Case '-[FoundationUITests.ContextIntegrationTests testSurfaceStylePropagation_NestedComponents]' passed (0.001 seconds). +Test Suite 'ContextIntegrationTests' passed at 2026-02-05 00:55:56.886. + Executed 19 tests, with 0 failures (0 unexpected) in 0.289 (0.290) seconds +Test Suite 'ContrastRatioTests' started at 2026-02-05 00:55:56.886. +Test Case '-[FoundationUITests.ContrastRatioTests testAccessibilityHelpers_ContrastRatioFunction]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testAccessibilityHelpers_ContrastRatioFunction]' passed (0.001 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testAccessibilityScore_Calculation]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testAccessibilityScore_Calculation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testBadgeChipStyle_UsesSemanticColors]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testBadgeChipStyle_UsesSemanticColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testBadgeColors_SemanticMeaning]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testBadgeColors_SemanticMeaning]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testCardStyle_UsesSystemColors]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testCardStyle_UsesSystemColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testContrastRatio_BlackOnWhite_Maximum]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testContrastRatio_BlackOnWhite_Maximum]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testContrastRatio_SameColor_Minimum]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testContrastRatio_SameColor_Minimum]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testContrastRatio_WhiteOnBlack_Maximum]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testContrastRatio_WhiteOnBlack_Maximum]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testDarkMode_SystemColorsAdaptAutomatically]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testDarkMode_SystemColorsAdaptAutomatically]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testDesignSystem_ZeroMagicNumbers]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testDesignSystem_ZeroMagicNumbers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testDesignTokens_ColorsAreDefined]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testDesignTokens_ColorsAreDefined]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testMacOSSystemColors_Available]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testMacOSSystemColors_Available]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testWCAG_AA_Helper_FailsWithLowContrast]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testWCAG_AA_Helper_FailsWithLowContrast]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testWCAG_AA_Helper_PassesWithHighContrast]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testWCAG_AA_Helper_PassesWithHighContrast]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ContrastRatioTests testWCAG_AAA_Helper]' started. +Test Case '-[FoundationUITests.ContrastRatioTests testWCAG_AAA_Helper]' passed (0.000 seconds). +Test Suite 'ContrastRatioTests' passed at 2026-02-05 00:55:56.889. + Executed 15 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds +Test Suite 'CopyableArchitectureIntegrationTests' started at 2026-02-05 00:55:56.889. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testAllCopyableVariantsUseDSTokens]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testAllCopyableVariantsUseDSTokens]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableAccessibilityLabels]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableAccessibilityLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableComposesWithAllModifiers]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableComposesWithAllModifiers]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableInComplexHierarchy]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableInComplexHierarchy]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableInInspectorPattern]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableInInspectorPattern]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierAsFoundation]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierAsFoundation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithBadge]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithBadge]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithCard]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithCard]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithKeyValueRow]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithKeyValueRow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithSectionHeader]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableModifierWithSectionHeader]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableTextBackwardCompatibility]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableTextBackwardCompatibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableTextUsesCopyableModifier]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableTextUsesCopyableModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWithDynamicType]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWithDynamicType]' passed (0.002 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWithEmptyStringsAcrossVariants]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWithEmptyStringsAcrossVariants]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWithSpecialCharactersAcrossVariants]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWithSpecialCharactersAcrossVariants]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperUsesCopyableModifier]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperUsesCopyableModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperWithBadge]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperWithBadge]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperWithCard]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperWithCard]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperWithKeyValueRow]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testCopyableWrapperWithKeyValueRow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testExistingCopyableTextUsageContinuesWorking]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testExistingCopyableTextUsageContinuesWorking]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testGradualMigrationFromCopyableText]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testGradualMigrationFromCopyableText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testHexValueDisplay]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testHexValueDisplay]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testISOInspectorMetadataView]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testISOInspectorMetadataView]' passed (0.002 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMacOSKeyboardShortcuts]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMacOSKeyboardShortcuts]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMixedCopyableTypesOnSameScreen]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMixedCopyableTypesOnSameScreen]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMixedFeedbackSettings]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMixedFeedbackSettings]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMultipleCopyableElementsOnSameScreen]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMultipleCopyableElementsOnSameScreen]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMultipleCopyableWrappersWithComplexContent]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testMultipleCopyableWrappersWithComplexContent]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testNestedCopyableInCard]' started. +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testNestedCopyableInCard]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testPerformanceWithComplexCopyableContent]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/IntegrationTests/CopyableArchitectureIntegrationTests.swift:348: Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testPerformanceWithComplexCopyableContent]' measured [Time, seconds] average: 0.000, relative standard deviation: 205.404%, values: [0.002569, 0.000162, 0.000122, 0.000126, 0.000103, 0.000089, 0.000084, 0.000082, 0.000087, 0.000165], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testPerformanceWithComplexCopyableContent]' passed (0.260 seconds). +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testPerformanceWithManyCopyableElements]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/IntegrationTests/CopyableArchitectureIntegrationTests.swift:338: Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testPerformanceWithManyCopyableElements]' measured [Time, seconds] average: 0.000, relative standard deviation: 163.710%, values: [0.001698, 0.000143, 0.000183, 0.000129, 0.000091, 0.000170, 0.000129, 0.000088, 0.000132, 0.000113], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CopyableArchitectureIntegrationTests testPerformanceWithManyCopyableElements]' passed (0.260 seconds). +Test Suite 'CopyableArchitectureIntegrationTests' passed at 2026-02-05 00:55:57.428. + Executed 31 tests, with 0 failures (0 unexpected) in 0.537 (0.539) seconds +Test Suite 'CopyableModifierTests' started at 2026-02-05 00:55:57.428. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierAccessibilityLabel]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierAccessibilityLabel]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierAppliesCorrectly]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierAppliesCorrectly]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierBodyReturnsView]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierBodyReturnsView]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierConformsToViewModifier]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierConformsToViewModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierHidesFeedback]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierHidesFeedback]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierInitialState]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierInitialState]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierInKeyValueRowContext]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierInKeyValueRowContext]' passed (0.002 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierMemoryEfficiency]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierMemoryEfficiency]' passed (0.076 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierOnComplexView]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierOnComplexView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ModifiersTests/CopyableModifierTests.swift:224: Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierPerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 29.661%, values: [0.000779, 0.000556, 0.000497, 0.000423, 0.000369, 0.000369, 0.000375, 0.000371, 0.000708, 0.000391], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierPerformance]' passed (0.260 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierShowsFeedback]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierShowsFeedback]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierUsesDesignSystemTokens]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierUsesDesignSystemTokens]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierVoiceOverAnnouncement]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierVoiceOverAnnouncement]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithBadgeComponent]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithBadgeComponent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithCardComponent]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithCardComponent]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithEmptyString]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithEmptyString]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithFeedbackParameter]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithFeedbackParameter]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithMultilineText]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithMultilineText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithOtherModifiers]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithOtherModifiers]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithoutFeedback]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithoutFeedback]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithVeryLongString]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testCopyableModifierWithVeryLongString]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testMacOSClipboardSupport]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testMacOSClipboardSupport]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testMacOSKeyboardShortcut]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testMacOSKeyboardShortcut]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableModifierTests testMultipleCopyableModifiersOnSameView]' started. +Test Case '-[FoundationUITests.CopyableModifierTests testMultipleCopyableModifiersOnSameView]' passed (0.001 seconds). +Test Suite 'CopyableModifierTests' passed at 2026-02-05 00:55:57.783. + Executed 25 tests, with 0 failures (0 unexpected) in 0.351 (0.354) seconds +Test Suite 'CopyableTests' started at 2026-02-05 00:55:57.783. +Test Case '-[FoundationUITests.CopyableTests testCopyableConformsToView]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableConformsToView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableInitializationWithComplexContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableInitializationWithComplexContent]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableInitializationWithSimpleContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableInitializationWithSimpleContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableMemoryEfficiency]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableMemoryEfficiency]' passed (0.081 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyablePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ComponentsTests/CopyableTests.swift:239: Test Case '-[FoundationUITests.CopyableTests testCopyablePerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 21.013%, values: [0.000437, 0.000334, 0.000326, 0.000349, 0.000298, 0.000239, 0.000237, 0.000236, 0.000237, 0.000285], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CopyableTests testCopyablePerformance]' passed (0.259 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableUsesDesignSystemTokens]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableUsesDesignSystemTokens]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableVsCopyableText]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableVsCopyableText]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithBadgeAndIcon]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithBadgeAndIcon]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithBadgeContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithBadgeContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithCardContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithCardContent]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithConditionalContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithConditionalContent]' passed (0.002 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithEmptyString]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithEmptyString]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithFeedbackParameter]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithFeedbackParameter]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithFileInfo]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithFileInfo]' passed (0.002 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithHexValue]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithHexValue]' passed (0.002 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithHStackContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithHStackContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithImageContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithImageContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithKeyValueRowContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithKeyValueRowContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithModifiers]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithModifiers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithMultilineText]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithMultilineText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithMultipleViews]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithMultipleViews]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithoutFeedback]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithoutFeedback]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithStyledContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithStyledContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithTextContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithTextContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithVeryLongString]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithVeryLongString]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithViewBuilderClosure]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithViewBuilderClosure]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTests testCopyableWithVStackContent]' started. +Test Case '-[FoundationUITests.CopyableTests testCopyableWithVStackContent]' passed (0.001 seconds). +Test Suite 'CopyableTests' passed at 2026-02-05 00:55:58.148. + Executed 28 tests, with 0 failures (0 unexpected) in 0.362 (0.365) seconds +Test Suite 'CopyableTextIntegrationTests' started at 2026-02-05 00:55:58.148. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextAnnouncesVoiceOverOnCopy]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextAnnouncesVoiceOverOnCopy]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextPerformanceInList]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/IntegrationTests/UtilityIntegrationTests/CopyableTextIntegrationTests.swift:185: Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextPerformanceInList]' measured [Time, seconds] average: 0.000, relative standard deviation: 169.916%, values: [0.000122, 0.000015, 0.000008, 0.000006, 0.000005, 0.000004, 0.000004, 0.000024, 0.000011, 0.000005], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextPerformanceInList]' passed (0.257 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextProvidesAccessibilityLabel]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextProvidesAccessibilityLabel]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextShowsVisualFeedbackOnCopy]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextShowsVisualFeedbackOnCopy]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextSupportsCommandCKeyboardShortcut]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextSupportsCommandCKeyboardShortcut]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextUsesDesignSystemColors]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextUsesDesignSystemColors]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextUsesDesignSystemSpacing]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextUsesDesignSystemSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextUsesNSPasteboardOnMacOS]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextUsesNSPasteboardOnMacOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithDSTypographyTokens]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithDSTypographyTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithEmptyString]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithEmptyString]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithinCard]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithinCard]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithinInspectorPattern]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithinInspectorPattern]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithinKeyValueRow]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithinKeyValueRow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithLongContent]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithLongContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testCopyableTextWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testMultipleCopyableTextInstancesOnSameScreen]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testMultipleCopyableTextInstancesOnSameScreen]' passed (0.002 seconds). +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testVisualFeedbackUsesDesignSystemTokens]' started. +Test Case '-[FoundationUITests.CopyableTextIntegrationTests testVisualFeedbackUsesDesignSystemTokens]' passed (0.000 seconds). +Test Suite 'CopyableTextIntegrationTests' passed at 2026-02-05 00:55:58.418. + Executed 17 tests, with 0 failures (0 unexpected) in 0.267 (0.270) seconds +Test Suite 'CopyableTextTests' started at 2026-02-05 00:55:58.418. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextAccessibilityHint]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextAccessibilityHint]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextAccessibilityLabel]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextConformsToView]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextConformsToView]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextFeedbackUsesQuickAnimation]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextFeedbackUsesQuickAnimation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextHasInitialState]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextHasInitialState]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextInitialization]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextInitialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextInitializationWithLabel]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextInitializationWithLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextIntegrationWithKeyValueRow]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextIntegrationWithKeyValueRow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/UtilitiesTests/CopyableTextTests.swift:173: Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextPerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 14.302%, values: [0.000366, 0.000254, 0.000249, 0.000244, 0.000240, 0.000242, 0.000241, 0.000244, 0.000242, 0.000242], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextPerformance]' passed (0.259 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextShowsFeedbackOnCopy]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextShowsFeedbackOnCopy]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextUsesDesignSystemTokens]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextUsesDesignSystemTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextWithEmptyString]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextWithEmptyString]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextWithVeryLongString]' started. +Test Case '-[FoundationUITests.CopyableTextTests testCopyableTextWithVeryLongString]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testMacOSClipboardIntegration]' started. +Test Case '-[FoundationUITests.CopyableTextTests testMacOSClipboardIntegration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CopyableTextTests testMacOSKeyboardShortcut]' started. +Test Case '-[FoundationUITests.CopyableTextTests testMacOSKeyboardShortcut]' passed (0.000 seconds). +Test Suite 'CopyableTextTests' passed at 2026-02-05 00:55:58.683. + Executed 16 tests, with 0 failures (0 unexpected) in 0.263 (0.265) seconds +Test Suite 'CrossUtilityIntegrationTests' started at 2026-02-05 00:55:58.683. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAccessibilityAuditPerformanceWithAllUtilities]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/IntegrationTests/UtilityIntegrationTests/CrossUtilityIntegrationTests.swift:190: Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAccessibilityAuditPerformanceWithAllUtilities]' measured [Time, seconds] average: 0.000, relative standard deviation: 42.221%, values: [0.000517, 0.000208, 0.000200, 0.000198, 0.000194, 0.000194, 0.000194, 0.000192, 0.000192, 0.000192], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAccessibilityAuditPerformanceWithAllUtilities]' passed (0.259 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAccessibilityHelpersWithKeyboardShortcuts]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAccessibilityHelpersWithKeyboardShortcuts]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAllThreeUtilitiesInInspectorPattern]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAllThreeUtilitiesInInspectorPattern]' passed (0.004 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAllThreeUtilitiesInToolbarPattern]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAllThreeUtilitiesInToolbarPattern]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAllUtilitiesUseDSTokens]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testAllUtilitiesUseDSTokens]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testCopyableTextWithAccessibilityHelpers]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testCopyableTextWithAccessibilityHelpers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testCopyableTextWithKeyboardShortcuts]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testCopyableTextWithKeyboardShortcuts]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testISOInspectorRealWorldScenario]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testISOInspectorRealWorldScenario]' passed (0.003 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testMacOSSpecificUtilityCombinations]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testMacOSSpecificUtilityCombinations]' passed (0.001 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testPerformanceWithMultipleUtilitiesActive]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/IntegrationTests/UtilityIntegrationTests/CrossUtilityIntegrationTests.swift:176: Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testPerformanceWithMultipleUtilitiesActive]' measured [Time, seconds] average: 0.000, relative standard deviation: 71.401%, values: [0.000473, 0.000117, 0.000100, 0.000094, 0.000091, 0.000090, 0.000089, 0.000140, 0.000185, 0.000176], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testPerformanceWithMultipleUtilitiesActive]' passed (0.255 seconds). +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testUtilitiesInComplexComponentHierarchy]' started. +Test Case '-[FoundationUITests.CrossUtilityIntegrationTests testUtilitiesInComplexComponentHierarchy]' passed (0.005 seconds). +Test Suite 'CrossUtilityIntegrationTests' passed at 2026-02-05 00:55:59.216. + Executed 11 tests, with 0 failures (0 unexpected) in 0.532 (0.534) seconds +Test Suite 'DynamicTypeSizeExtensionsTests' started at 2026-02-05 00:55:59.216. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityLargeMapsToAccessibility2]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityLargeMapsToAccessibility2]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityMediumMapsToAccessibility1]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityMediumMapsToAccessibility1]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilitySizeRange]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilitySizeRange]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityXLargeMapsToAccessibility3]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityXLargeMapsToAccessibility3]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityXxLargeMapsToAccessibility4]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityXxLargeMapsToAccessibility4]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityXxxLargeMapsToAccessibility5]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testAccessibilityXxxLargeMapsToAccessibility5]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testCompleteOrderingSequence]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testCompleteOrderingSequence]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testEqualityOperator]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testEqualityOperator]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testGreaterThanOperator]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testGreaterThanOperator]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testGreaterThanOrEqualOperator]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testGreaterThanOrEqualOperator]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testIntegrationWithIsAccessibilitySize]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testIntegrationWithIsAccessibilitySize]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testLessThanOperator]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testLessThanOperator]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testLessThanOrEqualOperator]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testLessThanOrEqualOperator]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testMinMaxSizes]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testMinMaxSizes]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testSortingAllSizes]' started. +Test Case '-[FoundationUITests.DynamicTypeSizeExtensionsTests testSortingAllSizes]' passed (0.000 seconds). +Test Suite 'DynamicTypeSizeExtensionsTests' passed at 2026-02-05 00:55:59.222. + Executed 15 tests, with 0 failures (0 unexpected) in 0.004 (0.005) seconds +Test Suite 'DynamicTypeTests' started at 2026-02-05 00:55:59.222. +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilityContext_DynamicTypeSizeProperty]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilityContext_DynamicTypeSizeProperty]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilityContext_IsAccessibilitySize]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilityContext_IsAccessibilitySize]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilitySizes_NoClipping]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilitySizes_NoClipping]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilitySizes_TouchTargetsMaintained]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilitySizes_TouchTargetsMaintained]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilitySizes_VerticalStackingPreferred]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testAccessibilitySizes_VerticalStackingPreferred]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testBadgeChipStyle_ScalesWithDynamicType]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testBadgeChipStyle_ScalesWithDynamicType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testBadgeComponent_AllSizesReadable]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testBadgeComponent_AllSizesReadable]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testBoxTreePattern_NodeTextScales]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testBoxTreePattern_NodeTextScales]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testCardComponent_LayoutAdaptsToDynamicType]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testCardComponent_LayoutAdaptsToDynamicType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testCardStyle_ContentScales]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testCardStyle_ContentScales]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testComprehensiveDynamicTypeAudit]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testComprehensiveDynamicTypeAudit]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testCopyableTextComponent_MaintainsReadability]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testCopyableTextComponent_MaintainsReadability]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testDesignTokens_TypographyScales]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testDesignTokens_TypographyScales]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testExtremelyLargeSize_NoOverflow]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testExtremelyLargeSize_NoOverflow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testExtremelySmallSize_StillReadable]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testExtremelySmallSize_StillReadable]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testInspectorPattern_HandlesLargeText]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testInspectorPattern_HandlesLargeText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testKeyValueRowComponent_ScalesGracefully]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testKeyValueRowComponent_ScalesGracefully]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testLayoutAdaptation_HorizontalToVertical]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testLayoutAdaptation_HorizontalToVertical]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testMacOSTextZoom_Supported]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testMacOSTextZoom_Supported]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testMonospacedText_ScalesWithDynamicType]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testMonospacedText_ScalesWithDynamicType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testScrolling_EnabledForLargeContent]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testScrolling_EnabledForLargeContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testSectionHeaderComponent_ScalesWithSystem]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testSectionHeaderComponent_ScalesWithSystem]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testSidebarPattern_ListItemsScale]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testSidebarPattern_ListItemsScale]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testSpacingTokens_RemainConsistentAcrossSizes]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testSpacingTokens_RemainConsistentAcrossSizes]' passed (0.000 seconds). +Test Case '-[FoundationUITests.DynamicTypeTests testToolbarPattern_IconsAndLabelsScale]' started. +Test Case '-[FoundationUITests.DynamicTypeTests testToolbarPattern_IconsAndLabelsScale]' passed (0.000 seconds). +Test Suite 'DynamicTypeTests' passed at 2026-02-05 00:55:59.228. + Executed 25 tests, with 0 failures (0 unexpected) in 0.005 (0.007) seconds +Test Suite 'IndicatorAccessibilityTests' started at 2026-02-05 00:55:59.228. +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testAccessibilityHintFallsBackToTooltipContent]' started. +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testAccessibilityHintFallsBackToTooltipContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testAccessibilityHintUsesBadgeTooltipWhenAvailable]' started. +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testAccessibilityHintUsesBadgeTooltipWhenAvailable]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testTouchTargetMeetsMinimumSizeRequirements]' started. +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testTouchTargetMeetsMinimumSizeRequirements]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testVoiceOverLabelsForEachLevel]' started. +Test Case '-[FoundationUITests.IndicatorAccessibilityTests testVoiceOverLabelsForEachLevel]' passed (0.000 seconds). +Test Suite 'IndicatorAccessibilityTests' passed at 2026-02-05 00:55:59.230. + Executed 4 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'IndicatorPerformanceTests' started at 2026-02-05 00:55:59.230. +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossLevels]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:23: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossLevels]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 10.597%, values: [0.000138, 0.000130, 0.000133, 0.000168, 0.000127], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:23: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossLevels]' measured [CPU Instructions Retired, kI] average: 3208.792, relative standard deviation: 0.353%, values: [3210.368000, 3210.432000, 3222.130000, 3213.215000, 3187.814000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:23: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossLevels]' measured [CPU Cycles, kC] average: 1007.483, relative standard deviation: 21.279%, values: [1237.898000, 1163.131000, 1118.967000, 848.947000, 668.473000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:23: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossLevels]' measured [CPU Time, s] average: 0.000, relative standard deviation: 9.392%, values: [0.000488, 0.000467, 0.000445, 0.000566, 0.000442], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossLevels]' passed (0.011 seconds). +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossSizes]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:37: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossSizes]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.898%, values: [0.000116, 0.000107, 0.000111, 0.000105, 0.000105], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:37: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossSizes]' measured [CPU Instructions Retired, kI] average: 3180.825, relative standard deviation: 0.368%, values: [3191.658000, 3162.934000, 3171.105000, 3191.785000, 3186.641000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:37: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossSizes]' measured [CPU Cycles, kC] average: 642.798, relative standard deviation: 6.513%, values: [724.975000, 619.320000, 627.172000, 609.292000, 633.232000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:37: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossSizes]' measured [CPU Time, s] average: 0.000, relative standard deviation: 7.022%, values: [0.000410, 0.000346, 0.000349, 0.000343, 0.000353], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorPerformanceAcrossSizes]' passed (0.008 seconds). +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorRenderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:12: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorRenderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 0.922%, values: [0.000091, 0.000092, 0.000091, 0.000091, 0.000090], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:12: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorRenderPerformance]' measured [CPU Instructions Retired, kI] average: 3186.678, relative standard deviation: 0.409%, values: [3168.828000, 3202.081000, 3174.037000, 3197.355000, 3191.090000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:12: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorRenderPerformance]' measured [CPU Cycles, kC] average: 606.384, relative standard deviation: 0.842%, values: [608.153000, 611.415000, 598.846000, 611.491000, 602.015000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:12: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorRenderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 0.695%, values: [0.000299, 0.000301, 0.000295, 0.000297, 0.000295], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorRenderPerformance]' passed (0.007 seconds). +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorWithTooltipPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:49: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorWithTooltipPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.516%, values: [0.000084, 0.000086, 0.000083, 0.000083, 0.000091], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:49: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorWithTooltipPerformance]' measured [CPU Instructions Retired, kI] average: 3215.095, relative standard deviation: 0.414%, values: [3227.262000, 3199.055000, 3228.256000, 3198.934000, 3221.966000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:49: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorWithTooltipPerformance]' measured [CPU Cycles, kC] average: 628.885, relative standard deviation: 3.301%, values: [631.784000, 666.301000, 624.765000, 604.671000, 616.902000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/IndicatorPerformanceTests.swift:49: Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorWithTooltipPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.809%, values: [0.000275, 0.000286, 0.000268, 0.000263, 0.000271], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.IndicatorPerformanceTests testIndicatorWithTooltipPerformance]' passed (0.006 seconds). +Test Suite 'IndicatorPerformanceTests' passed at 2026-02-05 00:55:59.261. + Executed 4 tests, with 0 failures (0 unexpected) in 0.031 (0.031) seconds +Test Suite 'IndicatorTests' started at 2026-02-05 00:55:59.261. +Test Case '-[FoundationUITests.IndicatorTests testAccessibilityConfigurationCombinesLevelAndReason]' started. +Test Case '-[FoundationUITests.IndicatorTests testAccessibilityConfigurationCombinesLevelAndReason]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testAccessibilityConfigurationOmitReasonWhenMissing]' started. +Test Case '-[FoundationUITests.IndicatorTests testAccessibilityConfigurationOmitReasonWhenMissing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testIndicatorInitializationStoresParameters]' started. +Test Case '-[FoundationUITests.IndicatorTests testIndicatorInitializationStoresParameters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSizeEnumeratesAllCases]' started. +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSizeEnumeratesAllCases]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSizeMappingsUseDesignTokens]' started. +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSizeMappingsUseDesignTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSizeStringValues]' started. +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSizeStringValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSupportsCopyableModifier]' started. +Test Case '-[FoundationUITests.IndicatorTests testIndicatorSupportsCopyableModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testTooltipConvertsTextToBadgeWhenPreferred]' started. +Test Case '-[FoundationUITests.IndicatorTests testTooltipConvertsTextToBadgeWhenPreferred]' passed (0.000 seconds). +Test Case '-[FoundationUITests.IndicatorTests testTooltipPrefersBadgeContentWhenRequested]' started. +Test Case '-[FoundationUITests.IndicatorTests testTooltipPrefersBadgeContentWhenRequested]' passed (0.000 seconds). +Test Suite 'IndicatorTests' passed at 2026-02-05 00:55:59.262. + Executed 9 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'InspectorPatternIntegrationTests' started at 2026-02-05 00:55:59.262. +Test Case '-[FoundationUITests.InspectorPatternIntegrationTests testInspectorPatternComposesWithSectionHeaderAndKeyValueRows]' started. +Test Case '-[FoundationUITests.InspectorPatternIntegrationTests testInspectorPatternComposesWithSectionHeaderAndKeyValueRows]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternIntegrationTests testInspectorPatternSupportsBadgeInsideContent]' started. +Test Case '-[FoundationUITests.InspectorPatternIntegrationTests testInspectorPatternSupportsBadgeInsideContent]' passed (0.000 seconds). +Test Suite 'InspectorPatternIntegrationTests' passed at 2026-02-05 00:55:59.263. + Executed 2 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'InspectorPatternTests' started at 2026-02-05 00:55:59.263. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternAccessibilityWithChildren]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternAccessibilityWithChildren]' passed (0.006 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternCanBeNestedInOtherViews]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternCanBeNestedInOtherViews]' passed (0.001 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternCapturesViewBuilderContent]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternCapturesViewBuilderContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternConformsToView]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternConformsToView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternHasAccessibilityLabel]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternHasAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternMaterialModifierProducesNewInstance]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternMaterialModifierProducesNewInstance]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternPlatformPaddingOnMacOS]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternPlatformPaddingOnMacOS]' passed (0.002 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternStoresTitle]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternStoresTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternUsesDesignSystemTokens]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternUsesDesignSystemTokens]' passed (0.001 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternUsesThinMaterialByDefault]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternUsesThinMaterialByDefault]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithBoxDetails]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithBoxDetails]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithComplexContent]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithComplexContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithDashboard]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithDashboard]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithEmptyContent]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithEmptyContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithEmptyTitle]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithEmptyTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithFileMetadata]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithFileMetadata]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithLongTitle]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithLongTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithMultipleTextViews]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithMultipleTextViews]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithRegularMaterial]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithRegularMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithSpecialCharactersInTitle]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithSpecialCharactersInTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithThickMaterial]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithThickMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithUltraThickMaterial]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithUltraThickMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithUltraThinMaterial]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testInspectorPatternWithUltraThinMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InspectorPatternTests testMaterialModifierCanBeChained]' started. +Test Case '-[FoundationUITests.InspectorPatternTests testMaterialModifierCanBeChained]' passed (0.000 seconds). +Test Suite 'InspectorPatternTests' passed at 2026-02-05 00:55:59.276. + Executed 24 tests, with 0 failures (0 unexpected) in 0.012 (0.013) seconds +Test Suite 'InteractiveStyleTests' started at 2026-02-05 00:55:59.276. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeAllCasesExist]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeAllCasesExist]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeEquality]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneAccessibilityHint]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneAccessibilityHint]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneDoesNotSupportKeyboardFocus]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneDoesNotSupportKeyboardFocus]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneHasNoEffect]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneHasNoEffect]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneScaleFactor]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeNoneScaleFactor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentAccessibilityHint]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentAccessibilityHint]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentHasEffect]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentHasEffect]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentOpacity]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentOpacity]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentScaleFactor]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeProminentScaleFactor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardAccessibilityHint]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardAccessibilityHint]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardHasEffect]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardHasEffect]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardOpacity]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardOpacity]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardScaleFactor]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeStandardScaleFactor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleAccessibilityHint]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleAccessibilityHint]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleHasEffect]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleHasEffect]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleOpacity]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleOpacity]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleScaleFactor]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSubtleScaleFactor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSupportsKeyboardFocus]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeSupportsKeyboardFocus]' passed (0.000 seconds). +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeUsesQuickAnimation]' started. +Test Case '-[FoundationUITests.InteractiveStyleTests testInteractionTypeUsesQuickAnimation]' passed (0.000 seconds). +Test Suite 'InteractiveStyleTests' passed at 2026-02-05 00:55:59.278. + Executed 20 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds +Test Suite 'KeyValueRowAccessibilityTests' started at 2026-02-05 00:55:59.278. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueLayoutEquality]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueLayoutEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowAccessibilityLabelFormat]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowAccessibilityLabelFormat]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowBasicAccessibilityLabel]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowBasicAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowCopyableAccessibility]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowCopyableAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowCopyableButtonTouchTarget]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowCopyableButtonTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowCopyableHasAccessibilityHint]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowCopyableHasAccessibilityHint]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowDefaultLayout]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowDefaultLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowFullConfiguration]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowFullConfiguration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowHorizontalLayout]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowHorizontalLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowInListContext]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowInListContext]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowKeyTextContrast]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowKeyTextContrast]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowNonCopyableAccessibility]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowNonCopyableAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowOnCurrentPlatform]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowOnCurrentPlatform]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowUsesDesignSystemSpacing]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowUsesDesignSystemSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowUsesDesignSystemTypography]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowUsesDesignSystemTypography]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowValueTextContrast]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowValueTextContrast]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowVerticalLayout]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowVerticalLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithEmptyValue]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithEmptyValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithLongValue]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithLongValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithUnicodeValue]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithUnicodeValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithVeryLongKey]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testKeyValueRowWithVeryLongKey]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testMultipleKeyValueRowsHaveDistinctContent]' started. +Test Case '-[FoundationUITests.KeyValueRowAccessibilityTests testMultipleKeyValueRowsHaveDistinctContent]' passed (0.000 seconds). +Test Suite 'KeyValueRowAccessibilityTests' passed at 2026-02-05 00:55:59.280. + Executed 23 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds +Test Suite 'KeyValueRowPerformanceTests' started at 2026-02-05 00:55:59.280. +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testCopyableKeyValueRowPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:79: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testCopyableKeyValueRowPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 2.751%, values: [0.000060, 0.000058, 0.000056, 0.000056, 0.000056], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:79: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testCopyableKeyValueRowPerformance]' measured [CPU Instructions Retired, kI] average: 3169.446, relative standard deviation: 0.084%, values: [3164.854000, 3169.665000, 3169.980000, 3169.594000, 3173.139000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:79: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testCopyableKeyValueRowPerformance]' measured [CPU Cycles, kC] average: 627.159, relative standard deviation: 2.866%, values: [660.559000, 631.589000, 614.072000, 615.860000, 613.713000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:79: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testCopyableKeyValueRowPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.295%, values: [0.000204, 0.000186, 0.000180, 0.000181, 0.000177], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testCopyableKeyValueRowPerformance]' passed (0.005 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutAtScale]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:287: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutAtScale]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.483%, values: [0.000027, 0.000027, 0.000025, 0.000026, 0.000025], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:287: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutAtScale]' measured [CPU Instructions Retired, kI] average: 2501.103, relative standard deviation: 0.702%, values: [2510.148000, 2492.876000, 2503.855000, 2473.084000, 2525.553000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:287: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutAtScale]' measured [CPU Cycles, kC] average: 547.316, relative standard deviation: 8.467%, values: [636.296000, 530.507000, 545.193000, 505.967000, 518.616000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:287: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutAtScale]' measured [CPU Time, s] average: 0.000, relative standard deviation: 14.828%, values: [0.000199, 0.000144, 0.000148, 0.000137, 0.000141], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutAtScale]' passed (0.004 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:55: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 5.263%, values: [0.000058, 0.000052, 0.000055, 0.000051, 0.000051], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:55: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutPerformance]' measured [CPU Instructions Retired, kI] average: 3164.741, relative standard deviation: 0.359%, values: [3172.915000, 3169.241000, 3142.170000, 3169.436000, 3169.942000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:55: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutPerformance]' measured [CPU Cycles, kC] average: 625.581, relative standard deviation: 2.206%, values: [651.704000, 625.260000, 622.545000, 613.428000, 614.966000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:55: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.200%, values: [0.000171, 0.000164, 0.000163, 0.000161, 0.000161], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testHorizontalLayoutPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInCardPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:345: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInCardPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.530%, values: [0.000008, 0.000009, 0.000011, 0.000009, 0.000009], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:345: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInCardPerformance]' measured [CPU Instructions Retired, kI] average: 2109.125, relative standard deviation: 0.495%, values: [2093.123000, 2125.612000, 2110.956000, 2105.549000, 2110.385000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:345: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInCardPerformance]' measured [CPU Cycles, kC] average: 445.114, relative standard deviation: 1.995%, values: [449.624000, 454.688000, 446.990000, 445.835000, 428.431000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:345: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInCardPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.858%, values: [0.000118, 0.000128, 0.000118, 0.000118, 0.000114], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInCardPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInListPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:199: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInListPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 32.498%, values: [0.000012, 0.000008, 0.000007, 0.000005, 0.000006], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:199: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInListPerformance]' measured [CPU Instructions Retired, kI] average: 2102.084, relative standard deviation: 0.773%, values: [2072.860000, 2114.769000, 2107.177000, 2118.163000, 2097.449000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:199: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInListPerformance]' measured [CPU Cycles, kC] average: 458.827, relative standard deviation: 3.540%, values: [487.596000, 464.458000, 452.306000, 448.686000, 441.089000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:199: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInListPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 7.208%, values: [0.000131, 0.000128, 0.000113, 0.000112, 0.000111], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInListPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInScrollViewPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:179: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInScrollViewPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 9.854%, values: [0.000008, 0.000007, 0.000007, 0.000006, 0.000006], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:179: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInScrollViewPerformance]' measured [CPU Instructions Retired, kI] average: 2103.354, relative standard deviation: 0.641%, values: [2092.010000, 2119.871000, 2092.655000, 2119.879000, 2092.357000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:179: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInScrollViewPerformance]' measured [CPU Cycles, kC] average: 443.512, relative standard deviation: 1.731%, values: [450.032000, 452.501000, 437.842000, 445.337000, 431.848000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:179: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInScrollViewPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.736%, values: [0.000113, 0.000113, 0.000110, 0.000112, 0.000108], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInScrollViewPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInVStackPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:163: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInVStackPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.159%, values: [0.000005, 0.000005, 0.000005, 0.000005, 0.000005], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:163: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInVStackPerformance]' measured [CPU Instructions Retired, kI] average: 2093.486, relative standard deviation: 1.122%, values: [2125.113000, 2071.538000, 2110.531000, 2062.359000, 2097.887000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:163: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInVStackPerformance]' measured [CPU Cycles, kC] average: 440.115, relative standard deviation: 5.226%, values: [481.954000, 446.191000, 425.860000, 416.637000, 429.933000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:163: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInVStackPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.267%, values: [0.000121, 0.000112, 0.000107, 0.000104, 0.000108], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowInVStackPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithCopyablePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:329: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithCopyablePerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.172%, values: [0.000028, 0.000026, 0.000027, 0.000026, 0.000028], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:329: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithCopyablePerformance]' measured [CPU Instructions Retired, kI] average: 2489.894, relative standard deviation: 0.716%, values: [2491.792000, 2515.976000, 2467.931000, 2472.684000, 2501.087000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:329: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithCopyablePerformance]' measured [CPU Cycles, kC] average: 508.221, relative standard deviation: 0.794%, values: [510.457000, 510.004000, 500.686000, 507.715000, 512.241000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:329: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithCopyablePerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.625%, values: [0.000134, 0.000129, 0.000131, 0.000129, 0.000138], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithCopyablePerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithHexValuesPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:256: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithHexValuesPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.724%, values: [0.000113, 0.000122, 0.000125, 0.000124, 0.000112], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:256: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithHexValuesPerformance]' measured [CPU Instructions Retired, kI] average: 4739.908, relative standard deviation: 0.220%, values: [4752.964000, 4724.051000, 4732.230000, 4742.901000, 4747.396000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:256: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithHexValuesPerformance]' measured [CPU Cycles, kC] average: 910.645, relative standard deviation: 0.725%, values: [917.087000, 914.230000, 916.477000, 904.108000, 901.321000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:256: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithHexValuesPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.936%, values: [0.000221, 0.000226, 0.000232, 0.000232, 0.000215], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithHexValuesPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithLongValuesPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:43: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithLongValuesPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.474%, values: [0.000049, 0.000050, 0.000047, 0.000052, 0.000047], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:43: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithLongValuesPerformance]' measured [CPU Instructions Retired, kI] average: 3131.607, relative standard deviation: 0.192%, values: [3138.539000, 3133.412000, 3133.318000, 3132.386000, 3120.380000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:43: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithLongValuesPerformance]' measured [CPU Cycles, kC] average: 612.376, relative standard deviation: 2.725%, values: [644.819000, 610.530000, 598.938000, 605.826000, 601.765000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:43: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithLongValuesPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.949%, values: [0.000169, 0.000162, 0.000150, 0.000159, 0.000148], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithLongValuesPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithMetadataPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:240: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithMetadataPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 9.519%, values: [0.000009, 0.000010, 0.000008, 0.000011, 0.000010], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:240: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithMetadataPerformance]' measured [CPU Instructions Retired, kI] average: 2138.372, relative standard deviation: 0.652%, values: [2151.183000, 2123.663000, 2158.855000, 2129.021000, 2129.140000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:240: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithMetadataPerformance]' measured [CPU Cycles, kC] average: 443.301, relative standard deviation: 2.382%, values: [462.306000, 437.972000, 444.398000, 430.556000, 441.273000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:240: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithMetadataPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.086%, values: [0.000116, 0.000110, 0.000111, 0.000111, 0.000105], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithMetadataPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithoutCopyablePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:315: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithoutCopyablePerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 2.842%, values: [0.000028, 0.000026, 0.000026, 0.000026, 0.000027], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:315: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithoutCopyablePerformance]' measured [CPU Instructions Retired, kI] average: 2497.243, relative standard deviation: 0.247%, values: [2497.472000, 2486.648000, 2501.158000, 2505.021000, 2495.917000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:315: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithoutCopyablePerformance]' measured [CPU Cycles, kC] average: 511.962, relative standard deviation: 2.076%, values: [530.474000, 501.124000, 512.306000, 513.964000, 501.940000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:315: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithoutCopyablePerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.051%, values: [0.000137, 0.000133, 0.000126, 0.000132, 0.000137], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testKeyValueRowWithoutCopyablePerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMixedLayoutKeyValueRowsPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:215: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMixedLayoutKeyValueRowsPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 11.228%, values: [0.000008, 0.000006, 0.000006, 0.000006, 0.000007], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:215: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMixedLayoutKeyValueRowsPerformance]' measured [CPU Instructions Retired, kI] average: 2091.978, relative standard deviation: 0.573%, values: [2085.203000, 2095.609000, 2100.978000, 2105.802000, 2072.300000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:215: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMixedLayoutKeyValueRowsPerformance]' measured [CPU Cycles, kC] average: 434.681, relative standard deviation: 3.274%, values: [422.079000, 462.337000, 426.893000, 430.075000, 432.020000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:215: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMixedLayoutKeyValueRowsPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.527%, values: [0.000110, 0.000117, 0.000111, 0.000115, 0.000117], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMixedLayoutKeyValueRowsPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_1000Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:147: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_1000Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.031%, values: [0.000209, 0.000202, 0.000206, 0.000193, 0.000209], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:147: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_1000Instances]' measured [CPU Instructions Retired, kI] average: 6685.229, relative standard deviation: 0.225%, values: [6673.456000, 6661.548000, 6695.355000, 6695.290000, 6700.494000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:147: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_1000Instances]' measured [CPU Cycles, kC] average: 1242.761, relative standard deviation: 2.069%, values: [1282.787000, 1206.881000, 1252.706000, 1225.246000, 1246.186000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:147: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_1000Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.398%, values: [0.000326, 0.000307, 0.000317, 0.000294, 0.000317], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_1000Instances]' passed (0.004 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_100Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:128: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_100Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.551%, values: [0.000114, 0.000125, 0.000125, 0.000125, 0.000114], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:128: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_100Instances]' measured [CPU Instructions Retired, kI] average: 4719.318, relative standard deviation: 0.151%, values: [4722.336000, 4720.706000, 4721.031000, 4705.722000, 4726.795000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:128: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_100Instances]' measured [CPU Cycles, kC] average: 899.545, relative standard deviation: 0.468%, values: [900.057000, 901.650000, 894.863000, 895.098000, 906.056000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:128: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_100Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.128%, values: [0.000214, 0.000230, 0.000228, 0.000229, 0.000216], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_100Instances]' passed (0.004 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_10Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:93: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_10Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 21.346%, values: [0.000019, 0.000017, 0.000028, 0.000018, 0.000017], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:93: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_10Instances]' measured [CPU Instructions Retired, kI] average: 2319.338, relative standard deviation: 0.239%, values: [2312.919000, 2327.126000, 2324.645000, 2315.103000, 2316.899000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:93: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_10Instances]' measured [CPU Cycles, kC] average: 483.996, relative standard deviation: 3.381%, values: [476.717000, 488.853000, 513.161000, 465.439000, 475.809000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:93: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_10Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.910%, values: [0.000130, 0.000121, 0.000134, 0.000117, 0.000124], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_10Instances]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_50Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:110: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_50Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.210%, values: [0.000066, 0.000070, 0.000064, 0.000069, 0.000066], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:110: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_50Instances]' measured [CPU Instructions Retired, kI] average: 3381.145, relative standard deviation: 0.661%, values: [3361.554000, 3400.059000, 3414.981000, 3358.991000, 3370.138000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:110: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_50Instances]' measured [CPU Cycles, kC] average: 675.150, relative standard deviation: 1.693%, values: [678.801000, 688.161000, 685.460000, 662.146000, 661.180000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:110: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_50Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 0.558%, values: [0.000169, 0.000171, 0.000171, 0.000171, 0.000172], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testMultipleKeyValueRows_50Instances]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testSingleKeyValueRowRenderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:29: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testSingleKeyValueRowRenderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 0.482%, values: [0.000050, 0.000050, 0.000050, 0.000050, 0.000050], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:29: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testSingleKeyValueRowRenderPerformance]' measured [CPU Instructions Retired, kI] average: 3130.450, relative standard deviation: 0.286%, values: [3123.547000, 3138.678000, 3123.550000, 3143.793000, 3122.680000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:29: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testSingleKeyValueRowRenderPerformance]' measured [CPU Cycles, kC] average: 605.566, relative standard deviation: 0.675%, values: [601.789000, 608.050000, 602.323000, 612.435000, 603.234000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:29: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testSingleKeyValueRowRenderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 0.682%, values: [0.000156, 0.000157, 0.000155, 0.000158, 0.000157], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testSingleKeyValueRowRenderPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutAtScale]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:299: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutAtScale]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.895%, values: [0.000027, 0.000026, 0.000029, 0.000027, 0.000025], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:299: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutAtScale]' measured [CPU Instructions Retired, kI] average: 2483.399, relative standard deviation: 0.424%, values: [2473.780000, 2472.564000, 2501.339000, 2481.563000, 2487.748000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:299: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutAtScale]' measured [CPU Cycles, kC] average: 510.012, relative standard deviation: 2.552%, values: [495.561000, 493.722000, 516.481000, 526.433000, 517.864000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:299: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutAtScale]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.384%, values: [0.000130, 0.000129, 0.000142, 0.000143, 0.000135], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutAtScale]' passed (0.003 seconds). +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:67: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 3.498%, values: [0.000052, 0.000048, 0.000052, 0.000053, 0.000052], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:67: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutPerformance]' measured [CPU Instructions Retired, kI] average: 3146.726, relative standard deviation: 0.364%, values: [3168.939000, 3141.221000, 3141.489000, 3136.625000, 3145.356000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:67: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutPerformance]' measured [CPU Cycles, kC] average: 610.206, relative standard deviation: 1.546%, values: [621.091000, 618.847000, 612.648000, 597.694000, 600.748000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/KeyValueRowPerformanceTests.swift:67: Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.798%, values: [0.000162, 0.000151, 0.000159, 0.000163, 0.000157], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.KeyValueRowPerformanceTests testVerticalLayoutPerformance]' passed (0.003 seconds). +Test Suite 'KeyValueRowPerformanceTests' passed at 2026-02-05 00:55:59.351. + Executed 20 tests, with 0 failures (0 unexpected) in 0.070 (0.071) seconds +Test Suite 'KeyValueRowTests' started at 2026-02-05 00:55:59.351. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowCopyableDefault]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowCopyableDefault]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowCopyableDisabled]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowCopyableDisabled]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowCopyableEnabled]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowCopyableEnabled]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationBasic]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationBasic]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationFullAPI]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationFullAPI]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationWithCopyable]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationWithCopyable]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationWithLayout]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowInitializationWithLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowIsAView]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowIsAView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowKeyContent]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowKeyContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowLayoutEquality]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowLayoutEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowSupportsHorizontalLayout]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowSupportsHorizontalLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowSupportsVerticalLayout]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowSupportsVerticalLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowValueContent]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowValueContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithEmptyKey]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithEmptyKey]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithEmptyValue]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithEmptyValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithHexValue]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithHexValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithLongKey]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithLongKey]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithLongValue]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithLongValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithNumericValue]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithNumericValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testKeyValueRowWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyValueRowTests testMultipleKeyValueRowInstances]' started. +Test Case '-[FoundationUITests.KeyValueRowTests testMultipleKeyValueRowInstances]' passed (0.000 seconds). +Test Suite 'KeyValueRowTests' passed at 2026-02-05 00:55:59.353. + Executed 21 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds +Test Suite 'KeyboardShortcutsIntegrationTests' started at 2026-02-05 00:55:59.353. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testAccessibilityLabelsAreVoiceOverFriendly]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testAccessibilityLabelsAreVoiceOverFriendly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testCustomShortcutIntegration]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testCustomShortcutIntegration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testDisplayStringsUsePlatformAppropriateFormatting]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testDisplayStringsUsePlatformAppropriateFormatting]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutAccessibilityLabels]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutAccessibilityLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutDisplayStringsInUI]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutDisplayStringsInUI]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutLabelsUseDSTypography]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutLabelsUseDSTypography]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutPerformanceWithManyItems]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/IntegrationTests/UtilityIntegrationTests/KeyboardShortcutsIntegrationTests.swift:187: Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutPerformanceWithManyItems]' measured [Time, seconds] average: 0.000, relative standard deviation: 47.064%, values: [0.000175, 0.000056, 0.000047, 0.000044, 0.000042, 0.000065, 0.000094, 0.000093, 0.000093, 0.000092], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutPerformanceWithManyItems]' passed (0.256 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutsUseCommandKeyOnMacOS]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutsUseCommandKeyOnMacOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutsWithCardActions]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutsWithCardActions]' passed (0.002 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutsWithToolbarPattern]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testKeyboardShortcutsWithToolbarPattern]' passed (0.002 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testMultipleShortcutsOnSameScreen]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testMultipleShortcutsOnSameScreen]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testShortcutConflictDetection]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testShortcutConflictDetection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testStandardShortcutsInToolbar]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsIntegrationTests testStandardShortcutsInToolbar]' passed (0.000 seconds). +Test Suite 'KeyboardShortcutsIntegrationTests' passed at 2026-02-05 00:55:59.615. + Executed 13 tests, with 0 failures (0 unexpected) in 0.262 (0.263) seconds +Test Suite 'KeyboardShortcutsTests' started at 2026-02-05 00:55:59.615. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_Command_macOS_ReturnsCommandKey]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_Command_macOS_ReturnsCommandKey]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_Command_NonMacOS_ReturnsControlKey]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_Command_NonMacOS_ReturnsControlKey]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_CommandShift_macOS_ReturnsCorrectCombination]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_CommandShift_macOS_ReturnsCorrectCombination]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_Option_ReturnsCorrectModifier]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutModifiers_Option_ReturnsCorrectModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_AccessibilityLabel_AllShortcuts_HaveLabels]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_AccessibilityLabel_AllShortcuts_HaveLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_AccessibilityLabel_Copy_IsDescriptive]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_AccessibilityLabel_Copy_IsDescriptive]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_AllStandardShortcuts_AreDefined]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_AllStandardShortcuts_AreDefined]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_Copy_DefinedCorrectly]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_Copy_DefinedCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_Cut_DefinedCorrectly]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_Cut_DefinedCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_DisplayString_macOS_ReturnsSymbol]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_DisplayString_macOS_ReturnsSymbol]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_DisplayString_NonMacOS_ReturnsCtrlFormat]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_DisplayString_NonMacOS_ReturnsCtrlFormat]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_DisplayString_Redo_IncludesShift]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_DisplayString_Redo_IncludesShift]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_Paste_DefinedCorrectly]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_Paste_DefinedCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_SelectAll_DefinedCorrectly]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testKeyboardShortcutType_SelectAll_DefinedCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.KeyboardShortcutsTests testViewExtension_Shortcut_CanBeApplied]' started. +Test Case '-[FoundationUITests.KeyboardShortcutsTests testViewExtension_Shortcut_CanBeApplied]' passed (0.001 seconds). +Test Suite 'KeyboardShortcutsTests' passed at 2026-02-05 00:55:59.621. + Executed 15 tests, with 0 failures (0 unexpected) in 0.004 (0.006) seconds +Test Suite 'NavigationScaffoldIntegrationTests' started at 2026-02-05 00:55:59.621. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testAccessibilityLabelsPreservedInScaffold]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testAccessibilityLabelsPreservedInScaffold]' passed (0.004 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testCompactSizeClassBehaviorWithPatterns]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testCompactSizeClassBehaviorWithPatterns]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testComplexNestedPatternComposition]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testComplexNestedPatternComposition]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testEmptyPatternComposition]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testEmptyPatternComposition]' passed (0.001 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testFullThreePatternComposition]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testFullThreePatternComposition]' passed (0.002 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testIndependentScaffoldsHaveIndependentModels]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testIndependentScaffoldsHaveIndependentModels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testInspectorPatternAccessesNavigationModelFromEnvironment]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testInspectorPatternAccessesNavigationModelFromEnvironment]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testInspectorPatternWorksStandaloneWithoutScaffold]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testInspectorPatternWorksStandaloneWithoutScaffold]' passed (0.001 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testMultiplePatternsAccessSameNavigationModel]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testMultiplePatternsAccessSameNavigationModel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testNavigationModelStateChangesPropagate]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testNavigationModelStateChangesPropagate]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testPatternsWorkInsideScaffold]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testPatternsWorkInsideScaffold]' passed (0.001 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testPatternsWorkWithoutScaffold]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testPatternsWorkWithoutScaffold]' passed (0.001 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testRegularSizeClassBehaviorWithPatterns]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testRegularSizeClassBehaviorWithPatterns]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testScaffoldWithSidebarAndInspectorPatterns]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testScaffoldWithSidebarAndInspectorPatterns]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testSidebarPatternAccessesNavigationModelFromEnvironment]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testSidebarPatternAccessesNavigationModelFromEnvironment]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testSidebarPatternWorksStandaloneWithoutNavigationModel]' started. +Test Case '-[FoundationUITests.NavigationScaffoldIntegrationTests testSidebarPatternWorksStandaloneWithoutNavigationModel]' passed (0.000 seconds). +Test Suite 'NavigationScaffoldIntegrationTests' passed at 2026-02-05 00:55:59.635. + Executed 16 tests, with 0 failures (0 unexpected) in 0.013 (0.014) seconds +Test Suite 'NavigationSplitScaffoldTests' started at 2026-02-05 00:55:59.635. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testCompactLayoutPreferringContent]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testCompactLayoutPreferringContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testEnvironmentPropagatesDownMultipleLevels]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testEnvironmentPropagatesDownMultipleLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testISOInspectorThreeColumnLayout]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testISOInspectorThreeColumnLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testMultipleScaffoldsHaveIndependentState]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testMultipleScaffoldsHaveIndependentState]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelAllowsChangingPreferredCompactColumn]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelAllowsChangingPreferredCompactColumn]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelBindingUpdates]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelBindingUpdates]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelCanBeSetInEnvironment]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelCanBeSetInEnvironment]' passed (0.001 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelDefaultsToAutomaticVisibility]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelDefaultsToAutomaticVisibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelEnvironmentKeyHasNilDefaultValue]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelEnvironmentKeyHasNilDefaultValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelPreferredCompactColumnDefaultsToContent]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelPreferredCompactColumnDefaultsToContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelRetainsStateAcrossUpdates]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelRetainsStateAcrossUpdates]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelStateIsIndependent]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelStateIsIndependent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsAllColumnVisibility]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsAllColumnVisibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsContentDetailVisibility]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsContentDetailVisibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsContentOnlyVisibility]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsContentOnlyVisibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsMultipleStateChanges]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelSupportsMultipleStateChanges]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelTransitionsFromAllToContentOnly]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelTransitionsFromAllToContentOnly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelTransitionsFromAutomaticToAll]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationModelTransitionsFromAutomaticToAll]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationSplitScaffoldAcceptsProvidedModel]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationSplitScaffoldAcceptsProvidedModel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationSplitScaffoldInitializesWithDefaultModel]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationSplitScaffoldInitializesWithDefaultModel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationSplitScaffoldStoresViewBuilderContent]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testNavigationSplitScaffoldStoresViewBuilderContent]' passed (0.001 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldAcceptsDifferentViewTypes]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldAcceptsDifferentViewTypes]' passed (0.001 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldAdaptsToCompactSizeClass]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldAdaptsToCompactSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldAdaptsToRegularSizeClass]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldAdaptsToRegularSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldHandlesComplexViewHierarchy]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldHandlesComplexViewHierarchy]' passed (0.019 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldHandlesEmptyViews]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldHandlesEmptyViews]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldPropagatesNavigationModelToContent]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldPropagatesNavigationModelToContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldPropagatesNavigationModelToDetail]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldPropagatesNavigationModelToDetail]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldPropagatesNavigationModelToSidebar]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldPropagatesNavigationModelToSidebar]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldSupportsAccessibilityLabels]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldSupportsAccessibilityLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldSupportsGenericViews]' started. +Test Case '-[FoundationUITests.NavigationSplitScaffoldTests testScaffoldSupportsGenericViews]' passed (0.001 seconds). +Test Suite 'NavigationSplitScaffoldTests' passed at 2026-02-05 00:55:59.664. + Executed 31 tests, with 0 failures (0 unexpected) in 0.027 (0.028) seconds +Test Suite 'PatternAgentDescribableTests' started at 2026-02-05 00:55:59.664. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternAgentDescription]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternComponentType]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternEmptyData]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternEmptyData]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternJSONSerialization]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternProperties]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternSemantics]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testBoxTreePatternSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternAgentDescription]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternComponentType]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternEmptyTitle]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternEmptyTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternJSONSerialization]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternProperties]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternSemantics]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testInspectorPatternSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternAgentDescription]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternComponentType]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternEmptySections]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternEmptySections]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternJSONSerialization]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternProperties]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternSemantics]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testSidebarPatternSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternAgentDescription]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternAgentDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternComponentType]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternEmptyItems]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternEmptyItems]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternJSONSerialization]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternJSONSerialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternProperties]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternSemantics]' started. +Test Case '-[FoundationUITests.PatternAgentDescribableTests testToolbarPatternSemantics]' passed (0.000 seconds). +Test Suite 'PatternAgentDescribableTests' passed at 2026-02-05 00:55:59.667. + Executed 24 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds +Test Suite 'PatternIntegrationTests' started at 2026-02-05 00:55:59.667. +Test Case '-[FoundationUITests.PatternIntegrationTests testSidebarSelectionDrivesInspectorDetailTitle]' started. +Test Case '-[FoundationUITests.PatternIntegrationTests testSidebarSelectionDrivesInspectorDetailTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternIntegrationTests testToolbarAccessibilityAnnouncementRecordsSelection]' started. +Test Case '-[FoundationUITests.PatternIntegrationTests testToolbarAccessibilityAnnouncementRecordsSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternIntegrationTests testToolbarOverflowAccessibilityLabelIncludesShortcutGlyph]' started. +Test Case '-[FoundationUITests.PatternIntegrationTests testToolbarOverflowAccessibilityLabelIncludesShortcutGlyph]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PatternIntegrationTests testToolbarPrimaryActionAdvancesSidebarSelection]' started. +Test Case '-[FoundationUITests.PatternIntegrationTests testToolbarPrimaryActionAdvancesSidebarSelection]' passed (0.000 seconds). +Test Suite 'PatternIntegrationTests' passed at 2026-02-05 00:55:59.668. + Executed 4 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'PatternsPerformanceTests' started at 2026-02-05 00:55:59.668. +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternDeepNestedTreeRenderTime]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:66: Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternDeepNestedTreeRenderTime]' measured [Time, seconds] average: 0.000, relative standard deviation: 204.448%, values: [0.000506, 0.000055, 0.000026, 0.000020, 0.000018, 0.000018, 0.000018, 0.000017, 0.000017, 0.000016], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternDeepNestedTreeRenderTime]' passed (0.257 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternExpansionPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:131: Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternExpansionPerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 117.018%, values: [0.000132, 0.000027, 0.000019, 0.000017, 0.000017, 0.000016, 0.000016, 0.000016, 0.000016, 0.000016], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternExpansionPerformance]' passed (0.260 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternLargeFlatTreeRenderTime]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:40: Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternLargeFlatTreeRenderTime]' measured [Time, seconds] average: 0.000, relative standard deviation: 114.974%, values: [0.000132, 0.000029, 0.000020, 0.000017, 0.000017, 0.000017, 0.000016, 0.000016, 0.000016, 0.000016], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternLargeFlatTreeRenderTime]' passed (0.260 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternLazyLoadingOptimization]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:108: Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternLazyLoadingOptimization]' measured [Time, seconds] average: 0.000, relative standard deviation: 108.032%, values: [0.000141, 0.000051, 0.000028, 0.000021, 0.000019, 0.000018, 0.000016, 0.000017, 0.000016, 0.000016], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternLazyLoadingOptimization]' passed (0.270 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternMemoryUsage]' started. +Test Case '-[FoundationUITests.PatternsPerformanceTests testBoxTreePatternMemoryUsage]' passed (0.054 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testCombinedPatternsPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:282: Test Case '-[FoundationUITests.PatternsPerformanceTests testCombinedPatternsPerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 232.734%, values: [0.000717, 0.000053, 0.000025, 0.000017, 0.000015, 0.000014, 0.000014, 0.000015, 0.000014, 0.000015], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testCombinedPatternsPerformance]' passed (0.258 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternManySectionsRenderTime]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:155: Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternManySectionsRenderTime]' measured [Time, seconds] average: 0.000, relative standard deviation: 158.006%, values: [0.000276, 0.000027, 0.000049, 0.000011, 0.000029, 0.000010, 0.000009, 0.000007, 0.000055, 0.000017], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternManySectionsRenderTime]' passed (0.258 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternMemoryUsage]' started. +Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternMemoryUsage]' passed (0.003 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternScrollPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:184: Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternScrollPerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 114.607%, values: [0.000121, 0.000020, 0.000015, 0.000013, 0.000013, 0.000038, 0.000020, 0.000014, 0.000013, 0.000013], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testInspectorPatternScrollPerformance]' passed (0.257 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testPatternPerformanceWithAnimations]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:329: Test Case '-[FoundationUITests.PatternsPerformanceTests testPatternPerformanceWithAnimations]' measured [Time, seconds] average: 0.000, relative standard deviation: 162.957%, values: [0.000255, 0.000027, 0.000021, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000019, 0.000018], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testPatternPerformanceWithAnimations]' passed (0.258 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testPatternStateDoesNotCauseRetainCycles]' started. +Test Case '-[FoundationUITests.PatternsPerformanceTests testPatternStateDoesNotCauseRetainCycles]' passed (0.003 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testSidebarPatternManyItemsRenderTime]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:205: Test Case '-[FoundationUITests.PatternsPerformanceTests testSidebarPatternManyItemsRenderTime]' measured [Time, seconds] average: 0.000, relative standard deviation: 153.437%, values: [0.000143, 0.000018, 0.000020, 0.000012, 0.000011, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testSidebarPatternManyItemsRenderTime]' passed (0.256 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testSidebarPatternMultipleSectionsPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:238: Test Case '-[FoundationUITests.PatternsPerformanceTests testSidebarPatternMultipleSectionsPerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 122.385%, values: [0.000137, 0.000031, 0.000021, 0.000016, 0.000016, 0.000015, 0.000015, 0.000015, 0.000015, 0.000015], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testSidebarPatternMultipleSectionsPerformance]' passed (0.259 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testStressDeepTree]' started. +Test Case '-[FoundationUITests.PatternsPerformanceTests testStressDeepTree]' passed (0.002 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testStressLargeTree]' started. +Test Case '-[FoundationUITests.PatternsPerformanceTests testStressLargeTree]' passed (0.044 seconds). +Test Case '-[FoundationUITests.PatternsPerformanceTests testToolbarPatternManyItemsRenderTime]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/PatternsPerformanceTests.swift:263: Test Case '-[FoundationUITests.PatternsPerformanceTests testToolbarPatternManyItemsRenderTime]' measured [Time, seconds] average: 0.000, relative standard deviation: 134.156%, values: [0.000059, 0.000010, 0.000007, 0.000006, 0.000007, 0.000006, 0.000006, 0.000006, 0.000006, 0.000006], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.PatternsPerformanceTests testToolbarPatternManyItemsRenderTime]' passed (0.256 seconds). +Test Suite 'PatternsPerformanceTests' passed at 2026-02-05 00:56:02.625. + Executed 16 tests, with 0 failures (0 unexpected) in 2.953 (2.958) seconds +Test Suite 'PlatformAdaptationIntegrationTests' started at 2026-02-05 00:56:02.625. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testComplexHierarchy_PlatformAdaptation]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testComplexHierarchy_PlatformAdaptation]' passed (0.004 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_AccessibilityConsistency]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_AccessibilityConsistency]' passed (0.001 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_BadgeConsistency]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_BadgeConsistency]' passed (0.001 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_DarkModeConsistency]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_DarkModeConsistency]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_DSTokenConsistency]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_DSTokenConsistency]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_EnvironmentPropagation]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_EnvironmentPropagation]' passed (0.002 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_ZeroMagicNumbers]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testCrossPlatform_ZeroMagicNumbers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testEdgeCase_NilSizeClass]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testEdgeCase_NilSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testEdgeCase_UnknownSizeClass]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testEdgeCase_UnknownSizeClass]' passed (0.001 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_ClipboardIntegration]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:335: -[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_ClipboardIntegration] : Test skipped - This test requires iOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_ClipboardIntegration]' skipped (0.001 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_DefaultSpacing]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:250: -[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_DefaultSpacing] : Test skipped - This test requires iOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_DefaultSpacing]' skipped (0.001 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_GestureSupport]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:367: -[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_GestureSupport] : Test skipped - This test requires iOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_GestureSupport]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_InspectorPatternLayout]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:403: -[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_InspectorPatternLayout] : Test skipped - This test requires iOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_InspectorPatternLayout]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_MinimumTouchTarget]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:276: -[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_MinimumTouchTarget] : Test skipped - This test requires iOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_MinimumTouchTarget]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_TouchTargetOnBadge]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:305: -[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_TouchTargetOnBadge] : Test skipped - This test requires iOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIOS_TouchTargetOnBadge]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_CompactSizeClassSpacing]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:435: -[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_CompactSizeClassSpacing] : Test skipped - This test requires iOS/iPadOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_CompactSizeClassSpacing]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_InspectorSizeClassAdaptation]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:509: -[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_InspectorSizeClassAdaptation] : Test skipped - This test requires iOS/iPadOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_InspectorSizeClassAdaptation]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_PointerInteractionSupport]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:591: -[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_PointerInteractionSupport] : Test skipped - This test requires iOS/iPadOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_PointerInteractionSupport]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_RegularSizeClassSpacing]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:466: -[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_RegularSizeClassSpacing] : Test skipped - This test requires iOS/iPadOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_RegularSizeClassSpacing]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_SidebarAdaptation]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:558: -[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_SidebarAdaptation] : Test skipped - This test requires iOS/iPadOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_SidebarAdaptation]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_SplitViewLayout]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/ContextsTests/PlatformAdaptationIntegrationTests.swift:635: -[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_SplitViewLayout] : Test skipped - This test requires iOS/iPadOS +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testIPad_SplitViewLayout]' skipped (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_ClipboardIntegration]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_ClipboardIntegration]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_DefaultSpacing]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_DefaultSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_HoverEffects]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_HoverEffects]' passed (0.001 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_InspectorPatternSpacing]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_InspectorPatternSpacing]' passed (0.002 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_KeyboardShortcuts]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_KeyboardShortcuts]' passed (0.003 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_SidebarPatternLayout]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testMacOS_SidebarPatternLayout]' passed (0.002 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testPlatformExtensions_UseDSTokens]' started. +Test Case '-[FoundationUITests.PlatformAdaptationIntegrationTests testPlatformExtensions_UseDSTokens]' passed (0.001 seconds). +Test Suite 'PlatformAdaptationIntegrationTests' passed at 2026-02-05 00:56:02.652. + Executed 28 tests, with 12 tests skipped and 0 failures (0 unexpected) in 0.024 (0.027) seconds +Test Suite 'PlatformAdaptationTests' started at 2026-02-05 00:56:02.652. +Test Case '-[FoundationUITests.PlatformAdaptationTests testDocumentation_PublicAPIHasDocumentation]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testDocumentation_PublicAPIHasDocumentation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testEdgeCase_ExtremeValues]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testEdgeCase_ExtremeValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testEdgeCase_NegativeSpacing]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testEdgeCase_NegativeSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptation_ConsistentBehavior]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptation_ConsistentBehavior]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptation_IntegrationWithComponents]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptation_IntegrationWithComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptation_ZeroMagicNumbers]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptation_ZeroMagicNumbers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptiveModifier_AppliesPlatformSpacing]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptiveModifier_AppliesPlatformSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptiveModifier_WithCustomSpacing]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptiveModifier_WithCustomSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptiveModifier_WithSizeClass]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformAdaptiveModifier_WithSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformDetection_iOS]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformDetection_iOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformDetection_macOS]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testPlatformDetection_macOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSizeClassMapping_Compact]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSizeClassMapping_Compact]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSizeClassMapping_NilSizeClass]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSizeClassMapping_NilSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSizeClassMapping_Regular]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSizeClassMapping_Regular]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_CompactSizeClass]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_CompactSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_iOS]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_iOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_macOS]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_macOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_RegularSizeClass]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_RegularSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_UsesDesignTokens]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testSpacingAdaptation_UsesDesignTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformPadding]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformPadding]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformPaddingWithEdges]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformPaddingWithEdges]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformSpacing]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformSpacingWithValue]' started. +Test Case '-[FoundationUITests.PlatformAdaptationTests testViewExtension_PlatformSpacingWithValue]' passed (0.000 seconds). +Test Suite 'PlatformAdaptationTests' passed at 2026-02-05 00:56:02.658. + Executed 23 tests, with 0 failures (0 unexpected) in 0.004 (0.006) seconds +Test Suite 'PlatformExtensionsTests' started at 2026-02-05 00:56:02.658. +Test Case '-[FoundationUITests.PlatformExtensionsTests testAccessibility_TouchTargetSize]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testAccessibility_TouchTargetSize]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testCrossPlatform_ConditionalCompilation]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testCrossPlatform_ConditionalCompilation]' passed (0.001 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testCrossPlatform_PlatformDetection]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testCrossPlatform_PlatformDetection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testDocumentation_PublicAPIHasDocumentation]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testDocumentation_PublicAPIHasDocumentation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testEdgeCase_ChainedModifiers]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testEdgeCase_ChainedModifiers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testEdgeCase_NilAction]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testEdgeCase_NilAction]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testIntegration_GesturesWithAnimation]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testIntegration_GesturesWithAnimation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testIntegration_MultipleGestures]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testIntegration_MultipleGestures]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_Copy]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_Copy]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_CustomAction]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_CustomAction]' passed (0.001 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_Cut]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_Cut]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_Paste]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_Paste]' passed (0.000 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_SelectAll]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testMacOSKeyboardShortcut_SelectAll]' passed (0.001 seconds). +Test Case '-[FoundationUITests.PlatformExtensionsTests testZeroMagicNumbers_UsesDesignTokens]' started. +Test Case '-[FoundationUITests.PlatformExtensionsTests testZeroMagicNumbers_UsesDesignTokens]' passed (0.000 seconds). +Test Suite 'PlatformExtensionsTests' passed at 2026-02-05 00:56:02.663. + Executed 14 tests, with 0 failures (0 unexpected) in 0.004 (0.005) seconds +Test Suite 'SectionHeaderAccessibilityTests' started at 2026-02-05 00:56:02.663. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testMultipleSectionHeadersHaveUniqueContent]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testMultipleSectionHeadersHaveUniqueContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderDefaultBehavior]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderDefaultBehavior]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderDividerIsDecorativeForAccessibility]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderDividerIsDecorativeForAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderHasHeaderTrait]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderHasHeaderTrait]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderInListContext]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderInListContext]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderOnCurrentPlatform]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderOnCurrentPlatform]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderPreservesTitleText]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderPreservesTitleText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderProvidesHeadingSemantics]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderProvidesHeadingSemantics]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderTextMeetsContrastRequirements]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderTextMeetsContrastRequirements]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderTitleIsNotEmpty]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderTitleIsNotEmpty]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderUsesDesignSystemSpacing]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderUsesDesignSystemSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderUsesDesignSystemTypography]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderUsesDesignSystemTypography]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithDivider]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithDivider]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithDividerHasHeaderTrait]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithDividerHasHeaderTrait]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithEmptyTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithEmptyTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithLongTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithLongTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithLowercaseTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithLowercaseTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithMixedCaseTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithMixedCaseTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithoutDivider]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithoutDivider]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithUppercaseTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderAccessibilityTests testSectionHeaderWithUppercaseTitle]' passed (0.000 seconds). +Test Suite 'SectionHeaderAccessibilityTests' passed at 2026-02-05 00:56:02.666. + Executed 21 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds +Test Suite 'SectionHeaderPerformanceTests' started at 2026-02-05 00:56:02.666. +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testComplexSectionedCardPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:279: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testComplexSectionedCardPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 20.354%, values: [0.000024, 0.000016, 0.000015, 0.000015, 0.000023], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:279: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testComplexSectionedCardPerformance]' measured [CPU Instructions Retired, kI] average: 2108.796, relative standard deviation: 0.599%, values: [2096.984000, 2118.147000, 2117.448000, 2090.239000, 2121.163000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:279: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testComplexSectionedCardPerformance]' measured [CPU Cycles, kC] average: 509.177, relative standard deviation: 6.789%, values: [559.976000, 487.681000, 457.667000, 516.225000, 524.338000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:279: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testComplexSectionedCardPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.948%, values: [0.000270, 0.000243, 0.000236, 0.000253, 0.000262], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testComplexSectionedCardPerformance]' passed (0.008 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testInspectorPanelPatternPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:307: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testInspectorPanelPatternPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 27.559%, values: [0.000046, 0.000037, 0.000027, 0.000025, 0.000024], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:307: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testInspectorPanelPatternPerformance]' measured [CPU Instructions Retired, kI] average: 2250.682, relative standard deviation: 0.908%, values: [2291.508000, 2241.040000, 2241.454000, 2238.693000, 2240.713000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:307: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testInspectorPanelPatternPerformance]' measured [CPU Cycles, kC] average: 528.047, relative standard deviation: 9.701%, values: [620.371000, 541.892000, 513.358000, 483.699000, 480.917000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:307: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testInspectorPanelPatternPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 9.659%, values: [0.000259, 0.000227, 0.000215, 0.000202, 0.000201], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testInspectorPanelPatternPerformance]' passed (0.006 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_100Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:121: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_100Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.892%, values: [0.000120, 0.000117, 0.000115, 0.000117, 0.000131], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:121: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_100Instances]' measured [CPU Instructions Retired, kI] average: 3803.858, relative standard deviation: 0.381%, values: [3800.458000, 3796.482000, 3791.117000, 3799.084000, 3832.151000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:121: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_100Instances]' measured [CPU Cycles, kC] average: 750.122, relative standard deviation: 3.557%, values: [793.533000, 726.068000, 737.504000, 725.365000, 768.142000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:121: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_100Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.004%, values: [0.000315, 0.000286, 0.000288, 0.000287, 0.000306], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_100Instances]' passed (0.006 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_10Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:88: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_10Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 10.058%, values: [0.000019, 0.000015, 0.000016, 0.000015, 0.000018], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:88: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_10Instances]' measured [CPU Instructions Retired, kI] average: 2202.710, relative standard deviation: 0.118%, values: [2199.624000, 2199.456000, 2205.167000, 2204.724000, 2204.579000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:88: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_10Instances]' measured [CPU Cycles, kC] average: 472.576, relative standard deviation: 1.930%, values: [482.217000, 472.583000, 473.375000, 478.921000, 455.786000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:88: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_10Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.809%, values: [0.000182, 0.000172, 0.000169, 0.000171, 0.000169], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_10Instances]' passed (0.005 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_50Instances]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:105: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_50Instances]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 2.450%, values: [0.000053, 0.000053, 0.000052, 0.000053, 0.000049], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:105: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_50Instances]' measured [CPU Instructions Retired, kI] average: 2919.674, relative standard deviation: 0.140%, values: [2918.994000, 2922.325000, 2922.721000, 2911.956000, 2922.372000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:105: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_50Instances]' measured [CPU Cycles, kC] average: 588.477, relative standard deviation: 2.911%, values: [611.495000, 605.612000, 570.962000, 570.816000, 583.500000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:105: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_50Instances]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.762%, values: [0.000213, 0.000200, 0.000194, 0.000192, 0.000197], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionHeaders_50Instances]' passed (0.005 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionsWithContentPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:156: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionsWithContentPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.047%, values: [0.000009, 0.000011, 0.000008, 0.000009, 0.000010], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:156: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionsWithContentPerformance]' measured [CPU Instructions Retired, kI] average: 2100.397, relative standard deviation: 0.386%, values: [2115.803000, 2095.648000, 2101.331000, 2094.688000, 2094.513000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:156: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionsWithContentPerformance]' measured [CPU Cycles, kC] average: 456.673, relative standard deviation: 5.535%, values: [502.791000, 464.691000, 434.789000, 439.103000, 441.993000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:156: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionsWithContentPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.763%, values: [0.000162, 0.000149, 0.000141, 0.000139, 0.000142], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testMultipleSectionsWithContentPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInCardPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:255: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInCardPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 9.947%, values: [0.000017, 0.000014, 0.000014, 0.000013, 0.000013], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:255: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInCardPerformance]' measured [CPU Instructions Retired, kI] average: 2142.566, relative standard deviation: 0.614%, values: [2160.154000, 2154.822000, 2140.739000, 2126.369000, 2130.746000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:255: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInCardPerformance]' measured [CPU Cycles, kC] average: 456.754, relative standard deviation: 3.013%, values: [482.536000, 454.910000, 443.403000, 446.731000, 456.188000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:255: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInCardPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.917%, values: [0.000145, 0.000140, 0.000133, 0.000137, 0.000137], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInCardPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInListPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:232: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInListPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 16.222%, values: [0.000009, 0.000008, 0.000009, 0.000008, 0.000012], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:232: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInListPerformance]' measured [CPU Instructions Retired, kI] average: 2107.442, relative standard deviation: 0.886%, values: [2088.386000, 2128.847000, 2089.693000, 2099.506000, 2130.778000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:232: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInListPerformance]' measured [CPU Cycles, kC] average: 473.452, relative standard deviation: 6.654%, values: [448.464000, 485.350000, 461.188000, 442.979000, 529.281000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:232: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInListPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 7.144%, values: [0.000133, 0.000141, 0.000136, 0.000127, 0.000156], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInListPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInScrollViewPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:210: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInScrollViewPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 29.168%, values: [0.000017, 0.000009, 0.000009, 0.000009, 0.000012], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:210: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInScrollViewPerformance]' measured [CPU Instructions Retired, kI] average: 2115.366, relative standard deviation: 0.329%, values: [2120.661000, 2122.114000, 2104.350000, 2119.657000, 2110.047000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:210: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInScrollViewPerformance]' measured [CPU Cycles, kC] average: 460.637, relative standard deviation: 4.010%, values: [494.022000, 466.156000, 443.404000, 453.634000, 445.970000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:210: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInScrollViewPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.235%, values: [0.000140, 0.000129, 0.000125, 0.000130, 0.000124], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInScrollViewPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInVStackPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:194: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInVStackPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 14.033%, values: [0.000007, 0.000006, 0.000007, 0.000009, 0.000006], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:194: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInVStackPerformance]' measured [CPU Instructions Retired, kI] average: 2093.034, relative standard deviation: 0.740%, values: [2100.566000, 2112.130000, 2077.431000, 2072.131000, 2102.914000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:194: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInVStackPerformance]' measured [CPU Cycles, kC] average: 458.884, relative standard deviation: 1.599%, values: [457.098000, 454.275000, 473.397000, 454.095000, 455.554000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:194: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInVStackPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.506%, values: [0.000135, 0.000121, 0.000128, 0.000120, 0.000122], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderInVStackPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithContentPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:140: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithContentPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 8.944%, values: [0.000021, 0.000020, 0.000018, 0.000018, 0.000016], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:140: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithContentPerformance]' measured [CPU Instructions Retired, kI] average: 2171.539, relative standard deviation: 0.805%, values: [2170.155000, 2183.326000, 2194.319000, 2167.580000, 2142.315000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:140: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithContentPerformance]' measured [CPU Cycles, kC] average: 501.976, relative standard deviation: 5.413%, values: [530.868000, 518.749000, 507.168000, 501.598000, 451.495000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:140: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithContentPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.855%, values: [0.000141, 0.000137, 0.000133, 0.000136, 0.000118], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithContentPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithDividerPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:40: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithDividerPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 6.489%, values: [0.000042, 0.000046, 0.000038, 0.000043, 0.000040], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:40: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithDividerPerformance]' measured [CPU Instructions Retired, kI] average: 2958.841, relative standard deviation: 0.515%, values: [2938.509000, 2943.350000, 2978.142000, 2967.204000, 2967.000000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:40: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithDividerPerformance]' measured [CPU Cycles, kC] average: 596.083, relative standard deviation: 2.142%, values: [615.519000, 586.041000, 597.844000, 602.150000, 578.862000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:40: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithDividerPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.973%, values: [0.000159, 0.000155, 0.000149, 0.000150, 0.000141], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithDividerPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithoutDividerPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:52: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithoutDividerPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 9.530%, values: [0.000045, 0.000038, 0.000046, 0.000042, 0.000036], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:52: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithoutDividerPerformance]' measured [CPU Instructions Retired, kI] average: 2967.090, relative standard deviation: 0.342%, values: [2961.922000, 2951.470000, 2976.999000, 2965.977000, 2979.081000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:52: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithoutDividerPerformance]' measured [CPU Cycles, kC] average: 592.818, relative standard deviation: 4.350%, values: [613.031000, 562.543000, 631.126000, 570.511000, 586.878000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:52: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithoutDividerPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.567%, values: [0.000164, 0.000141, 0.000158, 0.000149, 0.000146], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithoutDividerPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithVaryingTitleLengthPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:72: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithVaryingTitleLengthPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 2.108%, values: [0.000040, 0.000041, 0.000041, 0.000041, 0.000043], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:72: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithVaryingTitleLengthPerformance]' measured [CPU Instructions Retired, kI] average: 2904.650, relative standard deviation: 0.536%, values: [2897.000000, 2895.737000, 2901.985000, 2935.269000, 2893.257000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:72: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithVaryingTitleLengthPerformance]' measured [CPU Cycles, kC] average: 613.532, relative standard deviation: 1.625%, values: [628.436000, 600.728000, 611.442000, 620.833000, 606.221000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:72: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithVaryingTitleLengthPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.484%, values: [0.000158, 0.000151, 0.000153, 0.000162, 0.000157], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSectionHeaderWithVaryingTitleLengthPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSingleSectionHeaderRenderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:28: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSingleSectionHeaderRenderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 4.769%, values: [0.000041, 0.000040, 0.000042, 0.000046, 0.000042], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:28: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSingleSectionHeaderRenderPerformance]' measured [CPU Instructions Retired, kI] average: 2967.044, relative standard deviation: 0.379%, values: [2968.038000, 2953.456000, 2958.302000, 2986.141000, 2969.284000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:28: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSingleSectionHeaderRenderPerformance]' measured [CPU Cycles, kC] average: 607.490, relative standard deviation: 4.420%, values: [607.966000, 577.780000, 579.426000, 624.028000, 648.251000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/SectionHeaderPerformanceTests.swift:28: Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSingleSectionHeaderRenderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 7.539%, values: [0.000151, 0.000149, 0.000152, 0.000157, 0.000181], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.SectionHeaderPerformanceTests testSingleSectionHeaderRenderPerformance]' passed (0.003 seconds). +Test Suite 'SectionHeaderPerformanceTests' passed at 2026-02-05 00:56:02.732. + Executed 15 tests, with 0 failures (0 unexpected) in 0.065 (0.066) seconds +Test Suite 'SectionHeaderTests' started at 2026-02-05 00:56:02.732. +Test Case '-[FoundationUITests.SectionHeaderTests testMultipleSectionHeadersWithDifferentConfigurations]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testMultipleSectionHeadersWithDifferentConfigurations]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderDividerVisibility]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderDividerVisibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderInitializationWithDivider]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderInitializationWithDivider]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderInitializationWithoutDivider]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderInitializationWithoutDivider]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderInitializationWithTitleOnly]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderInitializationWithTitleOnly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderIsAView]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderIsAView]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderPreservesTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderPreservesTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithEmptyTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithEmptyTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithLongTitle]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithLongTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithSpecialCharacters]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithSpecialCharacters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithWhitespace]' started. +Test Case '-[FoundationUITests.SectionHeaderTests testSectionHeaderWithWhitespace]' passed (0.000 seconds). +Test Suite 'SectionHeaderTests' passed at 2026-02-05 00:56:02.733. + Executed 11 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'SidebarPatternTests' started at 2026-02-05 00:56:02.733. +Test Case '-[FoundationUITests.SidebarPatternTests testDetailBuilderWithDifferentSelections]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testDetailBuilderWithDifferentSelections]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testDetailBuilderWithNilSelection]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testDetailBuilderWithNilSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testItemEquality]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testItemEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testItemInitializationWithCustomAccessibilityLabel]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testItemInitializationWithCustomAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testItemInitializationWithIcon]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testItemInitializationWithIcon]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testItemInitializationWithoutIcon]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testItemInitializationWithoutIcon]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSectionEquality]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSectionEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSectionInitializationWithDefaultID]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSectionInitializationWithDefaultID]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSectionInitializationWithExplicitID]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSectionInitializationWithExplicitID]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSectionWithMultipleItems]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSectionWithMultipleItems]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarItemProvidesDefaultAccessibilityLabel]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarItemProvidesDefaultAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternDetailBuilderReceivesSelection]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternDetailBuilderReceivesSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternForFileExplorer]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternForFileExplorer]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternForISOInspector]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternForISOInspector]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternForMediaLibrary]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternForMediaLibrary]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternHasAccessibilityIdentifiers]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternHasAccessibilityIdentifiers]' passed (0.005 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternSelectionBindingUpdates]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternSelectionBindingUpdates]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternStoresSections]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternStoresSections]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternUsesDesignSystemTokens]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternUsesDesignSystemTokens]' passed (0.001 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithEmptySections]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithEmptySections]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithInitialSelection]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithInitialSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithManyItems]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithManyItems]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithManySections]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithManySections]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithMultipleSections]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithMultipleSections]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithNilSelection]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithNilSelection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithSectionContainingNoItems]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithSectionContainingNoItems]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithSpecialCharactersInTitles]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithSpecialCharactersInTitles]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithVeryLongTitles]' started. +Test Case '-[FoundationUITests.SidebarPatternTests testSidebarPatternWithVeryLongTitles]' passed (0.000 seconds). +Test Suite 'SidebarPatternTests' passed at 2026-02-05 00:56:02.741. + Executed 28 tests, with 0 failures (0 unexpected) in 0.007 (0.008) seconds +Test Suite 'SurfaceStyleKeyTests' started at 2026-02-05 00:56:02.741. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_AllMaterialTypes_CanBeSetAndRetrieved]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_AllMaterialTypes_CanBeSetAndRetrieved]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_DefaultSurfaceStyle_IsRegular]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_DefaultSurfaceStyle_IsRegular]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_SetSurfaceStyle_StoresValue]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_SetSurfaceStyle_StoresValue]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_SurfaceStyleChanges_AreDetected]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testEnvironmentValues_SurfaceStyleChanges_AreDetected]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceMaterial_AccessibilityLabel_ReturnsCorrectValues]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceMaterial_AccessibilityLabel_ReturnsCorrectValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceMaterial_Description_ReturnsCorrectValues]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceMaterial_Description_ReturnsCorrectValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceMaterial_Equality_WorksCorrectly]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceMaterial_Equality_WorksCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_ConformsToEnvironmentKey]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_ConformsToEnvironmentKey]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_DefaultValue_IsRegular]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_DefaultValue_IsRegular]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_DefaultValueIsStatic]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_DefaultValueIsStatic]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_RegularMaterial_WorksCorrectly]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_RegularMaterial_WorksCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_ThickMaterial_WorksCorrectly]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_ThickMaterial_WorksCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_ThinMaterial_WorksCorrectly]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_ThinMaterial_WorksCorrectly]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_UltraMaterial_WorksCorrectly]' started. +Test Case '-[FoundationUITests.SurfaceStyleKeyTests testSurfaceStyleKey_UltraMaterial_WorksCorrectly]' passed (0.000 seconds). +Test Suite 'SurfaceStyleKeyTests' passed at 2026-02-05 00:56:02.742. + Executed 14 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'SurfaceStyleTests' started at 2026-02-05 00:56:02.742. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialAllCasesExist]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialAllCasesExist]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialEquality]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialEquality]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularAccessibilityLabel]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularDescription]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularExists]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularExists]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularFallbackColor]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialRegularFallbackColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialSupportsVibrancy]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialSupportsVibrancy]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickAccessibilityLabel]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickDescription]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickExists]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickExists]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickFallbackColor]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThickFallbackColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinAccessibilityLabel]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinDescription]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinExists]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinExists]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinFallbackColor]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialThinFallbackColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraAccessibilityLabel]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraDescription]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraExists]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraExists]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraFallbackColor]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceMaterialUltraFallbackColor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceStyleUsesDesignSystemColors]' started. +Test Case '-[FoundationUITests.SurfaceStyleTests testSurfaceStyleUsesDesignSystemColors]' passed (0.000 seconds). +Test Suite 'SurfaceStyleTests' passed at 2026-02-05 00:56:02.743. + Executed 20 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'TokenValidationTests' started at 2026-02-05 00:56:02.743. +Test Case '-[FoundationUITests.TokenValidationTests testAllSemanticColorsAreNotNil]' started. +Test Case '-[FoundationUITests.TokenValidationTests testAllSemanticColorsAreNotNil]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testAnimationDurationsAreReasonable]' started. +Test Case '-[FoundationUITests.TokenValidationTests testAnimationDurationsAreReasonable]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testNoMagicNumbers]' started. +Test Case '-[FoundationUITests.TokenValidationTests testNoMagicNumbers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testPlatformAgnosticTokens]' started. +Test Case '-[FoundationUITests.TokenValidationTests testPlatformAgnosticTokens]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testPlatformDefaultSpacing]' started. +Test Case '-[FoundationUITests.TokenValidationTests testPlatformDefaultSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testRadiusTokensAreOrdered]' started. +Test Case '-[FoundationUITests.TokenValidationTests testRadiusTokensAreOrdered]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testRadiusTokensAreValid]' started. +Test Case '-[FoundationUITests.TokenValidationTests testRadiusTokensAreValid]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testRadiusTokenValues]' started. +Test Case '-[FoundationUITests.TokenValidationTests testRadiusTokenValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testSemanticColorsAreDefined]' started. +Test Case '-[FoundationUITests.TokenValidationTests testSemanticColorsAreDefined]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testSpacingTokensAreOrdered]' started. +Test Case '-[FoundationUITests.TokenValidationTests testSpacingTokensAreOrdered]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testSpacingTokensArePositive]' started. +Test Case '-[FoundationUITests.TokenValidationTests testSpacingTokensArePositive]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testSpacingTokenValues]' started. +Test Case '-[FoundationUITests.TokenValidationTests testSpacingTokenValues]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testTertiaryColorIsBackgroundColorOnMacOS]' started. +Test Case '-[FoundationUITests.TokenValidationTests testTertiaryColorIsBackgroundColorOnMacOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testTertiaryColorPlatformParity]' started. +Test Case '-[FoundationUITests.TokenValidationTests testTertiaryColorPlatformParity]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testTextColorsAreDefined]' started. +Test Case '-[FoundationUITests.TokenValidationTests testTextColorsAreDefined]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testTokenConsistency]' started. +Test Case '-[FoundationUITests.TokenValidationTests testTokenConsistency]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TokenValidationTests testTypographyTokensAreDefined]' started. +Test Case '-[FoundationUITests.TokenValidationTests testTypographyTokensAreDefined]' passed (0.000 seconds). +Test Suite 'TokenValidationTests' passed at 2026-02-05 00:56:02.745. + Executed 17 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds +Test Suite 'ToolbarPatternTests' started at 2026-02-05 00:56:02.745. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverUsesCompactModeForCompactWidthTraits]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverUsesCompactModeForCompactWidthTraits]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverUsesExpandedModeForMacOS]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverUsesExpandedModeForMacOS]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithIPadOSCompact]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithIPadOSCompact]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithIPadOSRegular]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithIPadOSRegular]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithLargeContentPreference]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithLargeContentPreference]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithNilSizeClass]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithNilSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithRegularHorizontalSizeClass]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testLayoutResolverWithRegularHorizontalSizeClass]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testShortcutFormattingWithControlModifier]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testShortcutFormattingWithControlModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testShortcutFormattingWithMultipleModifiers]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testShortcutFormattingWithMultipleModifiers]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testShortcutFormattingWithSingleModifier]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testShortcutFormattingWithSingleModifier]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemAccessibilityLabelIncludesShortcutDescription]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemAccessibilityLabelIncludesShortcutDescription]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemAccessibilityWithMultipleModifierShortcut]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemAccessibilityWithMultipleModifierShortcut]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemAccessibilityWithShortcut]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemAccessibilityWithShortcut]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemIdentifiableConformance]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemIdentifiableConformance]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemInitializationWithMinimalParameters]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemInitializationWithMinimalParameters]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemsWithAllCategories]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemsWithAllCategories]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemsWithEmptyCategories]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemsWithEmptyCategories]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemsWithOnlyPrimary]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemsWithOnlyPrimary]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemWithAction]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemWithAction]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemWithoutShortcut]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarItemWithoutShortcut]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternBodyRendering]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternBodyRendering]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternForFileEditor]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternForFileEditor]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternForISOInspector]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternForISOInspector]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternForMediaPlayer]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternForMediaPlayer]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternInitialization]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternInitialization]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternStoresPrimarySecondaryAndOverflowItems]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternStoresPrimarySecondaryAndOverflowItems]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithEmptyTitle]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithEmptyTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithLongTitle]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithLongTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithManyOverflowItems]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithManyOverflowItems]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithManyPrimaryItems]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithManyPrimaryItems]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithSpecialCharactersInTitle]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testToolbarPatternWithSpecialCharactersInTitle]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testTraitsForIOSPlatform]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testTraitsForIOSPlatform]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testTraitsForIPadOSPlatform]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testTraitsForIPadOSPlatform]' passed (0.000 seconds). +Test Case '-[FoundationUITests.ToolbarPatternTests testTraitsForMacOSPlatform]' started. +Test Case '-[FoundationUITests.ToolbarPatternTests testTraitsForMacOSPlatform]' passed (0.000 seconds). +Test Suite 'ToolbarPatternTests' passed at 2026-02-05 00:56:02.748. + Executed 34 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds +Test Suite 'TouchTargetTests' started at 2026-02-05 00:56:02.748. +Test Case '-[FoundationUITests.TouchTargetTests testAdjacentTouchTargets_AdequateSpacing]' started. +Test Case '-[FoundationUITests.TouchTargetTests testAdjacentTouchTargets_AdequateSpacing]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testBadgeChipStyle_SufficientTouchArea]' started. +Test Case '-[FoundationUITests.TouchTargetTests testBadgeChipStyle_SufficientTouchArea]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testBadgeComponent_InteractiveTouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testBadgeComponent_InteractiveTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testBoxTreePattern_ExpandCollapseButton_TouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testBoxTreePattern_ExpandCollapseButton_TouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testBoxTreePattern_TreeNodeTouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testBoxTreePattern_TreeNodeTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testCardComponent_TappableTouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testCardComponent_TappableTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testComprehensiveTouchTargetAudit]' started. +Test Case '-[FoundationUITests.TouchTargetTests testComprehensiveTouchTargetAudit]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testCopyableText_ButtonTouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testCopyableText_ButtonTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testInspectorPattern_InteractiveElements_TouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testInspectorPattern_InteractiveElements_TouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testInteractiveStyle_MeetsMinimumTouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testInteractiveStyle_MeetsMinimumTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testKeyValueRow_CopyButtonTouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testKeyValueRow_CopyButtonTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testMinimumSizeEdgeCase_AsymmetricSize]' started. +Test Case '-[FoundationUITests.TouchTargetTests testMinimumSizeEdgeCase_AsymmetricSize]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testMinimumSizeEdgeCase_ExactlyMinimum]' started. +Test Case '-[FoundationUITests.TouchTargetTests testMinimumSizeEdgeCase_ExactlyMinimum]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testMinimumSizeEdgeCase_OneLessThanMinimum]' started. +Test Case '-[FoundationUITests.TouchTargetTests testMinimumSizeEdgeCase_OneLessThanMinimum]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testSidebarPattern_ListItemTouchTarget]' started. +Test Case '-[FoundationUITests.TouchTargetTests testSidebarPattern_ListItemTouchTarget]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testToolbarPattern_ToolbarItems_MeetMinimum]' started. +Test Case '-[FoundationUITests.TouchTargetTests testToolbarPattern_ToolbarItems_MeetMinimum]' passed (0.000 seconds). +Test Case '-[FoundationUITests.TouchTargetTests testTouchTargets_MaintainSizeWithDynamicType]' started. +Test Case '-[FoundationUITests.TouchTargetTests testTouchTargets_MaintainSizeWithDynamicType]' passed (0.000 seconds). +Test Suite 'TouchTargetTests' passed at 2026-02-05 00:56:02.749. + Executed 17 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds +Test Suite 'UtilitiesPerformanceTests' started at 2026-02-05 00:56:02.749. +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_LargeHierarchy]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:366: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_LargeHierarchy]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.510%, values: [0.000016, 0.000017, 0.000013, 0.000016, 0.000013], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:366: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_LargeHierarchy]' measured [CPU Instructions Retired, kI] average: 2300.452, relative standard deviation: 0.757%, values: [2331.130000, 2301.368000, 2296.437000, 2277.229000, 2296.098000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:366: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_LargeHierarchy]' measured [CPU Cycles, kC] average: 486.549, relative standard deviation: 5.473%, values: [539.663000, 471.114000, 471.001000, 475.583000, 475.384000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:366: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_LargeHierarchy]' measured [CPU Time, s] average: 0.000, relative standard deviation: 10.168%, values: [0.000152, 0.000118, 0.000119, 0.000124, 0.000119], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_LargeHierarchy]' passed (0.004 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_MediumHierarchy]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:348: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_MediumHierarchy]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 6.828%, values: [0.000008, 0.000007, 0.000007, 0.000007, 0.000007], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:348: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_MediumHierarchy]' measured [CPU Instructions Retired, kI] average: 2226.522, relative standard deviation: 4.729%, values: [2191.062000, 2193.484000, 2165.527000, 2148.128000, 2434.408000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:348: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_MediumHierarchy]' measured [CPU Cycles, kC] average: 532.617, relative standard deviation: 25.233%, values: [467.348000, 449.312000, 488.618000, 457.681000, 800.124000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:348: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_MediumHierarchy]' measured [CPU Time, s] average: 0.000, relative standard deviation: 35.985%, values: [0.000119, 0.000113, 0.000123, 0.000115, 0.000245], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_MediumHierarchy]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_SmallHierarchy]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:331: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_SmallHierarchy]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 27.076%, values: [0.000002, 0.000002, 0.000002, 0.000003, 0.000004], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:331: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_SmallHierarchy]' measured [CPU Instructions Retired, kI] average: 2062.389, relative standard deviation: 0.834%, values: [2077.653000, 2048.936000, 2056.502000, 2041.820000, 2087.036000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:331: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_SmallHierarchy]' measured [CPU Cycles, kC] average: 463.745, relative standard deviation: 5.819%, values: [489.320000, 428.638000, 476.256000, 434.033000, 490.478000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:331: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_SmallHierarchy]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.817%, values: [0.000123, 0.000107, 0.000119, 0.000109, 0.000123], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testAccessibilityAuditPerformance_SmallHierarchy]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardMemoryLeak]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:522: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardMemoryLeak]' measured [Disk Logical Writes, kB] average: 0.000, relative standard deviation: 0.000%, values: [0.000000, 0.000000, 0.000000, 0.000000, 0.000000], performanceMetricID:com.apple.dt.XCTMetric_Disk.logical_writes, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardMemoryLeak]' passed (1.479 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_LargeText]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:125: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_LargeText]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 9.308%, values: [0.000117, 0.000096, 0.000097, 0.000098, 0.000090], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:125: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_LargeText]' measured [CPU Instructions Retired, kI] average: 2400.354, relative standard deviation: 0.399%, values: [2412.819000, 2390.791000, 2396.823000, 2390.664000, 2410.675000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:125: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_LargeText]' measured [CPU Cycles, kC] average: 827.306, relative standard deviation: 5.831%, values: [860.618000, 901.228000, 795.448000, 765.046000, 814.192000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:125: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_LargeText]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.517%, values: [0.000223, 0.000239, 0.000206, 0.000203, 0.000204], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_LargeText]' passed (0.005 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_MediumText]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:101: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_MediumText]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 8.677%, values: [0.000098, 0.000085, 0.000097, 0.000080, 0.000081], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:101: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_MediumText]' measured [CPU Instructions Retired, kI] average: 2420.911, relative standard deviation: 1.097%, values: [2422.777000, 2406.366000, 2455.842000, 2379.401000, 2440.170000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:101: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_MediumText]' measured [CPU Cycles, kC] average: 848.731, relative standard deviation: 2.719%, values: [847.206000, 888.078000, 851.193000, 816.442000, 840.737000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:101: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_MediumText]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.378%, values: [0.000212, 0.000239, 0.000214, 0.000206, 0.000214], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_MediumText]' passed (0.004 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_SmallText]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:76: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_SmallText]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 20.227%, values: [0.000082, 0.000079, 0.000083, 0.000086, 0.000129], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:76: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_SmallText]' measured [CPU Instructions Retired, kI] average: 2419.425, relative standard deviation: 0.545%, values: [2410.801000, 2404.183000, 2415.082000, 2442.037000, 2425.020000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:76: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_SmallText]' measured [CPU Cycles, kC] average: 769.243, relative standard deviation: 6.872%, values: [766.819000, 757.396000, 788.949000, 848.445000, 684.608000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:76: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_SmallText]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.473%, values: [0.000193, 0.000191, 0.000198, 0.000215, 0.000176], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testClipboardPerformance_SmallText]' passed (0.004 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testColorContrastCalculationOverhead]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:299: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testColorContrastCalculationOverhead]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.732%, values: [0.000057, 0.000045, 0.000047, 0.000041, 0.000057], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:299: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testColorContrastCalculationOverhead]' measured [CPU Instructions Retired, kI] average: 2588.543, relative standard deviation: 0.572%, values: [2586.044000, 2607.794000, 2562.706000, 2590.767000, 2595.402000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:299: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testColorContrastCalculationOverhead]' measured [CPU Cycles, kC] average: 654.896, relative standard deviation: 5.401%, values: [684.182000, 666.493000, 637.276000, 594.881000, 691.646000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:299: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testColorContrastCalculationOverhead]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.496%, values: [0.000172, 0.000168, 0.000159, 0.000149, 0.000173], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testColorContrastCalculationOverhead]' passed (0.004 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesCPUPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:436: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesCPUPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 13.821%, values: [0.000028, 0.000021, 0.000021, 0.000021, 0.000019], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:436: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesCPUPerformance]' measured [CPU Instructions Retired, kI] average: 2249.693, relative standard deviation: 0.325%, values: [2258.165000, 2252.485000, 2236.749000, 2247.431000, 2253.635000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:436: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesCPUPerformance]' measured [CPU Cycles, kC] average: 525.914, relative standard deviation: 3.722%, values: [554.146000, 509.770000, 498.653000, 533.186000, 533.815000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:436: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesCPUPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.628%, values: [0.000139, 0.000128, 0.000125, 0.000134, 0.000134], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesCPUPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesMemoryFootprint]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:409: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesMemoryFootprint]' measured [Disk Logical Writes, kB] average: 0.000, relative standard deviation: 0.000%, values: [0.000000, 0.000000, 0.000000, 0.000000, 0.000000], performanceMetricID:com.apple.dt.XCTMetric_Disk.logical_writes, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCombinedUtilitiesMemoryFootprint]' passed (0.002 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastCalculationMemoryLeak]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:551: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastCalculationMemoryLeak]' measured [Disk Logical Writes, kB] average: 0.000, relative standard deviation: 0.000%, values: [0.000000, 0.000000, 0.000000, 0.000000, 0.000000], performanceMetricID:com.apple.dt.XCTMetric_Disk.logical_writes, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastCalculationMemoryLeak]' passed (0.051 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_AllDSColors]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:257: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_AllDSColors]' measured [Clock Monotonic Time, s] average: 0.001, relative standard deviation: 1.234%, values: [0.000633, 0.000650, 0.000633, 0.000631, 0.000628], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:257: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_AllDSColors]' measured [CPU Instructions Retired, kI] average: 12799.422, relative standard deviation: 0.113%, values: [12814.291000, 12782.156000, 12810.822000, 12781.692000, 12808.150000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:257: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_AllDSColors]' measured [CPU Cycles, kC] average: 3107.828, relative standard deviation: 1.026%, values: [3083.529000, 3168.672000, 3110.724000, 3089.872000, 3086.344000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:257: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_AllDSColors]' measured [CPU Time, s] average: 0.001, relative standard deviation: 1.449%, values: [0.000783, 0.000792, 0.000792, 0.000761, 0.000785], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_AllDSColors]' passed (0.008 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_SinglePair]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:239: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_SinglePair]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 36.533%, values: [0.000009, 0.000017, 0.000007, 0.000007, 0.000009], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:239: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_SinglePair]' measured [CPU Instructions Retired, kI] average: 2088.595, relative standard deviation: 1.548%, values: [2073.241000, 2084.214000, 2076.424000, 2058.101000, 2150.997000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:239: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_SinglePair]' measured [CPU Cycles, kC] average: 522.180, relative standard deviation: 8.551%, values: [516.342000, 545.651000, 479.576000, 474.424000, 594.906000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:239: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_SinglePair]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.029%, values: [0.000129, 0.000135, 0.000120, 0.000119, 0.000138], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testContrastRatioCalculationPerformance_SinglePair]' passed (0.004 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextHierarchyPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:158: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextHierarchyPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 15.882%, values: [0.000018, 0.000012, 0.000012, 0.000013, 0.000015], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:158: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextHierarchyPerformance]' measured [CPU Instructions Retired, kI] average: 2234.417, relative standard deviation: 0.308%, values: [2242.132000, 2230.613000, 2224.065000, 2233.466000, 2241.810000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:158: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextHierarchyPerformance]' measured [CPU Cycles, kC] average: 516.939, relative standard deviation: 4.094%, values: [505.459000, 555.197000, 491.615000, 515.416000, 517.006000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:158: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextHierarchyPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 7.612%, values: [0.000128, 0.000153, 0.000125, 0.000130, 0.000130], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextHierarchyPerformance]' passed (0.004 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextViewPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:146: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextViewPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 8.150%, values: [0.000001, 0.000001, 0.000001, 0.000001, 0.000001], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:146: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextViewPerformance]' measured [CPU Instructions Retired, kI] average: 2015.334, relative standard deviation: 0.599%, values: [2016.825000, 2004.043000, 2012.228000, 2005.877000, 2037.699000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:146: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextViewPerformance]' measured [CPU Cycles, kC] average: 461.330, relative standard deviation: 1.717%, values: [467.878000, 463.668000, 458.194000, 447.526000, 469.383000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:146: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextViewPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.898%, values: [0.000117, 0.000116, 0.000114, 0.000111, 0.000117], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testCopyableTextViewPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutAccessibilityLabelPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:200: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutAccessibilityLabelPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 14.674%, values: [0.000009, 0.000008, 0.000009, 0.000007, 0.000006], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:200: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutAccessibilityLabelPerformance]' measured [CPU Instructions Retired, kI] average: 2087.027, relative standard deviation: 0.872%, values: [2099.209000, 2115.210000, 2083.745000, 2071.140000, 2065.832000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:200: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutAccessibilityLabelPerformance]' measured [CPU Cycles, kC] average: 464.994, relative standard deviation: 2.368%, values: [460.942000, 476.092000, 479.801000, 451.998000, 456.137000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:200: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutAccessibilityLabelPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.260%, values: [0.000116, 0.000120, 0.000122, 0.000115, 0.000116], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutAccessibilityLabelPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutFormattingPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:177: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutFormattingPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 13.017%, values: [0.000005, 0.000004, 0.000005, 0.000004, 0.000004], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:177: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutFormattingPerformance]' measured [CPU Instructions Retired, kI] average: 2054.190, relative standard deviation: 0.568%, values: [2040.795000, 2065.938000, 2068.007000, 2041.072000, 2055.140000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:177: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutFormattingPerformance]' measured [CPU Cycles, kC] average: 449.652, relative standard deviation: 1.759%, values: [448.381000, 463.488000, 452.146000, 441.817000, 442.427000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:177: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutFormattingPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 1.825%, values: [0.000112, 0.000116, 0.000113, 0.000111, 0.000111], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutFormattingPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutPlatformDetectionPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:217: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutPlatformDetectionPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 16.209%, values: [0.000001, 0.000001, 0.000001, 0.000001, 0.000001], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:217: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutPlatformDetectionPerformance]' measured [CPU Instructions Retired, kI] average: 2026.997, relative standard deviation: 0.858%, values: [2013.829000, 2030.198000, 2052.455000, 2002.523000, 2035.979000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:217: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutPlatformDetectionPerformance]' measured [CPU Cycles, kC] average: 441.722, relative standard deviation: 4.790%, values: [421.454000, 429.246000, 480.757000, 430.554000, 446.597000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:217: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutPlatformDetectionPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 4.741%, values: [0.000106, 0.000108, 0.000120, 0.000108, 0.000111], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testKeyboardShortcutPlatformDetectionPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testStressScenario_ManyUtilities]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:473: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testStressScenario_ManyUtilities]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 5.481%, values: [0.000172, 0.000154, 0.000182, 0.000166, 0.000170], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:473: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testStressScenario_ManyUtilities]' measured [CPU Instructions Retired, kI] average: 4948.589, relative standard deviation: 0.383%, values: [4967.319000, 4922.804000, 4971.168000, 4949.441000, 4932.213000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:473: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testStressScenario_ManyUtilities]' measured [CPU Cycles, kC] average: 1222.620, relative standard deviation: 7.063%, values: [1336.288000, 1243.892000, 1285.814000, 1111.568000, 1135.540000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:473: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testStressScenario_ManyUtilities]' measured [CPU Time, s] average: 0.000, relative standard deviation: 5.522%, values: [0.000306, 0.000287, 0.000323, 0.000278, 0.000285], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testStressScenario_ManyUtilities]' passed (0.004 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testTouchTargetValidationPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:390: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testTouchTargetValidationPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.407%, values: [0.000002, 0.000002, 0.000002, 0.000002, 0.000002], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:390: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testTouchTargetValidationPerformance]' measured [CPU Instructions Retired, kI] average: 2026.690, relative standard deviation: 0.729%, values: [2048.456000, 2039.089000, 2008.680000, 2020.697000, 2016.528000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:390: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testTouchTargetValidationPerformance]' measured [CPU Cycles, kC] average: 463.226, relative standard deviation: 4.672%, values: [459.661000, 448.479000, 502.325000, 439.288000, 466.376000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:390: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testTouchTargetValidationPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 6.527%, values: [0.000115, 0.000112, 0.000132, 0.000111, 0.000119], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testTouchTargetValidationPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testVoiceOverHintBuilderPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:318: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testVoiceOverHintBuilderPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 56.149%, values: [0.000002, 0.000005, 0.000002, 0.000002, 0.000002], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:318: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testVoiceOverHintBuilderPerformance]' measured [CPU Instructions Retired, kI] average: 2028.053, relative standard deviation: 0.282%, values: [2026.318000, 2027.745000, 2032.022000, 2018.652000, 2035.527000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:318: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testVoiceOverHintBuilderPerformance]' measured [CPU Cycles, kC] average: 443.491, relative standard deviation: 2.475%, values: [438.976000, 458.250000, 437.531000, 453.989000, 428.709000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:318: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testVoiceOverHintBuilderPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 2.352%, values: [0.000112, 0.000117, 0.000111, 0.000114, 0.000109], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testVoiceOverHintBuilderPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AA_ValidationPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:274: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AA_ValidationPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 12.922%, values: [0.000017, 0.000016, 0.000020, 0.000014, 0.000014], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:274: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AA_ValidationPerformance]' measured [CPU Instructions Retired, kI] average: 2166.075, relative standard deviation: 0.537%, values: [2150.138000, 2175.912000, 2180.606000, 2168.113000, 2155.606000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:274: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AA_ValidationPerformance]' measured [CPU Cycles, kC] average: 513.844, relative standard deviation: 5.966%, values: [521.136000, 563.218000, 522.454000, 480.018000, 482.394000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:274: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AA_ValidationPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 9.739%, values: [0.000131, 0.000156, 0.000131, 0.000120, 0.000121], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AA_ValidationPerformance]' passed (0.003 seconds). +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AAA_ValidationPerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:286: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AAA_ValidationPerformance]' measured [Clock Monotonic Time, s] average: 0.000, relative standard deviation: 13.954%, values: [0.000013, 0.000014, 0.000018, 0.000018, 0.000014], performanceMetricID:com.apple.dt.XCTMetric_Clock.time.monotonic, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:286: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AAA_ValidationPerformance]' measured [CPU Instructions Retired, kI] average: 2159.939, relative standard deviation: 0.278%, values: [2167.961000, 2151.238000, 2155.015000, 2162.878000, 2162.601000], performanceMetricID:com.apple.dt.XCTMetric_CPU.instructions_retired, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:286: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AAA_ValidationPerformance]' measured [CPU Cycles, kC] average: 492.458, relative standard deviation: 3.952%, values: [474.551000, 467.190000, 517.027000, 510.639000, 492.881000], performanceMetricID:com.apple.dt.XCTMetric_CPU.cycles, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/PerformanceTests/UtilitiesPerformanceTests.swift:286: Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AAA_ValidationPerformance]' measured [CPU Time, s] average: 0.000, relative standard deviation: 3.934%, values: [0.000120, 0.000118, 0.000130, 0.000129, 0.000125], performanceMetricID:com.apple.dt.XCTMetric_CPU.time, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000 +Test Case '-[FoundationUITests.UtilitiesPerformanceTests testWCAG_AAA_ValidationPerformance]' passed (0.003 seconds). +Test Suite 'UtilitiesPerformanceTests' passed at 2026-02-05 00:56:04.359. + Executed 23 tests, with 0 failures (0 unexpected) in 1.609 (1.610) seconds +Test Suite 'VoiceOverTests' started at 2026-02-05 00:56:04.359. +Test Case '-[FoundationUITests.VoiceOverTests testAccessibilityHelpers_ButtonLabel]' started. +Test Case '-[FoundationUITests.VoiceOverTests testAccessibilityHelpers_ButtonLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testAccessibilityHelpers_VoiceOverHintBuilder]' started. +Test Case '-[FoundationUITests.VoiceOverTests testAccessibilityHelpers_VoiceOverHintBuilder]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testBadgeChipStyle_HasSemanticLabels]' started. +Test Case '-[FoundationUITests.VoiceOverTests testBadgeChipStyle_HasSemanticLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testBadgeComponent_AccessibilityLabel]' started. +Test Case '-[FoundationUITests.VoiceOverTests testBadgeComponent_AccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testBoxTreePattern_ExpandCollapseAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testBoxTreePattern_ExpandCollapseAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testBoxTreePattern_NodeAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testBoxTreePattern_NodeAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testBoxTreePattern_SelectionAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testBoxTreePattern_SelectionAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testCardComponent_AccessibilityRole]' started. +Test Case '-[FoundationUITests.VoiceOverTests testCardComponent_AccessibilityRole]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testComprehensiveVoiceOverAudit]' started. +Test Case '-[FoundationUITests.VoiceOverTests testComprehensiveVoiceOverAudit]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testCopyableModifier_HasDescriptiveLabels]' started. +Test Case '-[FoundationUITests.VoiceOverTests testCopyableModifier_HasDescriptiveLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testCopyableTextComponent_VoiceOverAnnouncements]' started. +Test Case '-[FoundationUITests.VoiceOverTests testCopyableTextComponent_VoiceOverAnnouncements]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testCopyFeedback_AnnouncesToVoiceOver]' started. +Test Case '-[FoundationUITests.VoiceOverTests testCopyFeedback_AnnouncesToVoiceOver]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testDynamicContent_AnnouncesChanges]' started. +Test Case '-[FoundationUITests.VoiceOverTests testDynamicContent_AnnouncesChanges]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testInspectorPattern_NavigationAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testInspectorPattern_NavigationAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testInspectorPattern_SectionAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testInspectorPattern_SectionAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testInteractiveStyle_HasAccessibilityLabel]' started. +Test Case '-[FoundationUITests.VoiceOverTests testInteractiveStyle_HasAccessibilityLabel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testKeyValueRowComponent_AccessibilityLabels]' started. +Test Case '-[FoundationUITests.VoiceOverTests testKeyValueRowComponent_AccessibilityLabels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testKeyValueRowComponent_CopyableAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testKeyValueRowComponent_CopyableAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testSectionHeaderComponent_AccessibilityTraits]' started. +Test Case '-[FoundationUITests.VoiceOverTests testSectionHeaderComponent_AccessibilityTraits]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testSidebarPattern_ListItemAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testSidebarPattern_ListItemAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testSidebarPattern_NavigationHints]' started. +Test Case '-[FoundationUITests.VoiceOverTests testSidebarPattern_NavigationHints]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testToolbarPattern_ItemAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testToolbarPattern_ItemAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testToolbarPattern_OverflowMenuAccessibility]' started. +Test Case '-[FoundationUITests.VoiceOverTests testToolbarPattern_OverflowMenuAccessibility]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testVoiceOverHints_Concise]' started. +Test Case '-[FoundationUITests.VoiceOverTests testVoiceOverHints_Concise]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testVoiceOverHints_UseActionVerbs]' started. +Test Case '-[FoundationUITests.VoiceOverTests testVoiceOverHints_UseActionVerbs]' passed (0.000 seconds). +Test Case '-[FoundationUITests.VoiceOverTests testVoiceOverLabels_Descriptive]' started. +Test Case '-[FoundationUITests.VoiceOverTests testVoiceOverLabels_Descriptive]' passed (0.000 seconds). +Test Suite 'VoiceOverTests' passed at 2026-02-05 00:56:04.362. + Executed 26 tests, with 0 failures (0 unexpected) in 0.002 (0.002) seconds +Test Suite 'YAMLIntegrationTests' started at 2026-02-05 00:56:04.362. +Test Case '-[FoundationUITests.YAMLIntegrationTests testAgentDescribableToYAMLToView]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testAgentDescribableToYAMLToView]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLIntegrationTests testFullPipelineWithValidation]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testFullPipelineWithValidation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLIntegrationTests testISOInspectorUseCase]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testISOInspectorUseCase]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLIntegrationTests testLargeYAMLFilePerformance]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testLargeYAMLFilePerformance]' passed (0.006 seconds). +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseBadgeExamples]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseBadgeExamples]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseCompleteUIExample]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseCompleteUIExample]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseInspectorPatternExamples]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseInspectorPatternExamples]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseInvalidYAMLGracefully]' started. +Test Case '-[FoundationUITests.YAMLIntegrationTests testParseInvalidYAMLGracefully]' passed (0.000 seconds). +Test Suite 'YAMLIntegrationTests' passed at 2026-02-05 00:56:04.373. + Executed 8 tests, with 0 failures (0 unexpected) in 0.011 (0.011) seconds +Test Suite 'YAMLParserTests' started at 2026-02-05 00:56:04.373. +Test Case '-[FoundationUITests.YAMLParserTests testParse100BadgeComponents]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParse100BadgeComponents]' passed (0.004 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseAllComponentTypes]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseAllComponentTypes]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseCardWithElevation]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseCardWithElevation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseComponentWithoutProperties]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseComponentWithoutProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseEmptyProperties]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseEmptyProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseEmptyYAML]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseEmptyYAML]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseInvalidStructure]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseInvalidStructure]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseInvalidYAMLSyntax]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseInvalidYAMLSyntax]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseMissingComponentType]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseMissingComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseMultiDocumentYAML]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseMultiDocumentYAML]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseMultipleComponents]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseMultipleComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseMultipleNestedComponents]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseMultipleNestedComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseNestedCardWithBadge]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseNestedCardWithBadge]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParsePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/AgentSupportTests/YAMLParserTests.swift:283: Test Case '-[FoundationUITests.YAMLParserTests testParsePerformance]' measured [Time, seconds] average: 0.008, relative standard deviation: 53.552%, values: [0.018887, 0.011907, 0.009028, 0.007582, 0.006378, 0.005900, 0.005308, 0.005008, 0.004818, 0.004515], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.YAMLParserTests testParsePerformance]' passed (0.334 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseSimpleBadge]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseSimpleBadge]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseSingleComponentObject]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseSingleComponentObject]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseVariousPropertyTypes]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseVariousPropertyTypes]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLParserTests testParseWithSemantics]' started. +Test Case '-[FoundationUITests.YAMLParserTests testParseWithSemantics]' passed (0.000 seconds). +Test Suite 'YAMLParserTests' passed at 2026-02-05 00:56:04.714. + Executed 18 tests, with 0 failures (0 unexpected) in 0.340 (0.341) seconds +Test Suite 'YAMLValidatorTests' started at 2026-02-05 00:56:04.714. +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptCardWithoutOptionalProperties]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptCardWithoutOptionalProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptMissingOptionalProperties]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptMissingOptionalProperties]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptReasonableNesting]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptReasonableNesting]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptValidCornerRadius]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testAcceptValidCornerRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectBadgeMissingLevel]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectBadgeMissingLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectBadgeMissingText]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectBadgeMissingText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectCornerRadiusTooHigh]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectCornerRadiusTooHigh]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectExcessiveNesting]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectExcessiveNesting]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidBadgeLevel]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidBadgeLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidBoolType]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidBoolType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidElevation]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidElevation]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidMaterial]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidMaterial]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidNestedComponent]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidNestedComponent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidPropertyType]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectInvalidPropertyType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectKeyValueRowMissingKey]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectKeyValueRowMissingKey]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectMultipleComponentsWithInvalid]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectMultipleComponentsWithInvalid]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectNegativeCornerRadius]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectNegativeCornerRadius]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectUnknownComponentType]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testRejectUnknownComponentType]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testSuggestTypoCorrection]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testSuggestTypoCorrection]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testSuggestWarningTypo]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testSuggestWarningTypo]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateBadge]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateBadge]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateCard]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateCard]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateInspectorPattern]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateInspectorPattern]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateKeyValueRow]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateKeyValueRow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateMultipleComponents]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateMultipleComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateNestedComponents]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateNestedComponents]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateSectionHeader]' started. +Test Case '-[FoundationUITests.YAMLValidatorTests testValidateSectionHeader]' passed (0.000 seconds). +Test Suite 'YAMLValidatorTests' passed at 2026-02-05 00:56:04.717. + Executed 27 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds +Test Suite 'YAMLViewGeneratorTests' started at 2026-02-05 00:56:04.717. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testFullPipelineParseValidateGenerate]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testFullPipelineParseValidateGenerate]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerate50BadgeViews]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerate50BadgeViews]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateAllComponentTypes]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateAllComponentTypes]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeFromYAML]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeFromYAML]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithAllLevels]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithAllLevels]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithInvalidLevel]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithInvalidLevel]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithMissingText]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithMissingText]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithoutOptionalIcon]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateBadgeWithoutOptionalIcon]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateCardFromYAML]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateCardFromYAML]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateCardWithAllElevations]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateCardWithAllElevations]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateCardWithNestedBadge]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateCardWithNestedBadge]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateComplexCardComposition]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateComplexCardComposition]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateFromEmptyYAML]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateFromEmptyYAML]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateInspectorPattern]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateInspectorPattern]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateInspectorPatternWithContent]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateInspectorPatternWithContent]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateKeyValueRow]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateKeyValueRow]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateKeyValueRowWithVerticalLayout]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateKeyValueRowWithVerticalLayout]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateNestedCardStructure]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateNestedCardStructure]' passed (0.000 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGeneratePerformance]' started. +/Users/egor/Development/GitHub/ISOInspector/FoundationUI/Tests/FoundationUITests/AgentSupportTests/YAMLViewGeneratorTests.swift:330: Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGeneratePerformance]' measured [Time, seconds] average: 0.000, relative standard deviation: 37.587%, values: [0.000679, 0.000252, 0.000199, 0.000175, 0.000390, 0.000363, 0.000354, 0.000366, 0.000355, 0.000415], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , polarity: prefers smaller, maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100 +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGeneratePerformance]' passed (0.260 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateSectionHeader]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateSectionHeader]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateSectionHeaderWithoutDivider]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateSectionHeaderWithoutDivider]' passed (0.001 seconds). +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateWithUnknownComponentType]' started. +Test Case '-[FoundationUITests.YAMLViewGeneratorTests testGenerateWithUnknownComponentType]' passed (0.000 seconds). +Test Suite 'YAMLViewGeneratorTests' passed at 2026-02-05 00:56:04.984. + Executed 22 tests, with 0 failures (0 unexpected) in 0.265 (0.267) seconds +Test Suite 'FoundationUIPackageTests.xctest' passed at 2026-02-05 00:56:04.984. + Executed 1182 tests, with 12 tests skipped and 0 failures (0 unexpected) in 9.885 (9.951) seconds +Test Suite 'All tests' passed at 2026-02-05 00:56:04.984. + Executed 1182 tests, with 12 tests skipped and 0 failures (0 unexpected) in 9.885 (9.953) seconds +βœ… Accessibility Integration Audit Summary: + Scenarios tested: 5 + Passed: 5 (100.0%) + Failed: 0 +Badge estimated size: 44.0Γ—32.0 pt +Note: Badges are primarily informational. When interactive, wrap in larger touch target. +βœ… Dynamic Type Audit Summary: + Sizes tested: 12 + Components tested: 9 + Passed: 9 (100.0%) + Failed: 0 +βœ… Touch Target Audit Summary: + Platform: macOS + Minimum: 24.0Γ—24.0 pt + Tested: 7 components + Passed: 7 (100.0%) + Failed: 0 +βœ… VoiceOver Accessibility Audit Summary: + Tested: 9 components + Passed: 9 (100.0%) + Failed: 0 +Performance results: + Parse: 5.012989044189453ms + Validate: 0.3509521484375ms + Generate: 0.007033348083496094ms +τ€Ÿˆ Test run started. +τ€„΅ Testing Library Version: 1501 +τ€„΅ Target Platform: arm64e-apple-macos14.0 +τ› Test run with 0 tests in 0 suites passed after 0.001 seconds. diff --git a/Documentation/Quality/swift-duplication-report-20260205-005605.txt b/Documentation/Quality/swift-duplication-report-20260205-005605.txt new file mode 100644 index 00000000..4a82f92c --- /dev/null +++ b/Documentation/Quality/swift-duplication-report-20260205-005605.txt @@ -0,0 +1,9 @@ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Format β”‚ Files analyzed β”‚ Total lines β”‚ Total tokens β”‚ Clones found β”‚ Duplicated lines β”‚ Duplicated tokens β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ swift β”‚ 127 β”‚ 2926 β”‚ 24755 β”‚ 0 β”‚ 0 (0%) β”‚ 0 (0%) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ Total: β”‚ 127 β”‚ 2926 β”‚ 24755 β”‚ 0 β”‚ 0 (0%) β”‚ 0 (0%) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +Found 0 clones. +Detection time:: 64.618ms diff --git a/ISOInspector.xcodeproj/project.pbxproj b/ISOInspector.xcodeproj/project.pbxproj index 5a459502..b396ace1 100644 --- a/ISOInspector.xcodeproj/project.pbxproj +++ b/ISOInspector.xcodeproj/project.pbxproj @@ -128,6 +128,7 @@ 2E3FCC360D2873F1311D8A3A /* fragmented-stream-init.json in Resources */ = {isa = PBXBuildFile; fileRef = 592403F51BD515FEE4F84221 /* fragmented-stream-init.json */; }; 2E68807C22048858E8D6DE62 /* ISOInspectorCLIScaffoldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546E6B47CA4BFF7E6435106D /* ISOInspectorCLIScaffoldTests.swift */; }; 2E9300D3D331F718CA071094 /* Stz2CompactSampleSizeParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8890E635B38D407493FDD5A8 /* Stz2CompactSampleSizeParserTests.swift */; }; + 2ECE23CFF9966EA86488BDB7 /* InMemoryRandomAccessReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354EE29FB61C5F7C4D8B88B2 /* InMemoryRandomAccessReader.swift */; }; 2F0F1AF641B95A08826C7177 /* ISOInspectorCommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C46A97C3F689D1184F5E28 /* ISOInspectorCommandTests.swift */; }; 2F179CCBF8AD2DB071582E48 /* DocumentSessionTestStubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF5581018440701113754FC9 /* DocumentSessionTestStubs.swift */; }; 2F658C7C86184D113724DDA5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8B957B5C7474C9106FB82747 /* Assets.xcassets */; }; @@ -190,7 +191,6 @@ 43AB685E5B489759833783F2 /* codec_invalid_configs.txt in Resources */ = {isa = PBXBuildFile; fileRef = AAF1854A2139409DBD5F105D /* codec_invalid_configs.txt */; }; 451D508D45B13075BE05984F /* HexSliceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB89073E4EE5FD8547865B4 /* HexSliceProvider.swift */; }; 4525DF5C97697E6CEAA3BFC9 /* CoreDataAnnotationBookmarkStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501BDE7D817A15D0AB66845E /* CoreDataAnnotationBookmarkStore.swift */; }; - 4573C4C1C1BE735975EC4E6E /* InMemoryRandomAccessReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D50A71DD073DC812BE7C65 /* InMemoryRandomAccessReader.swift */; }; 460661C3B496E1D5DBF9F65F /* FilesystemOpenConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C8C2FE675AB7404E2AE1639 /* FilesystemOpenConfiguration.swift */; }; 460F68B4E50B8281FDCDB5FB /* FragmentEnvironmentCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8719F9C50158E016430FEE6 /* FragmentEnvironmentCoordinator.swift */; }; 46589D233E6C9AB13091C45B /* ISOInspectorApp.docc in Sources */ = {isa = PBXBuildFile; fileRef = 7954003B76877ED9E9074C66 /* ISOInspectorApp.docc */; }; @@ -284,7 +284,6 @@ 6FD18157BE0A0B822EB4275A /* ISOInspectorApp.docc in Sources */ = {isa = PBXBuildFile; fileRef = 7954003B76877ED9E9074C66 /* ISOInspectorApp.docc */; }; 70F71B5F4AA084835EE00DCD /* ParseTreeDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D908147075E7BEF594C127B1 /* ParseTreeDetailView.swift */; }; 710D76165FE8D47F747D8F78 /* ParseTreeStatusDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C446DA9253F631221FC22365 /* ParseTreeStatusDescriptor.swift */; }; - 71E7761A7111249DAB3D5E91 /* InMemoryRandomAccessReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56A0C163A438DA1A8AD19538 /* InMemoryRandomAccessReader.swift */; }; 721BE286EFCC64D4AE018B0C /* TrackRunEntryDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D3C8B8457D87A1436EF450 /* TrackRunEntryDetail.swift */; }; 7248483580E811C9BC07ED76 /* ISOInspectorAppResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7820D994CA4C32D5C1585C4B /* ISOInspectorAppResources.swift */; }; 72CA7E6C8DA9F5465A8E8401 /* BoxParserRegistry+MediaHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10ED0C6B7FF0021F533E6492 /* BoxParserRegistry+MediaHeaders.swift */; }; @@ -413,7 +412,6 @@ A615C3DDDFD3816DBF824D9D /* RandomAccessPayloadAnnotationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E7DCCA63840A40EA73968EC /* RandomAccessPayloadAnnotationProvider.swift */; }; A67709F33DB20DC636756268 /* DocumentOpeningCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8ED225305EE34733F11B88D /* DocumentOpeningCoordinator.swift */; }; A67C326E64E1854595F9D703 /* SettingsPanelAccessibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD130CA5254BC88FAC3F5427 /* SettingsPanelAccessibilityTests.swift */; }; - A741C799F3810735E65288C4 /* InMemoryRandomAccessReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D50A71DD073DC812BE7C65 /* InMemoryRandomAccessReader.swift */; }; A768BECBCE12B03B7FEF2F05 /* PaddingDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9756AEA0B5722CA50D5164CA /* PaddingDetail.swift */; }; A7742862ADC001C7788E8878 /* ParseExportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CD16CD4E61E924E75713669 /* ParseExportTests.swift */; }; A7993DFD7B84E53ADCD4BE0A /* ParseTreeOutlineRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EF997BA1663E1627FC36132 /* ParseTreeOutlineRow.swift */; }; @@ -948,6 +946,7 @@ 335E8F93121B27723CC667AB /* FormControlsAccessibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormControlsAccessibilityTests.swift; sourceTree = ""; }; 33E338EA3240C01F9E98BEE8 /* TrunTrackRunParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrunTrackRunParserTests.swift; sourceTree = ""; }; 3432110BD3B4AA523805CEA5 /* MetadataKeyTableDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetadataKeyTableDetail.swift; sourceTree = ""; }; + 354EE29FB61C5F7C4D8B88B2 /* InMemoryRandomAccessReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InMemoryRandomAccessReader.swift; sourceTree = ""; }; 36199A10CEE6FF195B047564 /* SecurityScopedURL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityScopedURL.swift; sourceTree = ""; }; 3676791B5DC589A0983AABEA /* ChunkedFileReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChunkedFileReader.swift; sourceTree = ""; }; 36C6AAF73907915AAC83C060 /* StreamingBoxWalker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StreamingBoxWalker.swift; sourceTree = ""; }; @@ -1001,7 +1000,6 @@ 546E6B47CA4BFF7E6435106D /* ISOInspectorCLIScaffoldTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISOInspectorCLIScaffoldTests.swift; sourceTree = ""; }; 5555CD1CD64F1D3845288E37 /* MockUserPreferencesStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockUserPreferencesStore.swift; sourceTree = ""; }; 569CBB5C16A5128DA2ECD333 /* BoxParserRegistryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxParserRegistryTests.swift; sourceTree = ""; }; - 56A0C163A438DA1A8AD19538 /* InMemoryRandomAccessReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InMemoryRandomAccessReader.swift; sourceTree = ""; }; 56BF38C898896987F6E8A17E /* HexSliceRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HexSliceRequest.swift; sourceTree = ""; }; 576DF57496A52C2CB46CC2DE /* StcoChunkOffsetParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StcoChunkOffsetParserTests.swift; sourceTree = ""; }; 57992D039D04588D8BB97A2B /* AppShellViewErrorBannerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppShellViewErrorBannerTests.swift; sourceTree = ""; }; @@ -1140,7 +1138,6 @@ A599DD0D887F4E7B86F00794 /* FilesystemAccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilesystemAccess.swift; sourceTree = ""; }; A68EFF4B87EC9FFA7A12833C /* ISOInspectorAppTests-macOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "ISOInspectorAppTests-macOS-Info.plist"; sourceTree = ""; }; A6EDBADFAE2010EFF9C64339 /* SampleAuxInfoSizesDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleAuxInfoSizesDetail.swift; sourceTree = ""; }; - A7D50A71DD073DC812BE7C65 /* InMemoryRandomAccessReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InMemoryRandomAccessReader.swift; sourceTree = ""; }; A7DF54834256F5620536271F /* SeverityBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeverityBadge.swift; sourceTree = ""; }; A84C8949483003AF8A31AF67 /* BoxCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxCategory.swift; sourceTree = ""; }; A87A779200F1ACD99995FCDE /* DocumentationWorkflowTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentationWorkflowTests.swift; sourceTree = ""; }; @@ -1512,7 +1509,6 @@ isa = PBXGroup; children = ( DF5581018440701113754FC9 /* DocumentSessionTestStubs.swift */, - A7D50A71DD073DC812BE7C65 /* InMemoryRandomAccessReader.swift */, ); path = TestSupport; sourceTree = ""; @@ -1738,6 +1734,14 @@ path = Stores; sourceTree = ""; }; + 5A06829ABE8DA8D0B41222C2 /* TestSupport */ = { + isa = PBXGroup; + children = ( + 354EE29FB61C5F7C4D8B88B2 /* InMemoryRandomAccessReader.swift */, + ); + path = TestSupport; + sourceTree = ""; + }; 5B771327E3F3D51B22B3F9E2 /* ISOInspectorCLI */ = { isa = PBXGroup; children = ( @@ -1773,6 +1777,7 @@ C752500565F915C64B75A5E9 /* Resources */, 512845C95A3CC80EF02DE61C /* Stores */, 935BBA4BCA5810DBD4A6771B /* Support */, + 5A06829ABE8DA8D0B41222C2 /* TestSupport */, 5EFE88D5FF8E78B8E0F86099 /* Theming */, E724861AC9CB0EE4BAA57A0D /* Validation */, FC1A5DA04628AC60697D74FB /* ISOInspectorKit.docc */, @@ -2023,7 +2028,6 @@ 41DAC2BEFED141C5275819A4 /* FourCharContainerCodeTests.swift */, 6229959FE1CAA6CDD9504308 /* FragmentFixtureCoverageTests.swift */, F3C391099938A6A776E71C53 /* FullBoxReaderTests.swift */, - 56A0C163A438DA1A8AD19538 /* InMemoryRandomAccessReader.swift */, EFD508FAC8798423BB8E13BA /* ISOInspectorBrandPaletteTests.swift */, D1088C156810ED000D5C3795 /* ISOInspectorKitScaffoldTests.swift */, 5DA11AFC1204986A2C1885DD /* JSONExportSnapshotTests.swift */, @@ -2764,7 +2768,6 @@ A0A81988DFC39CD4C6BE02D0 /* FullBoxReaderTests.swift in Sources */, 69BAC964BBDB262F7CCA6504 /* ISOInspectorBrandPaletteTests.swift in Sources */, 0601ABE4FE2719C06E3DFA18 /* ISOInspectorKitScaffoldTests.swift in Sources */, - 71E7761A7111249DAB3D5E91 /* InMemoryRandomAccessReader.swift in Sources */, 4785120AEA7769FEA5D6326F /* JSONExportSnapshotTests.swift in Sources */, E712F311BE9D626AA308E425 /* MP4RACatalogRefresherTests.swift in Sources */, A1845E89618BC99980B4F08F /* MappedReaderTests.swift in Sources */, @@ -2926,7 +2929,6 @@ B6731F7ECDC5485975416F15 /* ResearchLogTelemetrySmokeTests.swift in Sources */, A67C326E64E1854595F9D703 /* SettingsPanelAccessibilityTests.swift in Sources */, C89EC4D45D5C754F2F4FE2C4 /* DocumentSessionTestStubs.swift in Sources */, - A741C799F3810735E65288C4 /* InMemoryRandomAccessReader.swift in Sources */, D81C67ECA1445C55132A591A /* SettingsPanelViewModelTests.swift in Sources */, CFF2670B04D4B1CB2AF059CD /* UICorruptionIndicatorsSmokeTests.swift in Sources */, 6BD8BFB755BF4C00402248A3 /* UserPreferencesStoreTests.swift in Sources */, @@ -3252,6 +3254,7 @@ EB9FDC8EDF8305942EF62509 /* ParseIssueStore.swift in Sources */, D518F45AAC2EFD90BBB1C1DD /* Diagnostics.swift in Sources */, DEAE121F16744F60FC89779E /* ResearchLogPreviewProvider.swift in Sources */, + 2ECE23CFF9966EA86488BDB7 /* InMemoryRandomAccessReader.swift in Sources */, 46F888D33DB855689DD79036 /* ISOInspectorBrandPalette.swift in Sources */, DF83B512380C10874BB3B7FE /* BoxValidator.swift in Sources */, D3B2561F22510D4E94120A25 /* ParseIssue.swift in Sources */, @@ -3361,7 +3364,6 @@ 2FD73A4DC4CDA22E08B358D9 /* ResearchLogTelemetrySmokeTests.swift in Sources */, 1EFCE36FE3C531F3F9DF3C26 /* SettingsPanelAccessibilityTests.swift in Sources */, 2F179CCBF8AD2DB071582E48 /* DocumentSessionTestStubs.swift in Sources */, - 4573C4C1C1BE735975EC4E6E /* InMemoryRandomAccessReader.swift in Sources */, FA36AFAEBAD1E372D335912A /* SettingsPanelViewModelTests.swift in Sources */, D176B9CE051FBBAEEDD690F9 /* UICorruptionIndicatorsSmokeTests.swift in Sources */, 9B1635ED0595F2AE9FBF0CE8 /* UserPreferencesStoreTests.swift in Sources */, diff --git a/Package.resolved b/Package.resolved index 42703445..0855bb74 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,6 +1,15 @@ { "originHash" : "2f2b3d8d3396b167fc77170514b7dde1b84ea9ae1b898c8fb6d689bd4adff273", "pins" : [ + { + "identity" : "nesteda11yids", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SoundBlaster/NestedA11yIDs", + "state" : { + "revision" : "ad123fbc8dda58f20de1e6fbd21120bcfbaabf85", + "version" : "1.0.0" + } + }, { "identity" : "swift-argument-parser", "kind" : "remoteSourceControl", @@ -27,6 +36,15 @@ "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", "version" : "1.0.0" } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams.git", + "state" : { + "revision" : "3d6871d5b4a5cd519adf233fbb576e0a2af71c17", + "version" : "5.4.0" + } } ], "version" : 3 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..9bc833bd 100644 --- a/Sources/ISOInspectorApp/State/DocumentSessionController.swift +++ b/Sources/ISOInspectorApp/State/DocumentSessionController.swift @@ -47,6 +47,7 @@ private var annotationsSelectionCancellable: AnyCancellable? private var issueMetricsCancellable: AnyCancellable? + private var recentsChangeCancellable: AnyCancellable? private var latestSelectionNodeID: Int64? // MARK: - Passthrough Properties @@ -109,7 +110,8 @@ setupCoordinatorCallbacks() setupObservers( resolvedAnnotations: dependencies.annotations, - resolvedParseTreeStore: dependencies.parseTreeStore) + resolvedParseTreeStore: dependencies.parseTreeStore, + resolvedRecentsService: dependencies.recentsService) applyValidationConfigurationFilter() restoreSessionIfNeeded() } @@ -130,7 +132,8 @@ } private func setupObservers( - resolvedAnnotations: AnnotationBookmarkSession, resolvedParseTreeStore: ParseTreeStore + resolvedAnnotations: AnnotationBookmarkSession, resolvedParseTreeStore: ParseTreeStore, + resolvedRecentsService: RecentsService ) { latestSelectionNodeID = resolvedAnnotations.currentSelectedNodeID annotationsSelectionCancellable = resolvedAnnotations.$currentSelectedNodeID.dropFirst() @@ -146,6 +149,10 @@ issueMetricsCancellable = resolvedParseTreeStore.$issueMetrics.receive( on: DispatchQueue.main ).sink { [weak self] metrics in self?.issueMetrics = metrics } + + recentsChangeCancellable = resolvedRecentsService.objectWillChange.sink { [weak self] _ in + self?.objectWillChange.send() + } } private func restoreSessionIfNeeded() { @@ -183,10 +190,19 @@ ) } + func registerRecent(_ recent: DocumentRecent) { + recentsService.insertRecent(recent) + persistSession() + } + func removeRecent(at offsets: IndexSet) { 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/Sources/ISOInspectorApp/State/WindowSessionController.swift b/Sources/ISOInspectorApp/State/WindowSessionController.swift index ae42084e..7a3ffbb1 100644 --- a/Sources/ISOInspectorApp/State/WindowSessionController.swift +++ b/Sources/ISOInspectorApp/State/WindowSessionController.swift @@ -208,13 +208,18 @@ pipeline: resources.pipeline, reader: resources.reader, context: resources.context) + // Set file URL for annotations + annotations.setFileURL(url) + + // Create bookmark for security-scoped access + let bookmarkData = bookmarkDataProvider(scopedURL) let recent = DocumentRecent( - url: url, bookmarkIdentifier: nil, bookmarkData: nil, + url: url, bookmarkIdentifier: nil, bookmarkData: bookmarkData, displayName: url.lastPathComponent, lastOpened: Date()) currentDocument = recent - // Register with app controller's recent documents - appSessionController.openRecent(recent) + // Register with app controller's recent documents (without re-opening) + appSessionController.registerRecent(recent) } } catch { await MainActor.run { diff --git a/Sources/ISOInspectorKit/ISO/BoxHeaderDecoder.swift b/Sources/ISOInspectorKit/ISO/BoxHeaderDecoder.swift index 63d1ef15..74087b85 100644 --- a/Sources/ISOInspectorKit/ISO/BoxHeaderDecoder.swift +++ b/Sources/ISOInspectorKit/ISO/BoxHeaderDecoder.swift @@ -132,8 +132,13 @@ public enum BoxHeaderDecoder { let payloadRange = cursor.. UUID { diff --git a/Sources/ISOInspectorKit/ISO/StreamingBoxWalker.swift b/Sources/ISOInspectorKit/ISO/StreamingBoxWalker.swift index 645d502c..8bae5a27 100644 --- a/Sources/ISOInspectorKit/ISO/StreamingBoxWalker.swift +++ b/Sources/ISOInspectorKit/ISO/StreamingBoxWalker.swift @@ -149,13 +149,20 @@ public struct StreamingBoxWalker: Sendable { } let startEvent = ParseEvent( - kind: .willStartBox(header: header, depth: depth), offset: header.startOffset) + kind: .willStartBox(header: header, depth: depth), + offset: header.startOffset + ) onEvent(startEvent) stack.append( Frame( - header: header, range: payloadRange, cursor: initialCursor, depth: depth, - shouldParseChildren: shouldParseChildren)) + header: header, + range: payloadRange, + cursor: initialCursor, + depth: depth, + shouldParseChildren: shouldParseChildren + ) + ) } } } diff --git a/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift b/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift index 045996ef..7417a2e4 100644 --- a/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift +++ b/Tests/ISOInspectorAppTests/DocumentSessionControllerTests.swift @@ -756,6 +756,55 @@ 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]) + } + + func testRemovingRecentTriggersObjectWillChange() throws { + let first = sampleRecent(index: 1) + let second = sampleRecent(index: 2) + let recentsStore = DocumentRecentsStoreStub(initialRecents: [first, second]) + let controller = makeController(store: recentsStore) + + var changeCount = 0 + var cancellables: Set = [] + controller.objectWillChange.sink { _ in changeCount += 1 }.store(in: &cancellables) + + controller.removeRecent(second) + + XCTAssertEqual(changeCount, 1, "objectWillChange should fire when recent is removed") + XCTAssertEqual(controller.recents.count, 1) + } + + func testRegisterRecentAddsToListAndPersists() throws { + let recentsStore = DocumentRecentsStoreStub(initialRecents: []) + let sessionStore = WorkspaceSessionStoreStub() + let controller = makeController(store: recentsStore, sessionStore: sessionStore) + + let recent = sampleRecent(index: 1) + controller.registerRecent(recent) + + XCTAssertEqual(controller.recents.count, 1) + XCTAssertEqual(controller.recents.first?.url, recent.url) + XCTAssertEqual(recentsStore.savedRecents?.count, 1) + XCTAssertEqual(sessionStore.savedSnapshots.count, 1) + } + private func makeController( store: DocumentRecentsStoring, sessionStore: WorkspaceSessionStoring? = nil, annotationsStore: AnnotationBookmarkStoring? = nil, pipeline: ParsePipeline? = nil, diff --git a/Tests/ISOInspectorKitTests/BoxNodeTests.swift b/Tests/ISOInspectorKitTests/BoxNodeTests.swift index 6ec8695b..b6fe6c3e 100644 --- a/Tests/ISOInspectorKitTests/BoxNodeTests.swift +++ b/Tests/ISOInspectorKitTests/BoxNodeTests.swift @@ -5,12 +5,21 @@ import XCTest final class BoxNodeTests: XCTestCase { func testInitializerCapturesAllComponents() throws { let header = try BoxHeader( - type: FourCharCode("ftyp"), totalSize: 32, headerSize: 16, payloadRange: 16..<32, - range: 0..<32, uuid: nil) + type: FourCharCode("ftyp"), + totalSize: 32, headerSize: 16, + payloadRange: 16..<32, + range: 0..<32, + uuid: nil + ) let metadata = BoxDescriptor( - identifier: .init(type: header.type, extendedType: nil), name: "File Type", - summary: "File type and compatibility", category: "File", specification: "ISO", - version: 1, flags: 0) + identifier: .init(type: header.type, extendedType: nil), + name: "File Type", + summary: "File type and compatibility", + category: "File", + specification: "ISO", + version: 1, + flags: 0 + ) let payload = ParsedBoxPayload(fields: []) let issues = [ValidationIssue(ruleID: "VR-001", message: "Test", severity: .warning)] let child = BoxNode(header: header) diff --git a/Tests/ISOInspectorKitTests/BoxValidatorTests.swift b/Tests/ISOInspectorKitTests/BoxValidatorTests.swift index b554558e..9861e122 100644 --- a/Tests/ISOInspectorKitTests/BoxValidatorTests.swift +++ b/Tests/ISOInspectorKitTests/BoxValidatorTests.swift @@ -470,8 +470,10 @@ final class BoxValidatorTests: XCTestCase { BoxParserRegistry.shared.parse(header: header, reader: reader)) let event = ParseEvent( - kind: .willStartBox(header: header, depth: 0), offset: header.startOffset, - payload: payloadDetail) + kind: .willStartBox(header: header, depth: 0), + offset: header.startOffset, + payload: payloadDetail + ) let validator = BoxValidator() let annotated = validator.annotate(event: event, reader: reader) @@ -490,8 +492,13 @@ final class BoxValidatorTests: XCTestCase { let payloadRange = (offset + headerSize)..<(offset + headerSize + Int64(payloadSize)) let range = offset..<(offset + totalSize) return BoxHeader( - type: fourCC, totalSize: totalSize, headerSize: headerSize, payloadRange: payloadRange, - range: range, uuid: nil) + type: fourCC, + totalSize: totalSize, + headerSize: headerSize, + payloadRange: payloadRange, + range: range, + uuid: nil + ) } private func makeMfhdEvent(sequenceNumber: UInt32, offset: Int64) throws -> ParseEvent { @@ -514,10 +521,17 @@ final class BoxValidatorTests: XCTestCase { ], detail: .movieFragmentHeader( ParsedBoxPayload.MovieFragmentHeaderBox( - version: 0, flags: 0, sequenceNumber: sequenceNumber))) + version: 0, + flags: 0, + sequenceNumber: sequenceNumber + ) + ) + ) return ParseEvent( - kind: .willStartBox(header: header, depth: 0), offset: header.startOffset, - payload: payload) + kind: .willStartBox(header: header, depth: 0), + offset: header.startOffset, + payload: payload + ) } private func makeHeader(type: String, totalSize: Int64, headerSize: Int64, offset: Int64) throws @@ -527,8 +541,13 @@ final class BoxValidatorTests: XCTestCase { let payloadRange = (offset + headerSize)..<(offset + totalSize) let range = offset..<(offset + totalSize) return BoxHeader( - type: fourCC, totalSize: totalSize, headerSize: headerSize, payloadRange: payloadRange, - range: range, uuid: nil) + type: fourCC, + totalSize: totalSize, + headerSize: headerSize, + payloadRange: payloadRange, + range: range, + uuid: nil + ) } private func makeDescriptor(for header: BoxHeader, version: Int?, flags: UInt32?) @@ -536,8 +555,14 @@ final class BoxValidatorTests: XCTestCase { { let identifier = BoxDescriptor.Identifier(type: header.type, extendedType: nil) return BoxDescriptor( - identifier: identifier, name: "Test", summary: "Test descriptor", category: nil, - specification: nil, version: version, flags: flags) + identifier: identifier, + name: "Test", + summary: "Test descriptor", + category: nil, + specification: nil, + version: version, + flags: flags + ) } private func makeStsdBox(entries: [Data]) -> Data { 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: