# Project State ## Project Reference See: .paul/PROJECT.md (updated 2026-05-21) **Core value:** Android devs plot 200Hz+ multi-signal sensor data without frame drops **Current focus:** v0.3.0 iOS build pipeline SHIPPED — 33 tests pass on iOS sim, XCFramework produced ## Current Position Milestone: v0.3.0-ios-build Phase: 6 of 6 — Complete Plan: .paul/phases/v0.3.0-ios-build-plan.md Status: Complete Last activity: 2026-05-21 — iOS pipeline: compile 3 targets, link debug framework, iosSimulatorArm64Test green (33 tests, 0 failures), XCFramework "ChartRealtime" output (ios-arm64 + ios-arm64_x86_64-simulator slices). Android non-regression confirmed. Progress: - v0.1.0 milestone: [██████████] 100% SHIPPED - v0.2.0 milestone: [██████████] 100% SHIPPED - v0.3.0 milestone: [██████████] 100% SHIPPED ## Loop Position ``` PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [v0.3.0 iOS build SHIPPED — v0.5.0-SNAPSHOT] ``` ## Accumulated Context ### Decisions | Decision | Phase | Impact | |----------|-------|--------| | Canvas custom rendering (no lib) | Init | Core architecture | | Render/data decoupled withFrameNanos | Init | RenderLoop design | | TieredBuffer over flat ring | v0.2.0 | O(N×constant) memory, 20+ signals | | MIN_MAX tier binning (not MEAN) | v0.2.0 | Composable, no artifacts at tier boundaries | | MEAN removed from LodMode | v0.2.0 | Cleaner API, no synthetic values | | LodDecimator as class (pre-alloc scratch) | v0.2.0 | Zero GC at render time | | Sensor cap 200Hz (5_000μs) | v0.2.0 | Thermal/battery optimization | | Package dev.dtrentin | v0.2.0 | Personal project, not company | | iOS targets shipped | v0.3.0 | iosX64/iosArm64/iosSimulatorArm64 + Platform.ios.kt | | iOS build pipeline green | v0.3.0 iOS | 33 tests pass on iOS sim, XCFramework "ChartRealtime" produced | | timeIntervalSinceReferenceDate + epoch offset | v0.3.0 iOS | K/Native binding doesn't expose timeIntervalSince1970; use 978_307_200s constant | | applyDefaultHierarchyTemplate() explicit | v0.3.0 iOS | iosMain/iosTest auto-wired across 3 iOS targets | | Manual format helpers in AxisRenderer | v0.3.0 iOS | String.format JVM-only; private formatFixed/formatScientific/pow10 | | kotlin.concurrent.Volatile + kotlin.jvm.JvmName imports | v0.3.0 iOS | Multiplatform replacements for JVM-default annotations | ### Deferred Issues | Issue | Origin | Effort | Revisit | |-------|--------|--------|---------| | ~~Dirty flag render (skip frame if no new data)~~ | v0.2.0 | S | ✓ v0.3.0 | | ~~targetFps=30 default~~ | v0.2.0 | S | ✓ v0.3.0 | | ~~iOS expect/actual beyond currentTimeMs~~ | Init | L | ✓ v0.3.0 | | ~~KDoc on public API surface~~ | v0.2.0 | M | ✓ v0.3.0 | | ~~README with integration example~~ | v0.2.0 | S | ✓ v0.3.0 | | ~~iOS build/test pipeline (compile + iosTest + XCFramework)~~ | v0.3.0 plan | M | ✓ v0.3.0 iOS | | Publish to Maven Central / GitHub Packages | v0.2.0 | M | v0.4.0 | | iOS demo app (SwiftUI) | v0.3.0 iOS | L | v0.4.0 | | CI workflow for iOS build (GitHub Actions) | v0.3.0 iOS | M | v0.4.0 | | Compose compiler unstable warning on SignalConfig | v0.3.0 iOS | S | v0.4.0 | ### Blockers/Concerns None. ## Session Continuity Last session: 2026-05-21 (iOS build pipeline) Stopped at: v0.3.0 iOS shipped. All 5 acceptance items pass (A1-A5). 33 tests green on iOS sim. ChartRealtime.xcframework at chart-realtime/build/XCFrameworks/release/. Next action: Define v0.4.0 scope (Maven Central publish, iOS demo app, CI) Resume context: - Library: chart-realtime, published dev.dtrentin:chart-realtime:0.5.0-SNAPSHOT to mavenLocal - App: AndroidChartsApp consuming library, builds clean - Remote: ssh://git@3nt-git.duckdns.org:222/davide.trentin/KMPCharts.git - Package: dev.dtrentin.chart - iOS: 3 targets compile, link, test (33 tests). XCFramework name `ChartRealtime`, baseName CamelCase. - Local Mac setup: Xcode.app at /Applications/Xcode.app, iOS sim runtime installed (iPhone 17 family), local.properties points to ~/Library/Android/sdk, JDK 21 Temurin via JAVA_HOME. --- *STATE.md — Updated after every significant action*