Completed RTTy dashboard Slice A in the isolated scratch clone; shared timeline and latency fixes pass both builds and the full package suite.
HANDBACK-A — RTTy dashboard Build 523, Slice A only
Completed: 2026-09-24 13:31:30 EDT Host: rdmsm4x. Mode: production
(existing app/data); isolated worker lane for lead
claude@rdmsm4x/c13f617a. Workspace:
/Users/richh/dev/_scratch/rtty-dashboard-523-20260924
Branch: feat/dashboard-one-timeline-523 Base:
b19a69c Result: A1 and A2 implemented and locally
validated. Slice B and Slice C were not started. No push, installation,
signing, release metadata edit, or live-repository integration was
performed.
Commit and exact files
9f2ecb32e1bc7c896d5d206453032cb097c031ef —
feat(dashboard): complete Slice A shared timeline and latency band
Committed by explicit path. Post-commit
git status --short printed no entries. Backup/review patch:
slice-a.patch; the base and result are both retained in
local Git.
FEATURE_MATRIX.md
Sources/LatencyCore/Metrics/LatencyBucketResolutionPolicy.swift
Sources/LatencyCore/Timeline/TimelineViewport.swift
Sources/RTTy/Stores/ObservationStore.swift
Sources/RTTy/Support/RTTyAppearanceTokens.swift
Sources/RTTy/Views/AggregateHistoryView.swift
Sources/RTTy/Views/ApplicationFlowsView.swift
Sources/RTTy/Views/DashboardView.swift
Sources/RTTy/Views/PathHistoryView.swift
Sources/RTTy/Views/SettingsView.swift
Sources/RTTy/Views/TimelineScrubberView.swift
Tests/LatencyCoreTests/BucketCadenceFloorTests.swift
Tests/LatencyCoreTests/ChartContiguityTests.swift
Tests/LatencyCoreTests/StableLatencyBucketSeriesTests.swift
Tests/LatencyCoreTests/TimelineViewportTests.swift
Tests/RTTyTests/ApplicationFlowTimelineZoomTests.swift
Tests/RTTyTests/ApplicationFlowsControlsTests.swift
Tests/RTTyTests/DashboardHistorySamplingTests.swift
Tests/RTTyTests/LatencyBandEdgeTests.swift
Tests/RTTyTests/LatencyBandScaleTests.swift
Tests/RTTyTests/SettingsControlParityTests.swift
Tests/RTTyTests/TimelineScrubberPresentationTests.swift
docs/FEATURE_MATRIX.md
Implemented acceptance
- A1: 30s/1m/2m/5m added ahead of the existing durations; default remains 15m. The twelve requested chips replace the menu. Non-chip durations such as 45m insert once in sorted position. Collected span, mode label, Live action, scrub track and resize handles remain in their existing row/positions.
- Removed the flows-only control, binding, brighter slice and
flowsFractionspresentation member. Removed its independent Settings picker. Store drawing always reports.timeline; legacy enum/settings payload compatibility remains. A saved fixed zoom migrates to the shared persisted duration once, then its old key is removed. New installs remain at 15m; subsequent loads retain the chosen shared duration. - The dashboard passes the same duration and exact end to flows chart and table history; its other band/target paths already consume the viewport. Historical selections are no longer clamped to the flows-only delayed Live edge. Standalone flows retain their prior behavior. Quantum remains window / 60 for flows at every chip duration.
- Short-window latency bucketing now accommodates sparse active/idle measurements. The 30s–2m windows may use exact named 5s/10s quanta and a two-bucket floor, with at least three samples for cadence. The five-minute/menu-bar and longer policy stays unchanged. The existing all-duration contiguity, density identity, finalized bucket, loss classification and menu-bar cadence tests pass.
- A2: the dashboard latency renderer uses visible raw observations for
raw/smoothed traces so a spike cannot disappear into a bucket median.
Its domain is exactly
[0, max(1.25*p95, 2*median, 5)], with linearly interpolated quantiles. The two traces share that domain. Values above it clip and receive a top marker. Existing configured spike detection drives shaded columns; loss remains orange. Raw/trend widths are 1/2 pt using appearance tokens, with stronger raw opacity confined to the main latency band. - Boundary drawing points hold the first/last values at the viewport
start/end. They do not enter quantile calculations or create
observations. Loss and internal continuity breaks remain distinct. Area,
stepped/step-area and bars use the same domain/edge path; heatmap clips
its first/last cells to the same viewport edges. Previously empty
.barsdispatch now calls the existing bar renderer. - Both feature matrices updated and byte-identical. No new files under Sources; no protected paths changed; no prohibited API words introduced under Sources/RTTy. Existing repository references to those words were not removed as unrelated work.
Exact final build and test commands
All commands ran with cwd
/Users/richh/dev/_scratch/rtty-dashboard-523-20260924. Each
final build/test command exited 0. Logs are copied
beside this handback.
CLANG_MODULE_CACHE_PATH=/private/tmp/rtty-a-cache/clang SWIFTPM_MODULECACHE_OVERRIDE=/private/tmp/rtty-a-cache/swiftpm swift build --arch arm64 > /private/tmp/rtty-a-build-final.log 2>&1Output: Build complete! (0.62 sec) Retained output:
slice-a-build-arm64.log.
xcodebuild -project Apps/RTTyStandard/RTTyStandard.xcodeproj -scheme RTTyStandard -destination 'generic/platform=macOS' -derivedDataPath /private/tmp/rtty-a-standard build CODE_SIGNING_ALLOWED=NO > /private/tmp/rtty-a-standard-final.log 2>&1Output: ** BUILD SUCCEEDED ** Retained output:
slice-a-build-standard.log.
/usr/bin/lipo -archs /private/tmp/rtty-a-standard/Build/Products/Debug/RTTy.app/Contents/MacOS/RTTyOutput: x86_64 arm64 (exit 0). This is an unsigned
build, not a signed release gate.
CLANG_MODULE_CACHE_PATH=/private/tmp/rtty-a-cache/clang SWIFTPM_MODULECACHE_OVERRIDE=/private/tmp/rtty-a-cache/swiftpm swift test > /private/tmp/rtty-a-tests-final.log 2>&1Retained output: slice-a-tests.log. Exact target
summaries:
Test Suite 'RTTyTests.xctest' passed at 2026-09-24 13:28:53.893.
Executed 1256 tests, with 8 tests skipped and 0 failures (0 unexpected) in 96.489 (96.583) seconds
Test Suite 'RTTyPrivilegedCaptureTests.xctest' passed at 2026-09-24 13:28:54.254.
Executed 71 tests, with 0 failures (0 unexpected) in 0.268 (0.273) seconds
Test Suite 'LatencyCoreTests.xctest' passed at 2026-09-24 13:29:01.486.
Executed 347 tests, with 0 failures (0 unexpected) in 7.128 (7.153) seconds
Total reported: 1,674 tests, 0 failures, 8 skipped. This exceeds the 1,628 floor. Net new XCTest methods: 13. XCTest summaries include the skips; 1,666 tests were not skipped. Swift Testing separately reports zero tests, so no counts were inferred from that runner.
Required and added suite receipts from the same full run:
Test Suite 'ApplicationFlowTimelineZoomTests' passed at 2026-09-24 13:27:45.298.
Executed 8 tests, with 0 failures (0 unexpected) in 0.073 (0.074) seconds
Test Suite 'ApplicationFlowsControlsTests' passed at 2026-09-24 13:27:45.548.
Executed 5 tests, with 0 failures (0 unexpected) in 0.249 (0.249) seconds
Test Suite 'DashboardFitTests' passed at 2026-09-24 13:28:22.047.
Executed 5 tests, with 0 failures (0 unexpected) in 3.596 (3.597) seconds
Test Suite 'LatencyBandEdgeTests' passed at 2026-09-24 13:28:30.717.
Executed 3 tests, with 0 failures (0 unexpected) in 0.002 (0.002) seconds
Test Suite 'LatencyBandScaleTests' passed at 2026-09-24 13:28:30.718.
Executed 3 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'TimelineScrubberPresentationTests' passed at 2026-09-24 13:28:53.867.
Executed 2 tests, with 0 failures (0 unexpected) in 0.000 (0.001) seconds
Test Suite 'ChartContiguityTests' passed at 2026-09-24 13:28:58.183.
Executed 14 tests, with 0 failures (0 unexpected) in 3.836 (3.837) seconds
Test Suite 'TimelineViewportTests' passed at 2026-09-24 13:29:01.477.
Executed 13 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds
The five DashboardFitTests retain their existing 1440×900 / 1440×1200 / 1150×1500 checks. ApplicationFlowsControlsTests retains all four original cases and adds a fifth measuring the actual shared timeline at every duration (including extra chips) against 856 pt.
Focused regression command (also exit 0; 41 RTTy tests and 22 LatencyCore tests, zero failures):
CLANG_MODULE_CACHE_PATH=/private/tmp/rtty-a-cache/clang SWIFTPM_MODULECACHE_OVERRIDE=/private/tmp/rtty-a-cache/swiftpm swift test --filter 'ChartContiguityTests|BucketCadenceFloorTests|DashboardHistorySamplingTests|DashboardEvidenceSnapshotTests|MenuBarCadenceWindowTests|LatencyBand' > /private/tmp/rtty-a-focused.log 2>&1Retained output: slice-a-focused-tests.log.
git diff --check
cmp FEATURE_MATRIX.md docs/FEATURE_MATRIX.md
git status --shortAll exited 0 with no output after the commit. Scope receipt:
slice-a-scope-audit.txt.
Deviations and reasons
- Renderer named by A2 is not the dashboard renderer at this
base. DashboardView calls
PathHistoryView, notAggregateHistoryView. The fix is applied to that actual call path, retaining hover/inspection and continuity handling. Shared scale/edge types live in the existing AggregateHistoryView file; compact aggregate menu-bar/Settings previews retain their existing scale. No source registrations or pins changed. - The vertical wording conflicts mathematically with its exact formula. For flat 12 ms: p95 = median = 12, so max(15, 24, 5) = 24 ms and the trace sits at 50% height, not the lower third. The exact formula is implemented and asserted; neither this handback nor the test claims lower-third placement. A 200 ms outlier among 99 flat 12 ms observations clips to the 24 ms top and is marked.
- Short cadence support required one additional existing core
file. Adding durations exposed false gaps under the old
12-bucket/9-sample assumptions. Initial fixes also exposed loss being
merged by a 15s quantum and a five-minute regression. These were
resolved with the restricted short-window policy above. Existing tests
were extended/updated to describe the new durations and actual
cadence-aware quantum; they were not deleted.
slice-a-initial-tests.logandslice-a-cadence-tests.logretain the failed intermediate runs; final logs supersede them. - Build environment: the first sandboxed Swift build
could not apply SwiftPM's nested manifest sandbox
(
sandbox-exec: sandbox_apply: Operation not permitted). Authorized builds/tests were then run outside that nested sandbox with dedicated module caches. Standard uses a dedicated/private/tmpDerivedData path, the spec's permitted closest invocation. No protection was disabled.slice-a-initial-build.logretains the subsequent early compiler failure, corrected before the green runs. - Settings control accounting: the removed independent flows picker changes the parity count from 112 to 111 (Look 19 to 18). This is the A1 removal, not a Slice B change. The legacy settings payload field remains compatible and cannot reintroduce a separate drawing window.
What was not verified
- Installed-product visual acceptance, including the actual Space Blue/Light result, remains unverified here; the spec assigns installed capture to the lead and does not require screenshots from this lane. No installed app/data was touched.
- Seven opt-in live network tests were skipped because
RTTY_LIVE_NETWORK_TESTS=1was not set; one data-protection Keychain test skipped because its ad-hoc test binary lacks an application-identifier entitlement. Exact skip lines are inslice-a-tests.log. - No signed/notarized release, Rosetta test run, release QA script, App Store archive, source-pin regeneration, deployment or push was attempted. The required unsigned Standard build contains both architectures.
- The ticket CLI was attempted but could not open its database inside this sandbox. This assignment's scope and ownership are recorded in the local coordination check-in; no ticket completion claim is made. The mandatory preflight also reported historical unacknowledged HIGH traffic; no unrelated messages were claimed or acted on during this explicit isolated slice.
Persistence and rollback
Handback, logs, patch and scope receipt are in
/Users/richh/dev/_handoff/rtty-dashboard-523-20260924-codex.
A per-host changelog is recorded separately with the Notes outcome. Undo
this isolated code change with
git revert 9f2ecb32e1bc7c896d5d206453032cb097c031ef; no
user-data migration, deletion or installed preference mutation was
performed (migration tests use disposable suites). The lead retains
integration/release ownership. Slice B and Slice C remain untouched.