Current Release Position

AreaCurrent state
OE runtimeOE-001 is operating as the current DYY9 release-candidate OE. Health endpoint reports OK; startup audio duration cache reports ready with no errors.
OE networkPPOE operates at 192.168.50.1. PPSM operates at 192.168.50.2.
OE master imageC:\PagePoint\OE-MASTER-071926.img, size 62562238464, SHA256 557E30001B2B1B250C23031BFB0D1EB578704D52AA2C6603EA8B036F6410C68E. The active OE has later release-candidate fixes; recapture before producing final install media.
Operational audioPagePoint Audio Standard V1 is active: 16 kHz, 16-bit, mono Linear PCM WAV. Stored playback is CHIME -> ZONE ID -> MESSAGE. Live paging is CHIME -> LIVE MICROPHONE.
Output mappingCurrent logical-to-ALSA channel map is LPA=0, LPB=1, LPC=6, LPD=7, LPE=2, LPF=3, LPG=4, LPH=5. DYY9 installation uses LPA front-left, LPB front-right, LPC side-left, and LPD side-right.
Time authorityPPSM has the DS3231 RTC on GPIO SDA 21 / SCL 20 via dtoverlay=i2c-rtc-gpio,ds3231,i2c_gpio_sda=21,i2c_gpio_scl=20. Chrony is active and serves local NTP on 192.168.50.2. OE is configured to use PPSM NTP.
PhonesPhone provisioning now sets PagePoint NTP and DYY9 timezone. Current frozen timezone target is America/New_York; future regional deployments should make this a site configuration value.

Faults Discovered and Corrections Made

Fault / discoveryEvidenceCorrectionReasoning
SM showed the OE offline until Diagnostics was tapped. OE status changed to OK only after manual Diagnostics refresh. PPSM now broadcasts refreshed OE health at startup and on each polling interval. The service screen must actively reflect operational reachability without requiring installer interaction.
Isolated network had no reliable time authority. OE, SM, and phones could disagree on time; public NTP is unavailable in normal isolated operation. PPSM now uses RTC plus chrony as the site NTP server. OE points to 192.168.50.2. Use Linux NTP infrastructure rather than inventing a PagePoint time protocol.
Phones could remain on wrong time or timezone after provisioning. One phone remained incorrect after wizard flow until explicit time configuration was added. Provisioning writes ntp_server=192.168.50.2, enables auto-time, disables auto-timezone, and sets America/New_York. Health validation now checks those values. DYY9 requires deterministic local time and correct daylight-saving behavior through the Android timezone database.
Stored-message trigger delay was too long and new stored messages could glitch existing zones. Before fix, trigger-to-pipeline was about 2.5-2.6 seconds. Synchronous ffprobe calls took about 625-655 ms each and ran for chime, zone ID, and message. Built a startup-only duration cache in server.js. playMessage() uses cached durations only and refuses playback if startup validation is not ready. Removing synchronous duration probing from the live command path prevents Node event-loop blocking and mixer starvation while preserving the existing playback architecture.
Stored-message manual startup delay could be tighter after duration-cache fix. Post-cache latency was about 514-542 ms with the old 500 ms intentional delay. Changed only the manual stored-message startup delay from 500 ms to 300 ms. Measured four-zone stacked manual message latency became 312-342 ms, within the 315-345 ms target band, with no large underruns.
Zone live page incorrectly interrupted stored messages on unrelated zones. startLivePage() used a global stopCurrentPlayback(true) path for the first zone live page. Live-page priority now filters interruption scope: same-zone only for zone pages, all zones for All Call/emergency. LIVE PAGE IS KING within its proper scope. Zone isolation must remain intact while All Call remains global.
Stored and live audio competed for the same USB sound card. Stored messages used one 8-channel aplay process and live mic used a second 8-channel aplay process, both targeting surround71:CARD=ICUSBAUDIO7D,DEV=0. ALSA dmix proof-of-concept was not acceptable for live mic quality. RoutedAudioMixer became the single ALSA/aplay owner. audio_receiver.js remains modular but now feeds live PCM into the shared mixer instead of spawning its own aplay. One hardware owner permits stored messages to continue on unrelated zones while a zone live page owns only its target zone.
Live-page chime became glitchy when routed through the live receiver pump. Receiver-pumped chime had clicky/broken playback even when stored-message chimes were clean. Live-page chime is now a normal RoutedAudioMixer file source. Live mic PCM is enabled after the live chime completes. The mixer file path is already suited to complete chime playback; the receiver pump should handle microphone PCM, not file chimes.
Live mic latency/glitch balance needed tuning after single-owner migration. Early shared-mixer live path had high latency or dropouts depending on queue size. Accepted tuning uses a small live start queue and bounded sender/mixer queues while preserving the 100 ms ALSA mixer buffer. Operational reliability and fast handoff matter more than eliminating every tiny underrun. Occasional brief click/pop is acceptable if operation is reliable and quick.
First tap sometimes chimed but did not open the live page line. Failed trace showed route opened after chime, but no sender lock and no first mic frame until a second tap. Server broadcasts state after route-open; phone mic transmit is gated on routeActive=true instead of starting during chime while the route is closed. The phone must not start/stop its mic sender before the OE route is actually ready to receive. Validation showed first-tap SENDER_LOCK and FIRST_MIC_FRAME_ACCEPTED for All Call and zone pages.
Live-page trace logging was useful during diagnosis but too noisy for release operation. Recent first-tap diagnosis added LIVE_TRACE route, sender-lock, first-frame, and receiver-ready logs. LIVE_TRACE output is now gated behind PAGEPOINT_LIVE_TRACE=1 and disabled by default. The trace remains available for focused diagnosis without polluting production logs or changing audio behavior.
Legacy relay/I2C and LPD6803 LED code was still able to run in an audio-only DYY9 OE. DYY9 OE hardware no longer includes XL9535 relay boards or LPD6803 LEDs, and I2C failures can delay startup work. Deprecated the hardware path. Default mode is PAGEPOINT_OUTPUT_MODE=logical and PAGEPOINT_LED_MODE=logical; legacy hardware requires explicit opt-in. Audio timing must never depend on absent relay or LED hardware.
Settings UI work briefly added the wrong entry point. A gear/floating entry changed the main visual hierarchy and affected the logo/status area. Original Settings entry under the status bar was restored. Settings content was reorganized internally into ROLE, TRAFFIC CONTROL, SEQUENCE BUILDER, FIND PHONES, and confirmed ALL CANCEL subflows. Main screen is for operation; Settings is for configuration. Do not redesign working entry points during an internal modal reorganization.

Accepted Operational Rules

Validation Evidence

Known Follow-Up Items