> lapin-fute@1.2.4 build> node scripts/build.mjs✔ fixture is attributed and contains neither credentials nor personal responses (0.668432ms)✔ opaque IDs use stable full SHA-256 identities and distinguish opposite directions (0.655448ms)✔ import covers five modes, gates perimeter and unsupported modes, preserves homonyms, and uses rail terminals (49.891001ms)✔ bus services use their actual terminal to distinguish partial trips with the same headsign (30.106565ms)✔ GTFS quay and monomodal stops join SIRI perimeter namespaces without rewriting routing references (28.676115ms)✔ rail queries retain exact same-line child provenance without querying the child quay (54.60883ms)✔ ambiguous final selectors exclude both GTFS directions without rebinding existing services (62.106347ms)✔ perimeter descriptions are optional without losing services or weakening exact routing (70.248341ms)✔ parent-only relations retain valid routes without inventing stop associations (119.145359ms)✔ import normalizes valid colors and rejects invalid or missing authoritative colors (12.949541ms)✔ activation publishes a usable catalog when candidate and directory stat devices differ (42.134008ms)✔ activation reports EXDEV and preserves the active catalog while cleaning candidate sidecars (63.622266ms)✔ activation preserves stable services, removes stale IDs, and failed replacement leaves the active file untouched (87.498058ms)✔ restricted source download streams bytes and puts its token only in Authorization (16.937873ms)✔ ordered journey groups preserve variants, restrictions, exact terminals and proven aliases without changing old services (55.313751ms)✔ drop_off_type admits absent and empty values but rejects non-GTFS restriction codes (46.062989ms)✔ streaming CSV admits optional fields while enforcing complete source row counts (161.717509ms)✔ search is accent tolerant, punctuation safe, and bounded by Unicode code points (15.398429ms)✔ search preserves homonyms and applies deterministic ranking before the 20-row bound (48.459549ms)✔ search deduplicates destinations by native line and keeps equal labels and homonymous modes (19.972298ms)✔ search rejects conflicting display metadata for one native line (10.967217ms)✔ service options return every valid direction without applying the place-search bound (80.844723ms)✔ reload preserves stable IDs, distinguishes directions, rejects invalid candidates, and removes stale services (31.574225ms)✔ candidate validation rejects incomplete FTS coverage (14.134992ms)✔ candidate validation rejects non-normalized presentation colors (10.122334ms)✔ reader rejects incomplete journey bindings and malformed linked pattern rows (60.915085ms)✔ validated catalog publication preserves all modes, stable service identity and exact legacy lookup (71.829423ms)✔ search publication keeps every native line in natural order and refreshes display metadata by revision (52.646063ms)✔ new publication removes a stale service only for new sessions and keeps open sessions on their revision (71.483916ms)✔ publisher splits search and busy-place pages by decoded bytes without dropping bus rows or long routing (846.361192ms)✔ failed oversized publication preserves the previous manifest and its immutable catalog (49.235713ms)✔ publication exposes only dataset attribution, never operator credentials or signed download URLs (34.321952ms)✔ search bucket addressing uses Unicode codepoints rather than UTF-16 units (0.063529ms)✔ journey publication writes every annex and bounded paginated groups load from published bytes (46.361699ms)✔ journey-only order and restriction changes move the revision while service payloads stay unchanged (69.103606ms)✔ invalid journey content fails validation and preserves the previous manifest and revision (232.436802ms)✔ journey requests pin revision and admit only the complete group without retaining it (2.36447ms)✔ invalid or mismatched annexes do not start a group lookup (0.443831ms)✔ missing intermediate pages, bad counts, revisions and duplicate rows fail closed without retries (0.677289ms)✔ raw document and cumulative group budgets include whitespace and the index (17.086502ms)✔ shared group flights survive one cancellation but abort when the last subscriber cancels (0.484708ms)✔ deadline keeps valid annex, explicit cancellation suppresses callback, and neither retries (0.156042ms)✔ the revision is part of the group flight identity (0.237204ms)✔ service lookup remains compatible and transport construction failure settles once (0.226464ms)✔ Core Android decoded close responses preserve favorites with line colors (2.23074ms)✔ an explicit choice matching the system persists without a sync and returning to Automatic follows fresh locales (3.266239ms)✔ language-only saves send rehashed appearance records through DIFF without changing favorites or fetching (1.28106ms)✔ cancelled, invalid and unpersisted language saves leave the prior configuration active (0.462026ms)✔ ready coalesces and an early APP_OPEN waits for the sent COMMIT's transport completion (3.492814ms)✔ SDK readiness bypasses D2 normalization and a queued echo survives a failed application send (0.339907ms)✔ production PRIM GETs are once per service, traffic is coalesced, and D2 carries no routing or credential (3.193292ms)✔ ordinary warm refresh preserves the old snapshot until the complete fresh aggregate is ready (0.996878ms)✔ every refresh trigger observes the strict sixty-second departure gate despite old UNKNOWN traffic (1.22256ms)✔ refresh-all skips fresh services, preserves failed snapshot age, and fills missing rows (2.125652ms)✔ overview and detail CACHE_ONLY finish misses and stale hits without PRIM or a refreshing echo (0.854401ms)✔ complete cached results are stale only before the fifteen-minute useful boundary (0.79543ms)✔ 429 is terminal for one event, preserves useful stale data, and increments only a safe counter (0.814165ms)✔ the failure table deterministically projects unconfigured, stale, or unavailable (4.094211ms)✔ an opening overview completes after cache-only detail entry and local Back (0.681928ms)✔ slow ACKs preserve every accepted token even when later data bytes are identical (0.61394ms)✔ bounded overflow retains latest demand per kind after four accepted slow requests (1.601431ms)✔ warm refresh keeps loading feedback for usable and missing rows until terminal outcomes (1.160935ms)✔ credential lifecycle cancellation prevents old network completion from reaching the watch (0.642684ms)✔ joined overview fetches only uncovered services and completes both original tokens (0.727142ms)✔ superseded settled selections get terminal data without launching obsolete service fetches (0.719698ms)✔ saved preferences and Automatic use separate traffic caches without refetching a fresh language (5.240268ms)✔ an English override keeps in-flight French fallback and both language caches bound through restart (2.395568ms)✔ order-only settings preserve active fetches and cache, with zero favorite bodies (0.953256ms)✔ explicit FULL is one-shot, sends complete inventory, and is not persisted (0.369873ms)✔ unresolved routing uses a pinned public revision once per service without metadata resynchronization (1.080164ms)✔ obsolete routing preserves valid favorite/key data, rehydrates exactly, and never renders an old cache format (0.995916ms)✔ routing recovery keeps invalid-key journal authority and rejects unrelated corruption (0.580227ms)✔ failed routing persistence retains durable bytes and refuses unpersisted departure bindings (0.461134ms)✔ oversized hydrated routing cannot create an unpersisted departure binding (1.604256ms)✔ unresolved service IDs remain editable and canceled catalog lookups cannot launch PRIM (0.626514ms)✔ a stalled catalog lookup terminates as INVALID_SERVICE without PRIM or polling (0.503203ms)✔ stopping a six-favorite refresh cancels all pending PRIM work (1.155525ms)✔ catalog revision mismatch cannot hydrate favorites or send credentials to the static host (0.872715ms)✔ authentication rejection invalidates credentials durably, cancels network, and completes accepted tokens (1.086145ms)✔ the invalid-key journal blocks restart even when the primary configuration write fails (1.090794ms)✔ marker-only invalidation cannot apply an unpersisted replacement's favorites or language (0.833892ms)✔ credential replacement ignores saved callbacks from the canceled lifecycle (0.494196ms)✔ credential removal erases the key, retains favorites, and blocks PRIM until replacement (0.520616ms)✔ interrupted same-key replacement never clears durable invalid-key authority (1.164832ms)✔ malformed traffic gets a final error token without cache writes or retries (0.355305ms)✔ traffic failure keeps useful departures with unobserved UNKNOWN summaries (0.571661ms)✔ failed traffic refresh keeps the old detail cache and original checked time (0.824124ms)✔ cache persistence failure keeps fresh data usable in this phone session (0.719497ms)✔ slow ACK FIFO keeps a started transfer atomic and completes subsequent cache-only tokens (0.850954ms)✔ favorite removal prunes departure and traffic cache across restart (0.805809ms)✔ foreign cache formats fail closed and credential echoes cannot replace durable cache bytes (0.108653ms)✔ generated bootstrap starts the real companion and answers SDK readiness without a timing gate (2.128928ms)✔ journey flights migrate a single null arrival through real annexes before PRIM and preserve labels (1.635334ms)✔ journey flights retain unresolved arrival when persistence fails and never call departures (1.434307ms)✔ journey flights distinguish unavailable groups from unreachable arrivals for every mode (4.254431ms)✔ journey flights keep distinct arrivals independent while exact duplicate journeys share work (0.648315ms)✔ journey flights reject fresh detail cache and late results after an arrival-only edit (0.546694ms)✔ journey flights ignore late annex callbacks after an arrival-only edit (0.302998ms)✔ journey flights cover joined demand by arrival and reuse only line traffic (0.767137ms)✔ journey flights skip static loading for fresh cache and reject mismatched detail cache (0.655228ms)✔ both supported phone records migrate once to Automatic without losing favorites or credentials (1.757352ms)✔ storage never treats malformed or missing v2 arrivals as a legacy omission (0.253835ms)✔ routing recovery does not erase an explicit arrival and rejects unrelated corruption (0.169638ms)✔ migration readback failure restores either old format and exposes no writable configuration (0.234329ms)✔ a durable invalid-key marker remains authoritative across legacy migration (0.515726ms)✔ v2 page envelopes preserve arrivals while a legacy empty close can never clear favorites (0.247183ms)✔ stored language preferences survive restoration while malformed values never become Automatic (0.638145ms)✔ legacy saves preserve an override, explicit Automatic removes it, and invalid preferences reject the entire update (0.317635ms)✔ Automatic retains French normalization and English fallback without consulting the watch for overrides (0.269946ms)✔ cache keeps distinct arrivals of one service and discards only the rebound overview (1.396526ms)✔ merging requires captured bindings and refuses old arrivals even when labels are unchanged (0.258754ms)✔ unresolved bindings admit errors and traffic but never departure snapshots (0.194214ms)✔ v3 cache requires own valid bindings and scans arrival identities for secrets (1.27604ms)✔ old result caches lose departures and traffic without changing configuration or credentials (0.331582ms)✔ departures issue only the fixed PRIM GET and deliver a binding-free snapshot asynchronously (2.464978ms)✔ client executes byte decoding and both parsers without modern runtime collections or codecs (6.098966ms)✔ synchronous XHR completion or construction failure still settles later and only once (0.458409ms)✔ abort is final before completion and between completion and deferred delivery (1.171805ms)✔ watchdog timeout and pypkjs event-only network failure produce one safe error (0.237244ms)✔ HTTP authentication and quota failures retain semantic codes and bounded Retry-After (0.816339ms)✔ missing routing and malformed keys never start transport and remain abortable (0.119844ms)✔ routing is copied at dispatch and credentials cannot be embedded in request URLs (0.450774ms)✔ missing or malformed departure contexts reject before HTTP; unavailable patterns retain uncertain times (0.447698ms)✔ malformed SIRI evidence maps to INVALID_RESPONSE instead of an arbitrary journey (0.240921ms)✔ malformed UTF-8, missing byte responses and oversized bodies never enter normalized output (0.629019ms)✔ a BOM and a byte-exact maximum response remain valid (8.19308ms)✔ only traffic accepts a valid two MiB body and rejects one byte beyond its own cap (70.402409ms)✔ traffic calls coalesce across lines but not languages or credentials (0.623047ms)✔ coalesced cancellation preserves the remaining subscriber and cancels the final one (0.332613ms)✔ traffic cache reevaluates periods, retains checkedAt, expires at exactly 60 seconds and rejects clock rollback (0.323496ms)✔ credential changes never reuse another key's traffic cache and callbacks cannot mutate cached text (0.312245ms)✔ English complete text needs one request and missing either field uses the same French incident pair (0.841146ms)✔ fallback shares a French flight across lines and direct French readers then reuses both fresh caches (0.389349ms)✔ cancellation moves with fallback, preserves other readers and suppresses late completions (0.450484ms)✔ French fallback cannot replace a missing, inactive or incomplete matching incident with another one (2.043869ms)✔ English failures never fetch French and fallback failures propagate without retries (0.398457ms)✔ fallback never serves an English envelope that expires while French is pending (0.512189ms)✔ fallback stays inside the shared eight-slot limiter and cancelled queued fallback never starts (0.413875ms)✔ fallback refreshes expired French data and never borrows another credential's French cache (0.847869ms)✔ transport errors and malformed traffic are unavailable, not successful UNKNOWN, and are not cached (0.368371ms)✔ eight shared transport slots bound departures and traffic without starting cancelled queued work (0.215484ms)✔ aborting a lifecycle batch never starts its queued bulk request (0.188613ms)✔ no request retries or polling occur after success or failure (0.316703ms)✔ all five recorded modes preserve source times, freshness and confirmed intervals in ES5 (5.293688ms)✔ delay, cancellation, expected then aimed, and mixed freshness remain independent of journey evidence (0.685664ms)✔ common arrivals combine full and partial chronologically; beyond partial excludes only proven partials (0.247243ms)✔ unknown short names and absent terminal hints prove only universally compatible journeys (0.245981ms)✔ reduced 255 south and north contradictions confirm only shared arrivals and honor proven Q aliases (0.346359ms)✔ express, loops, order and boarding restrictions cannot be confirmed by one favorable occurrence (0.312435ms)✔ SP opposite directions and a different Q quay never become equivalent by place (0.213439ms)✔ four total entries prioritize confirmation, preserve ties and never synthesize missing visits (0.41618ms)✔ every supported SIRI evidence field accepts strings, value objects and flat arrays without coercion (0.748272ms)✔ resolved arrival context is mandatory; unavailable patterns keep actual uncertain times and statuses (0.533089ms)✔ foreign line and monitoring visits do not contaminate source freshness (0.152195ms)✔ explicit offsets and strict source dates remain independent of local timezone (0.409066ms)✔ traffic distinguishes observed normal, useful disruption and source uncertainty (2.380339ms)✔ lines omitted from the disruption-only bulk feed have normal traffic (0.178524ms)✔ the latest active update wins even over a more severe incident (0.360956ms)✔ dated incidents outrank undated ones and equal dates use ID rather than input order (0.256741ms)✔ future works stay ignored while active works participate in the selection (0.193372ms)✔ active works interruption tracks the synthetic September window, inclusive at 08:00 and gone at noon (0.420217ms)✔ an active disruption without complete details remains UNKNOWN (0.119264ms)✔ Paris periods are inclusive at start and exclusive at end, including summer time (0.419406ms)✔ generated Paris time covers epoch bounds and exact DST gaps and overlaps without device Intl (1.010082ms)✔ generated Paris offsets agree with build-time ICU across the entire epoch range (11.503472ms)✔ portable traffic text strips markup and secrets and truncates only at Unicode codepoint boundaries (1.447842ms)✔ traffic redacts entity-decoded and URI-encoded credentials before returning readable text (0.868196ms)✔ malformed traffic joins, periods, duplicates and severities reject rather than become normal traffic (1.299144ms)✔ empty half-open traffic periods stay inactive without discarding other source information (1.159522ms)✔ a bulk body containing empty periods succeeds through the production client (1.021454ms)✔ 256 daily periods keep the blocking incident usable with only the current day active (1.061238ms)✔ 257 periods exceed the payload bound and reject the whole body (0.276578ms)✔ a bulk body with a 256-period notice still succeeds through the production client (1.89533ms)✔ reversed or invalid traffic periods still reject instead of becoming empty or invented ranges (0.161342ms)✔ strict watch decoder admits overview CACHE_ONLY but rejects retired and mismatched envelopes (0.89134ms)✔ lazy configuration waits for correlated NEED and COMMIT ACK before exposing the binding (1.516982ms)✔ FULL sends complete inventory and requires every body bit; reorder DIFF sends no bodies (1.385996ms)✔ HELLO correlation, epoch floor and profile changes guard configuration preparation (0.445565ms)✔ superseded sync ignores stale NEED and late transport failure without resetting c-sequence (0.522018ms)✔ phone enrichment updates only matching lifecycle bindings without changing watch metadata (0.773098ms)✔ Unicode appearance and traffic continuation strings cross D2 without clipping source data (0.918261ms)✔ queue is lazy, bounded, atomic and yields after each ACK including final completion (0.187892ms)✔ an unattempted SDK echo survives failed D2 work, but the echo itself is never retried (0.159068ms)✔ clear waits for the physical flight and stale callbacks cannot corrupt its replacement (3.315131ms)✔ cancellation retires old deferred work and synchronous transport throws fail once (0.281778ms)✔ static search scans every page, keeps the best twenty and preserves homonyms (11.792383ms)✔ search rows carry precomputed lines without extra requests and reject malformed metadata (2.591324ms)✔ equally relevant stops put rail modes before tram and bus (0.367669ms)✔ static search uses AND token prefixes, Unicode normalization and one-codepoint buckets (0.612047ms)✔ search ignores French join words absent from an official stop label (0.314018ms)✔ missing initial search bucket is empty but a missing continuation is unavailable (0.441216ms)✔ search refuses revision changes and noncontiguous continuations (0.402113ms)✔ service pages and exact service lookups keep unbounded authoritative routing on one revision (0.894646ms)✔ service lookup rejects unsafe paths, wrong identities and credential-shaped routing (0.399479ms)✔ service pages reject missing continuations and cross-place content (0.454942ms)✔ debouncing cancels superseded requests before they reach the static host (0.291696ms)✔ canceling an active search aborts its fetch and prevents later pages even if fetch ignores abort (4.647037ms)✔ decoded response bounds stop a stream instead of buffering the remainder (0.64077ms)✔ lookupJourney assembles a real multi-page group on one pinned revision (68.282317ms)✔ concurrent services of one group share one flight and one assembled group (52.070444ms)✔ lookups for different groups run separate flights (51.827949ms)✔ aborting one subscriber leaves the shared group load intact (48.099084ms)✔ aborting the last subscriber cancels the load and a later lookup starts fresh (48.595454ms)✔ group admission failures keep the service and never yield a partial group (50.297873ms)✔ group line and mode must match the service annex even when group identities match (49.383992ms)✔ annex failures return null without any group transfer (43.841026ms)✔ annex routing must exactly match every requested routing field (43.738885ms)✔ raw group budget includes whitespace in the index as well as pages (21.523735ms)✔ mirrored constants equal the canonical contract (0.633156ms)✔ french language tags select french copy and everything else falls back to english (0.412002ms)✔ authored and transport labels never appear in product copy (0.097423ms)✔ a complete v2 opening opens an editable session and validates favorites (0.515606ms)✔ legacy and unversioned openings are decoded read-only for display only (0.28824ms)✔ absent or malformed openings are non-editable empty sessions (0.44304ms)✔ minimal favorites round trip without inventing presentation properties and partial groups reject (0.369101ms)✔ the config page consumes the companion-produced opening fragment exactly (0.441567ms)✔ an advertised languagePreference enables a strict selector round trip (0.440094ms)✔ an unadvertised launch keeps the selector inert and the close payload free of the preference (0.376776ms)✔ an invalid present languagePreference rejects the whole opening without coercion (0.161252ms)✔ explicit choices stay distinct from automatic across a full save and reopen (0.688249ms)✔ a planted key field never enters page state or the payload (0.097813ms)✔ key lifecycle plans KEEP, REPLACE, and REMOVE through pure state (0.293099ms)✔ replace validation rejects oversized or control-bearing keys in both locales (0.158547ms)✔ read-only sessions never mutate, save, or hydrate regardless of the DOM (0.281688ms)✔ favorite edits replace the whole list atomically with renumbered order (0.761116ms)✔ malformed whole favorite lists stay read-only and cannot be normalized into a save (0.273863ms)✔ the seventh favorite is rejected by the add path while a valid six save whole (0.525495ms)✔ the close fragment carries the key value only for REPLACE and is one-shot (0.216977ms)✔ three backend services can be added, renamed, reordered, and removed atomically (0.305763ms)✔ catalog response guards reject identifiers and malformed or oversized collections (0.276178ms)✔ journey places validate the catalog place identity shape exactly (0.073457ms)✔ service routing validates exactly and only phone favorites may carry it (0.086652ms)✔ favorites created from catalog services carry a fresh routing copy and the chosen arrival (0.26129ms)✔ routing and arrivals survive the full page round trip and phone-side validation (0.496159ms)✔ force full synchronization is an explicit one-shot close flag (0.23506ms)✔ unresolved favorites hydrate in place or wait for explicit re-selection (0.269505ms)✔ encoded close and opening fragments enforce the 32768 bound at producers (0.866724ms)✔ favorite preview uses the credential-free recorded departure fixture (0.135534ms)✔ page keeps secrets out of durable and observable surfaces (0.527057ms)✔ bilingual About copy exposes the required legal, privacy, attribution, and safe-link facts (0.284573ms)✔ official rail badges cover every RER and Transilien line (0.181961ms)✔ favorites without presentation fields resolve no official image and use an accessible neutral fallback (0.136606ms)✔ search result labels use the available row width and wrap line badges (0.22427ms)✔ mirrored place search validation matches the canonical lines contract (0.327854ms)✔ the first-load gzip metric includes the eagerly imported badge resolver (0.115145ms)config page ready: /tmp/lapin-fute-config-site-aq06hx/output (existing hosted catalog left unchanged)config site ready: /tmp/lapin-fute-config-site-O2Fish/output (catalog revision in catalog/manifest.json)✔ page-only configuration build neither requires nor publishes a catalog (13.324163ms)✔ full configuration build still requires and copies a published catalog (1.464404ms)✔ catalog upload planning compares source revisions instead of volatile publication revisions (1.097416ms)✔ configuration-site verification checks every local and served file on the current catalog revision (5.162502ms)fatal: path 'CHANGELOG.md' does not exist in 'af9e17ca60621b3df272bc4fccf1ee706513985d'✔ release body keeps the whole section and excludes adjacent releases and the heading (1.055718ms)✔ adjacent releases stay isolated regardless of heading position (0.245961ms)✔ exact bracket match does not confuse similar versions (0.138941ms)✔ fenced code examples can neither duplicate nor truncate a section (0.117019ms)✔ a fenced heading before any real section is not a section (0.062176ms)✔ tilde fences and CRLF line endings are handled like backtick fences (0.054582ms)✔ missing, empty, and duplicate sections are rejected (0.312675ms)✔ a duplicate section is rejected even when separated by another release (0.077135ms)✔ release notes come from the tagged changelog, never the working copy (18.383782ms)✔ a changelog committed after the tag cannot leak into the tagged release (14.324517ms)✔ releases reject non-stable tags and repositories without a tagged changelog (8.123108ms)✔ CJS: full and short services prove the common arrival, not the full arrival (1.666372ms)✔ CJS: unknown or absent hints use every exact-boarding candidate (0.773329ms)✔ CJS: terminal aliases do not prove intermediate express stops or loop occurrences (0.463268ms)✔ CJS: pickup and drop-off restrictions remain conditional or impossible (0.572322ms)✔ CJS: proven equivalents and whole normalized labels preserve ambiguous evidence (0.2936ms)✔ CJS: group admission rejects missing pages, foreign links and ambiguous structure (0.670806ms)✔ CJS: exact budgets and IDs admit boundaries without truncation (10.122615ms)✔ CJS: overlapping terminal aliases remain ambiguous and unmapped arrivals stay selectable (0.161983ms)✔ CJS: arrival display truncates scalars and journey identity keeps arrivals distinct (0.21346ms)✔ browser ESM: full and short services prove the common arrival, not the full arrival (0.934561ms)✔ browser ESM: unknown or absent hints use every exact-boarding candidate (0.231684ms)✔ browser ESM: terminal aliases do not prove intermediate express stops or loop occurrences (0.897341ms)✔ browser ESM: pickup and drop-off restrictions remain conditional or impossible (0.505637ms)✔ browser ESM: proven equivalents and whole normalized labels preserve ambiguous evidence (0.110377ms)✔ browser ESM: group admission rejects missing pages, foreign links and ambiguous structure (0.569637ms)✔ browser ESM: exact budgets and IDs admit boundaries without truncation (9.408958ms)✔ browser ESM: overlapping terminal aliases remain ambiguous and unmapped arrivals stay selectable (0.102732ms)✔ browser ESM: arrival display truncates scalars and journey identity keeps arrivals distinct (0.239509ms)✔ browser and canonical helpers produce identical admitted groups and decisions (0.503293ms)▶ local checksum, identity and tag validation fails before authentication ✔ wrong checksum (4.515109ms) ✔ wrong UUID (3.589315ms) ✔ wrong archive version (2.264051ms) ✔ prerelease tag (0.481853ms)✔ local checksum, identity and tag validation fails before authentication (11.41699ms)▶ archive targets, duplicate metadata and oversized JSON fail before authentication ✔ missing target (2.16743ms) ✔ duplicate metadata (1.358405ms) ✔ oversized metadata (4.275611ms)✔ archive targets, duplicate metadata and oversized JSON fail before authentication (8.204291ms)✔ ambiguous checksum records fail before authentication (1.102736ms)✔ an authenticated account without the exact app mapping cannot upload (11.939569ms)✔ ownership lookup rejects conflicting UUID keys after normalization (2.851813ms)▶ either hardware's published version blocks equal or older candidates ✔ equal Emery (1.567116ms) ✔ newer Gabbro (2.090537ms)✔ either hardware's published version blocks equal or older candidates (3.915526ms)✔ publication uploads the exact checked bytes and notes once, even if the file changes after validation (2.457985ms)▶ remote failure, redirect and malformed data never expose remote content or retry ✔ revoked session (1.404411ms) ✔ invalid token (1.591502ms) ✔ malformed JSON (1.454154ms) ✔ oversized JSON (2.829842ms) ✔ redirect (2.301663ms) ✔ wrong public identity (1.195991ms) ✔ unknown published version (1.340111ms) ✔ upload HTTP error (1.291911ms) ✔ uncertain upload timeout (1.322598ms)✔ remote failure, redirect and malformed data never expose remote content or retry (15.465965ms)✔ domain contracts expose every frozen enum and accept every field (0.97692ms)✔ domain validators enforce exact fields, versions, bounds, and secret rules (0.62958ms)✔ phone routing stays exact and separate from the canonical favorite (0.460884ms)✔ six favorites are accepted uniformly without relaxing required domain fields (0.357881ms)✔ D2 appearance hashes canonical UTF-8 bytes in both directions and counts scalar fields (3.564889ms)✔ appearance clip endpoints preserve supplementary glyph boundaries and fit native widths (0.926747ms)✔ D2 retains explicit non-contiguous application IDs without SDK or domain aliases (0.099256ms)✔ dictionary sizing follows Pebble's measured-data formula (0.095469ms)✔ D2 separates watch epochs, data counters, configuration generations and correlation tokens (0.371756ms)✔ configuration dictionaries require the c-generation and exact six-slot inventory bounds (0.791163ms)✔ data request admission distinguishes user detail, overview and cache-only triggers (0.445465ms)✔ catalog contracts freeze transport modes, error codes, and limits (0.070653ms)✔ place lines require complete display metadata within the existing label and color bounds (0.436708ms)✔ catalog validators require phone routing and keep place search display-only (0.464921ms)✔ overview contracts preserve request order and isolate per-favorite failures (0.369662ms)✔ traffic detail contracts enforce discriminants, UTF-8 bounds, and plain text (0.46975ms)✔ packed result dictionaries enforce kind-specific counts and favorite binding (0.755646ms)✔ traffic fragment validation allows continuations but keeps error and UTF-8 bounds strict (0.197149ms)✔ phone traffic preparation preserves palette, scalar sections and LF wrapping without padding fragments (2.621662ms)✔ traffic wrapping converts allowed source tabs without emitting packed controls (0.152245ms)✔ traffic wrapping distinguishes an empty section from explicit trailing blank lines (0.081422ms)✔ prepared updating headers fit both fresh and stale native fonts (0.689031ms)✔ overview countdown terminal labels fit full and compact native slots without shortening detail copy (0.463418ms)✔ secondary departure status labels fit native detail columns while primary copy stays complete (0.359523ms)✔ uncertain journey legend and secondary labels fit their native slots (0.95009ms)✔ real PRIM normalization crosses D2 warm overview, detail and traffic boundaries (17.394619ms)✔ changed six-favorite metadata finishes overview5 and detail5 without PRIM (9.715251ms)✔ phone restart and reorder retain six metadata records without another APP_OPEN (9.404389ms)✔ cache-only miss stays terminal while an independent overview flight completes (2.049259ms)✔ production entry profile 0: writable handshake, consultation and sole Back owner (27.851249ms)✔ production entry profile 1: writable handshake, consultation and sole Back owner (16.71695ms)✔ production entry rejects an unknown profile before opening transport (0.724968ms)✔ appearance records round trip and validate (3.258074ms)✔ displayHash pins scalar semantics across profiles and languages (0.931956ms)✔ clipped honours scalar endpoints and the ellipsis mask (1.032324ms)✔ prepared appearances prefix metro and tram labels consistently (7.055759ms)✔ prepared appearances contract metro bis lines without clipping (3.801132ms)✔ departure records validate bounds and pairing (0.185217ms)✔ departure status and uncertainty survive packing independently without record growth (3.760124ms)✔ traffic documents validate section counts and bounds (16.070198ms)✔ packed primitives count scalars, not UTF-16 units (0.426178ms)✔ traffic outcome union keeps prior documents on scoped errors (17.849802ms)✔ credential errors survive data retention and outrank other loading (2.477141ms)✔ epoch guards publish only on complete validated commits (2.697133ms)✔ restored metadata rejects unsolicited old epochs and recovers via READY (5.870989ms)✔ FULL clears metadata only after a durable marker and cannot restore interrupted data (9.347803ms)✔ obsolete work is cancelled without becoming the new favorite's failure (1.074253ms)✔ rapid detail navigation settles once on the final favorite after 500 ms (3.409998ms)✔ fifty refresh and rapid-navigation cycles keep durable and timer state bounded (8.800948ms)✔ enqueue failures belong to the attempted request, never unrelated sync (2.280072ms)✔ fresh traffic renders fresh despite missing or older departures (5.071582ms)✔ deleting the active traffic favorite falls back to the first detail (2.134729ms)✔ malformed cancellation needs full id, generation, kind and epoch (1.915479ms)✔ changed DIFF releases result owners only at the complete inventory boundary (9.066916ms)✔ malformed guards, no-ops and reorders keep warm results (10.410103ms)✔ released DIFF aborts end the loader and keep manual recovery (11.701192ms)✔ explicit manual retry rekeys after an aborted released sync (7.08844ms)✔ changed-DIFF recovery respects the final request ids without automatic rekeys (9.466796ms)✔ unrelated failed overview enqueue keeps a relevant manual detail intent (3.186761ms)✔ inventory entries release exactly when last used (5.233786ms)✔ zero-need commits release inventory arrays and preserve identity (3.043843ms)✔ inventory body guards reject duplicate, late and unrequested bodies (33.139397ms)✔ wire validation rejects malformed frames before any state changes (0.143939ms)✔ epoch allocation is durable, monotonic and fails closed (9.482876ms)✔ DIFF persistence faults preserve the committed configuration (20.317254ms)✔ pending marker faults stay before the destructive seam (3.65584ms)✔ load rejects foreign, epochless and corrupt storage as unconfigured (0.617838ms)✔ foreign manifests cannot reset epochs or create epochless pending writes (2.472602ms)✔ epoch grammar and request ids (0.090009ms)✔ profile 0 en: changed DIFF loading ends on abort and final cache miss (6.064111ms)✔ profile 0 fr: changed DIFF loading ends on abort and final cache miss (0.825867ms)✔ profile 1 en: changed DIFF loading ends on abort and final cache miss (2.25233ms)✔ profile 1 fr: changed DIFF loading ends on abort and final cache miss (0.798907ms)✔ profile 0: traffic pages preserve sections and scoped errors (2.767575ms)✔ profile 1: traffic pages preserve sections and scoped errors (0.64577ms)✔ profile 0: detail emphasizes the destination and aligns the primary countdown (0.492112ms)✔ profile 1: detail emphasizes the destination and aligns the primary countdown (0.654336ms)✔ rectangular overview fills the first three rows (0.751388ms)✔ retained credential failures outrank traffic loading until matching success (1.078852ms)✔ profile 0 en: uncertain detail keeps times, statuses and overview fallback (0.737031ms)✔ profile 0 en: mixed groups label uncertainty once without sorting times (0.769561ms)✔ profile 0 fr: uncertain detail keeps times, statuses and overview fallback (0.545532ms)✔ profile 0 fr: mixed groups label uncertainty once without sorting times (0.616355ms)✔ profile 1 en: uncertain detail keeps times, statuses and overview fallback (0.450394ms)✔ profile 1 en: mixed groups label uncertainty once without sorting times (0.606016ms)✔ profile 1 fr: uncertain detail keeps times, statuses and overview fallback (0.657912ms)✔ profile 1 fr: mixed groups label uncertainty once without sorting times (0.402684ms)✔ Gabbro ignores an uncertain fourth departure outside the visible detail (0.357299ms)ℹ tests 393ℹ suites 0ℹ pass 393ℹ fail 0ℹ cancelled 0ℹ skipped 0ℹ todo 0ℹ duration_ms 4903.483702{ "scope": "Host D2 tuple sizing and modeled exchanges; not observed native delivery or lifecycle evidence", "domainSchemaVersion": 1, "displayWireVersion": 3, "favoriteLimit": 6, "appMessageKeys": { "SCHEMA_VERSION": 0, "MESSAGE_TYPE": 1, "REQUEST_ID": 2, "FAVORITE_ID": 3, "KEY_STATUS": 10, "ITEM_COUNT": 11, "ITEM_INDEX": 12, "REQUEST_TRIGGER": 24, "CONFIG_NEED_MASK": 35, "CONFIG_MODE": 36, "LANGUAGE": 37, "DISPLAY_RECORD": 38, "DISPLAY_PROFILE": 39, "DISPLAY_KIND": 40, "DISPLAY_GENERATION": 41, "CLOCK_12H": 42, "DISPLAY_HASH": 43, "WATCH_SESSION_ID": 44, "DISPLAY_EPOCH": 45 }, "capacities": { "inboxBytes": 768, "outboxBytes": 192, "queueCapacity": 4 }, "maximumPhoneDictionaryBytesBound": 736, "maximumWatchDictionaryBytesBound": 149, "maximumDictionaryBytesBoundByType": { "REQUEST": 149, "CONFIG_BEGIN": 120, "FAVORITE": 507, "CONFIG_COMMIT": 66, "OVERVIEW_REQUEST": 77, "TRAFFIC_REQUEST": 138, "CONFIG_ENTRY": 173, "CONFIG_NEED": 99, "DISPLAY_BEGIN": 160, "DISPLAY_RECORD": 736, "DISPLAY_COMMIT": 77, "DISPLAY_HELLO": 132, "DISPLAY_READY": 55 }, "preparedSources": [ { "profile": 0, "language": "en", "appearanceBytes": 422, "trafficFragmentBytes": [ 603 ] }, { "profile": 0, "language": "fr", "appearanceBytes": 422, "trafficFragmentBytes": [ 603 ] }, { "profile": 1, "language": "en", "appearanceBytes": 422, "trafficFragmentBytes": [ 603 ] }, { "profile": 1, "language": "fr", "appearanceBytes": 422, "trafficFragmentBytes": [ 603 ] } ], "exchanges": { "fullSix": { "dictionaries": 15, "serializedBytesBound": 4365, "largestDictionaryBytesBound": 507 }, "unchangedSix": { "dictionaries": 9, "serializedBytesBound": 1323, "largestDictionaryBytesBound": 173 }, "reorderSix": { "dictionaries": 9, "serializedBytesBound": 1323, "largestDictionaryBytesBound": 173 }, "oneChangedFavorite": { "dictionaries": 10, "serializedBytesBound": 1830, "largestDictionaryBytesBound": 507 }, "initialD2": { "dictionaries": 18, "serializedBytesBound": 4684, "largestDictionaryBytesBound": 507 }, "cacheOnlyOverview": { "dictionaries": 9, "serializedBytesBound": 1010, "largestDictionaryBytesBound": 128 }, "cacheOnlyDetail": { "dictionaries": 4, "serializedBytesBound": 541, "largestDictionaryBytesBound": 160 }, "trafficTwoFragments": { "dictionaries": 5, "serializedBytesBound": 1362, "largestDictionaryBytesBound": 736 }, "trafficError": { "dictionaries": 4, "serializedBytesBound": 474, "largestDictionaryBytesBound": 160 } }, "sdkTransport": { "reservedKey": 15025, "includedInD2": false, "conditionalHandshake": { "announcementDictionaries": 1, "echoDictionaries": 1, "combinedInitialDictionaryAttempts": 20 }, "condition": "Only for exactly one observed SDK announcement/echo exchange plus the modeled initial D2 lifecycle; duplicate READYs and rekeys are additional events", "serializedBytes": null, "ackFrames": null, "evidenceRequired": "Capture native SDK tuple widths/bytes, D2 attempted/delivered/NACK counts and transport ACKs separately" }, "eventContract": { "localPagesAndMinuteTicks": "No application dictionaries; verify with native idle/page captures, not this host sizing script" }, "pass": true}'distclean' finished successfully (0.000s)### -p pebble/emery# xsc main.xsb# xsl mc.xsa### -p pebble/gabbro# xsc main.xsb# xsl mc.xsaSetting top to : /workspace/lapin-fute/packages/watch Setting out to : /workspace/lapin-fute/packages/watch/build Checking for program 'webpack' : /tmp/home/.local/share/pebble-sdk/SDKs/current/node_modules/.bin/webpack Found Pebble SDK for gabbro in: : /tmp/home/.local/share/pebble-sdk/SDKs/current/sdk-core/pebble/gabbro Checking for program 'gcc, cc' : arm-none-eabi-gcc Checking for program 'ar' : arm-none-eabi-ar Found Pebble SDK for emery in: : /tmp/home/.local/share/pebble-sdk/SDKs/current/sdk-core/pebble/emery Checking for program 'gcc, cc' : arm-none-eabi-gcc Checking for program 'ar' : arm-none-eabi-ar 'configure' finished successfully (0.016s)Waf: Entering directory `/workspace/lapin-fute/packages/watch/build'Auto-injected MOD resource for gabbro from build/mods/gabbro/mc.xsaAuto-injected MOD resource for emery from build/mods/emery/mc.xsa[1/3] Creating message_key_json: -> build/js/message_keys.json[2/3] Creating message_key_definitions: -> build/src/message_keys.auto.c[3/3] Creating message_key_header: -> build/include/message_keys.auto.h[ 4/18] Compiling gabbro | reso: build/mods/gabbro/mc.xsa -> build/gabbro/mods/gabbro/mc.xsa.MOD.reso[ 5/18] Compiling gabbro | reso: resources/images/menu-icon.png -> build/gabbro/resources/images/menu-icon.png.IMAGE_MENU_ICON.reso[ 6/18] Creating gabbro | /workspace/lapin-fute/packages/watch/build/gabbro/appinfo.auto.c: -> build/gabbro/appinfo.auto.c[ 7/18] Processing gabbro | resource_ball: build/gabbro/resources/images/menu-icon.png.IMAGE_MENU_ICON.reso build/gabbro/mods/gabbro/mc.xsa.MOD.reso -> build/gabbro/system_resources.resball[ 8/18] Compiling gabbro | generate_resource_id_definitions: build/gabbro/system_resources.resball -> build/gabbro/src/resource_ids.auto.c[ 9/18] Compiling gabbro | subst: /tmp/home/.local/share/pebble-sdk/SDKs/current/sdk-core/pebble/common/pebble_app.ld.template -> build/gabbro/pebble_app.ld.auto[10/18] Compiling gabbro | c: build/src/message_keys.auto.c -> build/src/message_keys.auto.c.16.o[11/18] Compiling gabbro | c: build/gabbro/src/resource_ids.auto.c -> build/gabbro/src/resource_ids.auto.c.16.o[12/18] Compiling gabbro | generate_pbpack: build/gabbro/system_resources.resball -> build/gabbro/app_resources.pbpack[13/18] Creating gabbro | /workspace/lapin-fute/packages/watch/build/appinfo.json: -> build/appinfo.json[14/18] Compiling gabbro | generate_resource_id_header: build/gabbro/system_resources.resball -> build/gabbro/src/resource_ids.auto.h[15/18] Compiling gabbro | c: src/c/mdbl.c -> build/src/c/mdbl.c.16.o[16/18] Compiling gabbro | c: build/gabbro/appinfo.auto.c -> build/gabbro/appinfo.auto.c.16.o[17/18] Linking gabbro | cprogram: build/src/c/mdbl.c.16.o build/gabbro/appinfo.auto.c.16.o build/gabbro/src/resource_ids.auto.c.16.o build/src/message_keys.auto.c.16.o -> build/gabbro/pebble-app.elf/tmp/home/.local/share/pebble-sdk/SDKs/4.33.1/toolchain/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.2.1/../../../../arm-none-eabi/bin/ld: warning: /workspace/lapin-fute/packages/watch/build/gabbro/pebble-app.elf has a LOAD segment with RWX permissions[18/18] Processing gabbro | memory_usage_report: build/gabbro/pebble-app.elf build/gabbro/app_resources.pbpack-------------------------------------------------------GABBRO APP MEMORY USAGETotal size of resources: 48374 bytes / 256.0KBTotal footprint in RAM: 308 bytes / 128.0KBFree RAM available (heap): 130764 bytes------------------------------------------------------- [19/33] Compiling emery | reso: build/mods/emery/mc.xsa -> build/emery/mods/emery/mc.xsa.MOD.reso[20/33] Compiling emery | reso: resources/images/menu-icon.png -> build/emery/resources/images/menu-icon.png.IMAGE_MENU_ICON.reso[22/33] Creating emery | /workspace/lapin-fute/packages/watch/build/emery/appinfo.auto.c: -> build/emery/appinfo.auto.c[23/33] Processing emery | resource_ball: build/emery/resources/images/menu-icon.png.IMAGE_MENU_ICON.reso build/emery/mods/emery/mc.xsa.MOD.reso -> build/emery/system_resources.resball[24/33] Compiling emery | subst: /tmp/home/.local/share/pebble-sdk/SDKs/current/sdk-core/pebble/common/pebble_app.ld.template -> build/emery/pebble_app.ld.auto[25/33] Compiling emery | generate_resource_id_definitions: build/emery/system_resources.resball -> build/emery/src/resource_ids.auto.c[26/33] Compiling emery | c: build/src/message_keys.auto.c -> build/src/message_keys.auto.c.17.o[27/33] Compiling emery | generate_pbpack: build/emery/system_resources.resball -> build/emery/app_resources.pbpack[28/33] Compiling emery | c: build/emery/src/resource_ids.auto.c -> build/emery/src/resource_ids.auto.c.17.o[29/33] Compiling emery | generate_resource_id_header: build/emery/system_resources.resball -> build/emery/src/resource_ids.auto.h[30/33] Compiling emery | c: src/c/mdbl.c -> build/src/c/mdbl.c.17.o[31/33] Compiling emery | c: build/emery/appinfo.auto.c -> build/emery/appinfo.auto.c.17.o[32/33] Linking emery | cprogram: build/src/c/mdbl.c.17.o build/emery/appinfo.auto.c.17.o build/emery/src/resource_ids.auto.c.17.o build/src/message_keys.auto.c.17.o -> build/emery/pebble-app.elf/tmp/home/.local/share/pebble-sdk/SDKs/4.33.1/toolchain/arm-none-eabi/bin/../lib/gcc/arm-none-eabi/14.2.1/../../../../arm-none-eabi/bin/ld: warning: /workspace/lapin-fute/packages/watch/build/emery/pebble-app.elf has a LOAD segment with RWX permissions[33/33] Processing emery | memory_usage_report: build/emery/pebble-app.elf build/emery/app_resources.pbpack-------------------------------------------------------EMERY APP MEMORY USAGETotal size of resources: 48374 bytes / 256.0KBTotal footprint in RAM: 308 bytes / 128.0KBFree RAM available (heap): 130764 bytes------------------------------------------------------- [34/39] Compiling gabbro | /workspace/lapin-fute/packages/watch/build/gabbro/pebble-app.raw.bin: build/gabbro/pebble-app.elf -> build/gabbro/pebble-app.raw.bin[35/39] Compiling emery | /workspace/lapin-fute/packages/watch/build/emery/pebble-app.raw.bin: build/emery/pebble-app.elf -> build/emery/pebble-app.raw.bin[36/39] Processing merge_js: src/pkjs/catalog-client.js src/pkjs/codec.js src/pkjs/compactparis-time.js src/pkjs/companion.js src/pkjs/configuration-sync.js src/pkjs/configuration.js src/pkjs/contracts.js src/pkjs/display-copy.json src/pkjs/display-font-metrics.json src/pkjs/display-fonts.js src/pkjs/display-layout.js src/pkjs/display.js src/pkjs/index.js src/pkjs/journey-patterns.js src/pkjs/message-queue.js src/pkjs/prim-client.js src/pkjs/prim-departures.js src/pkjs/prim-traffic.js -> build/pebble-js-app.js build/pebble-js-app.js.map[37/39] Processing emery | inject-metadata: build/emery/pebble-app.raw.bin build/emery/pebble-app.elf build/emery/app_resources.pbpack -> build/emery/pebble-app.bin[38/39] Processing gabbro | inject-metadata: build/gabbro/pebble-app.raw.bin build/gabbro/pebble-app.elf build/gabbro/app_resources.pbpack -> build/gabbro/pebble-app.bin[39/39] Creating app_bundle: -> build/watch.pbwWaf: Leaving directory `/workspace/lapin-fute/packages/watch/build''build' finished successfully (0.246s)Running Moddable prebuild (release build).Running mcrun -m ./src/embeddedjs/manifest.json -f x -p pebble/emery -t build -o ./build/mods/emery/mcrun -s tech.moddable.pebbleCopied Moddable mod for emeryRunning mcrun -m ./src/embeddedjs/manifest.json -f x -p pebble/gabbro -t build -o ./build/mods/gabbro/mcrun -s tech.moddable.pebbleCopied Moddable mod for gabbroModdable prebuild completed.{"aliases":19,"first":"SCHEMA_VERSION","last":"DISPLAY_EPOCH"}