> lapin-fute@1.2.1 test> node scripts/test.mjs✔ fixture is attributed and contains neither credentials nor personal responses (1.197273ms)✔ opaque IDs use stable full SHA-256 identities and distinguish opposite directions (1.229453ms)✖ import covers five modes, gates perimeter and unsupported modes, preserves homonyms, and uses rail terminals (67.208716ms)✔ bus services use their actual terminal to distinguish partial trips with the same headsign (58.754668ms)✔ GTFS quay and monomodal stops join SIRI perimeter namespaces without rewriting routing references (49.915577ms)✔ rail queries retain exact same-line child provenance without querying the child quay (150.896295ms)✔ ambiguous final selectors exclude both GTFS directions without rebinding existing services (190.142603ms)✔ perimeter descriptions are optional without losing services or weakening exact routing (171.562102ms)✔ parent-only relations retain valid routes without inventing stop associations (282.061183ms)✔ import normalizes valid colors and rejects invalid or missing authoritative colors (33.417538ms)✖ activation preserves stable services, removes stale IDs, and failed replacement leaves the active file untouched (77.93384ms)✔ restricted source download streams bytes and puts its token only in Authorization (35.850947ms)✔ ordered journey groups preserve variants, restrictions, exact terminals and proven aliases without changing old services (155.160925ms)✔ drop_off_type admits absent and empty values but rejects non-GTFS restriction codes (164.936088ms)✔ streaming CSV admits optional fields while enforcing complete source row counts (601.094243ms)✔ search is accent tolerant, punctuation safe, and bounded by Unicode code points (59.178291ms)✔ search preserves homonyms and applies deterministic ranking before the 20-row bound (138.269649ms)✔ search deduplicates destinations by native line and keeps equal labels and homonymous modes (51.052788ms)✔ search rejects conflicting display metadata for one native line (28.510936ms)✔ service options return every valid direction without applying the place-search bound (275.52105ms)✔ reload preserves stable IDs, distinguishes directions, rejects invalid candidates, and removes stale services (117.002996ms)✔ candidate validation rejects incomplete FTS coverage (23.494968ms)✔ candidate validation rejects non-normalized presentation colors (36.369399ms)✔ reader rejects incomplete journey bindings and malformed linked pattern rows (314.628719ms)✔ validated catalog publication preserves all modes, stable service identity and exact legacy lookup (256.003083ms)✔ search publication keeps every native line in natural order and refreshes display metadata by revision (165.910094ms)✔ new publication removes a stale service only for new sessions and keeps open sessions on their revision (248.500247ms)✔ publisher splits search and busy-place pages by decoded bytes without dropping bus rows or long routing (2032.529254ms)✔ failed oversized publication preserves the previous manifest and its immutable catalog (114.050654ms)✔ publication exposes only dataset attribution, never operator credentials or signed download URLs (78.238661ms)✔ search bucket addressing uses Unicode codepoints rather than UTF-16 units (0.246091ms)✔ journey publication writes every annex and bounded paginated groups load from published bytes (90.406207ms)✔ journey-only order and restriction changes move the revision while service payloads stay unchanged (155.674608ms)✔ invalid journey content fails validation and preserves the previous manifest and revision (676.408554ms)✔ journey requests pin revision and admit only the complete group without retaining it (4.174141ms)✔ invalid or mismatched annexes do not start a group lookup (0.584344ms)✔ missing intermediate pages, bad counts, revisions and duplicate rows fail closed without retries (0.93401ms)✔ raw document and cumulative group budgets include whitespace and the index (35.576513ms)✔ shared group flights survive one cancellation but abort when the last subscriber cancels (1.255321ms)✔ deadline keeps valid annex, explicit cancellation suppresses callback, and neither retries (0.331321ms)✔ the revision is part of the group flight identity (0.653194ms)✔ service lookup remains compatible and transport construction failure settles once (0.465552ms)✔ Core Android decoded close responses preserve favorites with line colors (4.954542ms)✔ an explicit choice matching the system persists without a sync and returning to Automatic follows fresh locales (7.667725ms)✔ language-only saves send rehashed appearance records through DIFF without changing favorites or fetching (2.766412ms)✔ cancelled, invalid and unpersisted language saves leave the prior configuration active (1.12123ms)✔ ready coalesces and an early APP_OPEN waits for the sent COMMIT's transport completion (7.6805ms)✔ SDK readiness bypasses D2 normalization and a queued echo survives a failed application send (0.889466ms)✔ production PRIM GETs are once per service, traffic is coalesced, and D2 carries no routing or credential (9.918201ms)✔ ordinary warm refresh preserves the old snapshot until the complete fresh aggregate is ready (2.607826ms)✔ every refresh trigger observes the strict sixty-second departure gate despite old UNKNOWN traffic (2.659352ms)✔ refresh-all skips fresh services, preserves failed snapshot age, and fills missing rows (4.588767ms)✔ overview and detail CACHE_ONLY finish misses and stale hits without PRIM or a refreshing echo (1.920067ms)✔ complete cached results are stale only before the fifteen-minute useful boundary (1.738397ms)✔ 429 is terminal for one event, preserves useful stale data, and increments only a safe counter (1.679125ms)✔ the failure table deterministically projects unconfigured, stale, or unavailable (8.706362ms)✔ an opening overview completes after cache-only detail entry and local Back (1.52646ms)✔ slow ACKs preserve every accepted token even when later data bytes are identical (1.265351ms)✔ bounded overflow retains latest demand per kind after four accepted slow requests (3.446777ms)✔ warm refresh keeps loading feedback for usable and missing rows until terminal outcomes (2.170366ms)✔ credential lifecycle cancellation prevents old network completion from reaching the watch (1.253668ms)✔ joined overview fetches only uncovered services and completes both original tokens (1.501844ms)✔ superseded settled selections get terminal data without launching obsolete service fetches (1.480063ms)✔ saved preferences and Automatic use separate traffic caches without refetching a fresh language (3.306836ms)✔ an English override keeps in-flight French fallback and both language caches bound through restart (8.183391ms)✔ order-only settings preserve active fetches and cache, with zero favorite bodies (1.955914ms)✔ explicit FULL is one-shot, sends complete inventory, and is not persisted (0.738473ms)✔ unresolved routing uses a pinned public revision once per service without metadata resynchronization (2.061963ms)✔ obsolete routing preserves valid favorite/key data, rehydrates exactly, and never renders an old cache format (1.453824ms)✔ routing recovery keeps invalid-key journal authority and rejects unrelated corruption (4.069083ms)✔ failed routing persistence retains durable bytes and refuses unpersisted departure bindings (1.133474ms)✔ oversized hydrated routing cannot create an unpersisted departure binding (1.716485ms)✔ unresolved service IDs remain editable and canceled catalog lookups cannot launch PRIM (0.947234ms)✔ a stalled catalog lookup terminates as INVALID_SERVICE without PRIM or polling (0.733143ms)✔ stopping a six-favorite refresh cancels all pending PRIM work (1.117133ms)✔ catalog revision mismatch cannot hydrate favorites or send credentials to the static host (0.6402ms)✔ authentication rejection invalidates credentials durably, cancels network, and completes accepted tokens (1.633571ms)✔ the invalid-key journal blocks restart even when the primary configuration write fails (2.378567ms)✔ marker-only invalidation cannot apply an unpersisted replacement's favorites or language (1.56933ms)✔ credential replacement ignores saved callbacks from the canceled lifecycle (0.716112ms)✔ credential removal erases the key, retains favorites, and blocks PRIM until replacement (0.700904ms)✔ interrupted same-key replacement never clears durable invalid-key authority (9.467919ms)✔ malformed traffic gets a final error token without cache writes or retries (0.888304ms)✔ traffic failure keeps useful departures with unobserved UNKNOWN summaries (1.199628ms)✔ failed traffic refresh keeps the old detail cache and original checked time (1.453032ms)✔ cache persistence failure keeps fresh data usable in this phone session (1.073481ms)✔ slow ACK FIFO keeps a started transfer atomic and completes subsequent cache-only tokens (4.360719ms)✔ favorite removal prunes departure and traffic cache across restart (1.739049ms)✔ foreign cache formats fail closed and credential echoes cannot replace durable cache bytes (0.255038ms)✔ generated bootstrap starts the real companion and answers SDK readiness without a timing gate (4.091625ms)✔ journey flights migrate a single null arrival through real annexes before PRIM and preserve labels (2.695851ms)✔ journey flights retain unresolved arrival when persistence fails and never call departures (2.547152ms)✔ journey flights distinguish unavailable groups from unreachable arrivals for every mode (6.774673ms)✔ journey flights keep distinct arrivals independent while exact duplicate journeys share work (0.977081ms)✔ journey flights reject fresh detail cache and late results after an arrival-only edit (0.852407ms)✔ journey flights ignore late annex callbacks after an arrival-only edit (0.465282ms)✔ journey flights cover joined demand by arrival and reuse only line traffic (0.773329ms)✔ journey flights skip static loading for fresh cache and reject mismatched detail cache (0.915876ms)✔ both supported phone records migrate once to Automatic without losing favorites or credentials (3.589995ms)✔ storage never treats malformed or missing v2 arrivals as a legacy omission (1.066538ms)✔ routing recovery does not erase an explicit arrival and rejects unrelated corruption (0.295684ms)✔ migration readback failure restores either old format and exposes no writable configuration (0.456715ms)✔ a durable invalid-key marker remains authoritative across legacy migration (1.266282ms)✔ v2 page envelopes preserve arrivals while a legacy empty close can never clear favorites (0.398818ms)✔ stored language preferences survive restoration while malformed values never become Automatic (1.39832ms)✔ legacy saves preserve an override, explicit Automatic removes it, and invalid preferences reject the entire update (0.449513ms)✔ Automatic retains French normalization and English fallback without consulting the watch for overrides (0.350356ms)✔ cache keeps distinct arrivals of one service and discards only the rebound overview (1.865806ms)✔ merging requires captured bindings and refuses old arrivals even when labels are unchanged (0.358272ms)✔ unresolved bindings admit errors and traffic but never departure snapshots (0.350176ms)✔ v3 cache requires own valid bindings and scans arrival identities for secrets (0.597619ms)✔ old result caches lose departures and traffic without changing configuration or credentials (0.416541ms)✔ departures issue only the fixed PRIM GET and deliver a binding-free snapshot asynchronously (19.209459ms)✔ client executes byte decoding and both parsers without modern runtime collections or codecs (9.32525ms)✔ synchronous XHR completion or construction failure still settles later and only once (0.669985ms)✔ abort is final before completion and between completion and deferred delivery (0.67768ms)✔ watchdog timeout and pypkjs event-only network failure produce one safe error (0.453319ms)✔ HTTP authentication and quota failures retain semantic codes and bounded Retry-After (1.642467ms)✔ missing routing and malformed keys never start transport and remain abortable (0.280015ms)✔ routing is copied at dispatch and credentials cannot be embedded in request URLs (0.970549ms)✔ missing or malformed departure contexts reject before HTTP; unavailable patterns retain uncertain times (0.649547ms)✔ malformed SIRI evidence maps to INVALID_RESPONSE instead of an arbitrary journey (0.558957ms)✔ malformed UTF-8, missing byte responses and oversized bodies never enter normalized output (1.059374ms)✔ a BOM and a byte-exact maximum response remain valid (13.645234ms)✔ only traffic accepts a valid two MiB body and rejects one byte beyond its own cap (100.232757ms)✔ traffic calls coalesce across lines but not languages or credentials (1.288434ms)✔ coalesced cancellation preserves the remaining subscriber and cancels the final one (0.715731ms)✔ traffic cache reevaluates periods, retains checkedAt, expires at exactly 60 seconds and rejects clock rollback (0.448741ms)✔ credential changes never reuse another key's traffic cache and callbacks cannot mutate cached text (0.374341ms)✔ English complete text needs one request and missing either field uses the same French incident pair (1.084843ms)✔ fallback shares a French flight across lines and direct French readers then reuses both fresh caches (0.652051ms)✔ cancellation moves with fallback, preserves other readers and suppresses late completions (0.398116ms)✔ French fallback cannot replace a missing, inactive or incomplete matching incident with another one (1.987133ms)✔ English failures never fetch French and fallback failures propagate without retries (0.593642ms)✔ fallback never serves an English envelope that expires while French is pending (0.467415ms)✔ fallback stays inside the shared eight-slot limiter and cancelled queued fallback never starts (0.462307ms)✔ fallback refreshes expired French data and never borrows another credential's French cache (0.986128ms)✔ transport errors and malformed traffic are unavailable, not successful UNKNOWN, and are not cached (0.383137ms)✔ eight shared transport slots bound departures and traffic without starting cancelled queued work (0.239358ms)✔ aborting a lifecycle batch never starts its queued bulk request (0.232926ms)✔ no request retries or polling occur after success or failure (0.514083ms)✔ all five recorded modes preserve source times, freshness and confirmed intervals in ES5 (7.87272ms)✔ delay, cancellation, expected then aimed, and mixed freshness remain independent of journey evidence (1.0569ms)✔ common arrivals combine full and partial chronologically; beyond partial excludes only proven partials (0.304911ms)✔ unknown short names and absent terminal hints prove only universally compatible journeys (0.348984ms)✔ reduced 255 south and north contradictions confirm only shared arrivals and honor proven Q aliases (0.77915ms)✔ express, loops, order and boarding restrictions cannot be confirmed by one favorable occurrence (0.2885ms)✔ SP opposite directions and a different Q quay never become equivalent by place (0.304901ms)✔ four total entries prioritize confirmation, preserve ties and never synthesize missing visits (0.857566ms)✔ every supported SIRI evidence field accepts strings, value objects and flat arrays without coercion (1.017636ms)✔ resolved arrival context is mandatory; unavailable patterns keep actual uncertain times and statuses (0.729606ms)✔ foreign line and monitoring visits do not contaminate source freshness (0.20797ms)✔ explicit offsets and strict source dates remain independent of local timezone (0.658223ms)✔ traffic distinguishes observed normal, useful disruption and source uncertainty (3.177543ms)✔ lines omitted from the disruption-only bulk feed have normal traffic (0.217717ms)✔ the latest active update wins even over a more severe incident (0.192861ms)✔ dated incidents outrank undated ones and equal dates use ID rather than input order (0.366336ms)✔ future works stay ignored while active works participate in the selection (0.25663ms)✔ active works interruption tracks the synthetic September window, inclusive at 08:00 and gone at noon (0.566953ms)✔ an active disruption without complete details remains UNKNOWN (0.166121ms)✔ Paris periods are inclusive at start and exclusive at end, including summer time (1.670059ms)✔ generated Paris time covers epoch bounds and exact DST gaps and overlaps without device Intl (1.401175ms)✔ generated Paris offsets agree with build-time ICU across the entire epoch range (13.089293ms)✔ portable traffic text strips markup and secrets and truncates only at Unicode codepoint boundaries (2.343651ms)✔ traffic redacts entity-decoded and URI-encoded credentials before returning readable text (1.276913ms)✔ malformed traffic joins, periods, duplicates and severities reject rather than become normal traffic (5.126344ms)✔ empty half-open traffic periods stay inactive without discarding other source information (1.496494ms)✔ a bulk body containing empty periods succeeds through the production client (1.387479ms)✔ 256 daily periods keep the blocking incident usable with only the current day active (1.565704ms)✔ 257 periods exceed the payload bound and reject the whole body (0.35771ms)✔ a bulk body with a 256-period notice still succeeds through the production client (1.968558ms)✔ reversed or invalid traffic periods still reject instead of becoming empty or invented ranges (0.279133ms)✔ strict watch decoder admits overview CACHE_ONLY but rejects retired and mismatched envelopes (1.653518ms)✔ lazy configuration waits for correlated NEED and COMMIT ACK before exposing the binding (2.508239ms)✔ FULL sends complete inventory and requires every body bit; reorder DIFF sends no bodies (2.514952ms)✔ HELLO correlation, epoch floor and profile changes guard configuration preparation (0.51776ms)✔ superseded sync ignores stale NEED and late transport failure without resetting c-sequence (0.521617ms)✔ phone enrichment updates only matching lifecycle bindings without changing watch metadata (1.226437ms)✔ Unicode appearance and traffic continuation strings cross D2 without clipping source data (1.505721ms)✔ queue is lazy, bounded, atomic and yields after each ACK including final completion (0.237424ms)✔ an unattempted SDK echo survives failed D2 work, but the echo itself is never retried (0.364613ms)✔ clear waits for the physical flight and stale callbacks cannot corrupt its replacement (0.296526ms)✔ cancellation retires old deferred work and synchronous transport throws fail once (0.256481ms)✔ static search scans every page, keeps the best twenty and preserves homonyms (21.794091ms)✔ search rows carry precomputed lines without extra requests and reject malformed metadata (4.675169ms)✔ equally relevant stops put rail modes before tram and bus (0.595316ms)✔ static search uses AND token prefixes, Unicode normalization and one-codepoint buckets (1.04072ms)✔ search ignores French join words absent from an official stop label (0.55521ms)✔ missing initial search bucket is empty but a missing continuation is unavailable (0.824535ms)✔ search refuses revision changes and noncontiguous continuations (0.625372ms)✔ service pages and exact service lookups keep unbounded authoritative routing on one revision (1.193175ms)✔ service lookup rejects unsafe paths, wrong identities and credential-shaped routing (0.782055ms)✔ service pages reject missing continuations and cross-place content (0.746829ms)✔ debouncing cancels superseded requests before they reach the static host (0.406101ms)✔ canceling an active search aborts its fetch and prevents later pages even if fetch ignores abort (6.134142ms)✔ decoded response bounds stop a stream instead of buffering the remainder (1.110361ms)✔ lookupJourney assembles a real multi-page group on one pinned revision (110.302162ms)✔ concurrent services of one group share one flight and one assembled group (97.260498ms)✔ lookups for different groups run separate flights (101.236166ms)✔ aborting one subscriber leaves the shared group load intact (82.623115ms)✔ aborting the last subscriber cancels the load and a later lookup starts fresh (77.425357ms)✔ group admission failures keep the service and never yield a partial group (86.624581ms)✔ group line and mode must match the service annex even when group identities match (93.864766ms)✔ annex failures return null without any group transfer (68.906186ms)✔ annex routing must exactly match every requested routing field (71.075069ms)✔ raw group budget includes whitespace in the index as well as pages (36.622302ms)✔ mirrored constants equal the canonical contract (0.90733ms)✔ french language tags select french copy and everything else falls back to english (0.556934ms)✔ authored and transport labels never appear in product copy (0.115887ms)✔ a complete v2 opening opens an editable session and validates favorites (0.714449ms)✔ legacy and unversioned openings are decoded read-only for display only (0.489547ms)✔ absent or malformed openings are non-editable empty sessions (0.237856ms)✔ minimal favorites round trip without inventing presentation properties and partial groups reject (0.444062ms)✔ the config page consumes the companion-produced opening fragment exactly (0.683651ms)✔ an advertised languagePreference enables a strict selector round trip (0.698559ms)✔ an unadvertised launch keeps the selector inert and the close payload free of the preference (0.545692ms)✔ an invalid present languagePreference rejects the whole opening without coercion (0.256891ms)✔ explicit choices stay distinct from automatic across a full save and reopen (1.754638ms)✔ a planted key field never enters page state or the payload (0.134021ms)✔ key lifecycle plans KEEP, REPLACE, and REMOVE through pure state (0.297107ms)✔ replace validation rejects oversized or control-bearing keys in both locales (0.173896ms)✔ read-only sessions never mutate, save, or hydrate regardless of the DOM (0.309801ms)✔ favorite edits replace the whole list atomically with renumbered order (0.859821ms)✔ malformed whole favorite lists stay read-only and cannot be normalized into a save (0.297167ms)✔ the seventh favorite is rejected by the add path while a valid six save whole (0.799759ms)✔ the close fragment carries the key value only for REPLACE and is one-shot (0.2776ms)✔ three backend services can be added, renamed, reordered, and removed atomically (0.364163ms)✔ catalog response guards reject identifiers and malformed or oversized collections (0.410088ms)✔ journey places validate the catalog place identity shape exactly (0.098014ms)✔ service routing validates exactly and only phone favorites may carry it (0.160852ms)✔ favorites created from catalog services carry a fresh routing copy and the chosen arrival (0.271448ms)✔ routing and arrivals survive the full page round trip and phone-side validation (0.620432ms)✔ force full synchronization is an explicit one-shot close flag (0.385603ms)✔ unresolved favorites hydrate in place or wait for explicit re-selection (0.334036ms)✔ encoded close and opening fragments enforce the 32768 bound at producers (1.305276ms)✔ favorite preview uses the credential-free recorded departure fixture (0.237124ms)✔ page keeps secrets out of durable and observable surfaces (0.813524ms)✔ bilingual About copy exposes the required legal, privacy, attribution, and safe-link facts (0.44311ms)✔ official rail badges cover every RER and Transilien line (0.269144ms)✔ favorites without presentation fields resolve no official image and use an accessible neutral fallback (0.183644ms)✔ search result labels use the available row width and wrap line badges (0.312776ms)✔ mirrored place search validation matches the canonical lines contract (0.488696ms)✔ the first-load gzip metric includes the eagerly imported badge resolver (0.180748ms)config page ready: /tmp/lapin-fute-config-site-EoNUMM/output (existing hosted catalog left unchanged)config site ready: /tmp/lapin-fute-config-site-TBe15D/output (catalog revision in catalog/manifest.json)✔ page-only configuration build neither requires nor publishes a catalog (25.869637ms)✔ full configuration build still requires and copies a published catalog (2.597787ms)✔ catalog upload planning compares source revisions instead of volatile publication revisions (1.816874ms)✔ configuration-site verification checks every local and served file on the current catalog revision (8.297325ms)fatal: path 'CHANGELOG.md' does not exist in 'fa1c7ec7556975ba543dd44e2579944c85c64b1c'✔ release body keeps the whole section and excludes adjacent releases and the heading (1.820842ms)✔ adjacent releases stay isolated regardless of heading position (0.36287ms)✔ exact bracket match does not confuse similar versions (0.21912ms)✔ fenced code examples can neither duplicate nor truncate a section (0.253615ms)✔ a fenced heading before any real section is not a section (0.088957ms)✔ tilde fences and CRLF line endings are handled like backtick fences (0.071474ms)✔ missing, empty, and duplicate sections are rejected (0.350337ms)✔ a duplicate section is rejected even when separated by another release (0.113172ms)✔ release notes come from the tagged changelog, never the working copy (41.57423ms)✔ a changelog committed after the tag cannot leak into the tagged release (25.454009ms)✔ releases reject non-stable tags and repositories without a tagged changelog (18.670029ms)✔ CJS: full and short services prove the common arrival, not the full arrival (4.818848ms)✔ CJS: unknown or absent hints use every exact-boarding candidate (1.912704ms)✔ CJS: terminal aliases do not prove intermediate express stops or loop occurrences (0.669424ms)✔ CJS: pickup and drop-off restrictions remain conditional or impossible (1.989367ms)✔ CJS: proven equivalents and whole normalized labels preserve ambiguous evidence (0.546503ms)✔ CJS: group admission rejects missing pages, foreign links and ambiguous structure (1.134736ms)✔ CJS: exact budgets and IDs admit boundaries without truncation (18.757512ms)✔ CJS: overlapping terminal aliases remain ambiguous and unmapped arrivals stay selectable (0.471143ms)✔ CJS: arrival display truncates scalars and journey identity keeps arrivals distinct (0.528551ms)✔ browser ESM: full and short services prove the common arrival, not the full arrival (2.035143ms)✔ browser ESM: unknown or absent hints use every exact-boarding candidate (0.476723ms)✔ browser ESM: terminal aliases do not prove intermediate express stops or loop occurrences (0.85357ms)✔ browser ESM: pickup and drop-off restrictions remain conditional or impossible (1.045669ms)✔ browser ESM: proven equivalents and whole normalized labels preserve ambiguous evidence (0.291566ms)✔ browser ESM: group admission rejects missing pages, foreign links and ambiguous structure (1.048445ms)✔ browser ESM: exact budgets and IDs admit boundaries without truncation (22.797151ms)✔ browser ESM: overlapping terminal aliases remain ambiguous and unmapped arrivals stay selectable (0.334827ms)✔ browser ESM: arrival display truncates scalars and journey identity keeps arrivals distinct (0.437259ms)✔ browser and canonical helpers produce identical admitted groups and decisions (1.452392ms)▶ local checksum, identity and tag validation fails before authentication ✔ wrong checksum (5.961088ms) ✔ wrong UUID (5.336197ms) ✔ wrong archive version (3.900487ms) ✔ prerelease tag (0.778739ms)✔ local checksum, identity and tag validation fails before authentication (16.999498ms)▶ archive targets, duplicate metadata and oversized JSON fail before authentication ✔ missing target (3.5919ms) ✔ duplicate metadata (2.47663ms) ✔ oversized metadata (6.699692ms)✔ archive targets, duplicate metadata and oversized JSON fail before authentication (13.559835ms)✔ ambiguous checksum records fail before authentication (1.894449ms)✔ an authenticated account without the exact app mapping cannot upload (20.057869ms)✔ ownership lookup rejects conflicting UUID keys after normalization (4.62223ms)▶ either hardware's published version blocks equal or older candidates ✔ equal Emery (2.594601ms) ✔ newer Gabbro (2.747608ms)✔ either hardware's published version blocks equal or older candidates (5.80725ms)✔ publication uploads the exact checked bytes and notes once, even if the file changes after validation (4.189599ms)▶ remote failure, redirect and malformed data never expose remote content or retry ✔ revoked session (2.278108ms) ✔ invalid token (2.234256ms) ✔ malformed JSON (1.921099ms) ✔ oversized JSON (5.466431ms) ✔ redirect (4.027867ms) ✔ wrong public identity (1.935496ms) ✔ unknown published version (1.75055ms) ✔ upload HTTP error (1.931769ms) ✔ uncertain upload timeout (1.65988ms)✔ remote failure, redirect and malformed data never expose remote content or retry (24.282102ms)✔ domain contracts expose every frozen enum and accept every field (1.497857ms)✔ domain validators enforce exact fields, versions, bounds, and secret rules (0.958857ms)✔ phone routing stays exact and separate from the canonical favorite (0.478256ms)✔ six favorites are accepted uniformly without relaxing required domain fields (0.336961ms)✔ D2 appearance hashes canonical UTF-8 bytes in both directions and counts scalar fields (3.224871ms)✔ appearance clip endpoints preserve supplementary glyph boundaries and fit native widths (0.60316ms)✔ D2 retains explicit non-contiguous application IDs without SDK or domain aliases (0.113152ms)✔ dictionary sizing follows Pebble's measured-data formula (0.129453ms)✔ D2 separates watch epochs, data counters, configuration generations and correlation tokens (0.91806ms)✔ configuration dictionaries require the c-generation and exact six-slot inventory bounds (0.46956ms)✔ data request admission distinguishes user detail, overview and cache-only triggers (0.606376ms)✔ catalog contracts freeze transport modes, error codes, and limits (0.090209ms)✔ place lines require complete display metadata within the existing label and color bounds (0.485309ms)✔ catalog validators require phone routing and keep place search display-only (0.558346ms)✔ overview contracts preserve request order and isolate per-favorite failures (0.399248ms)✔ traffic detail contracts enforce discriminants, UTF-8 bounds, and plain text (0.535133ms)✔ packed result dictionaries enforce kind-specific counts and favorite binding (0.742561ms)✔ traffic fragment validation allows continuations but keeps error and UTF-8 bounds strict (0.247734ms)✔ phone traffic preparation preserves palette, scalar sections and LF wrapping without padding fragments (2.70083ms)✔ traffic wrapping converts allowed source tabs without emitting packed controls (0.20823ms)✔ traffic wrapping distinguishes an empty section from explicit trailing blank lines (0.096601ms)✔ prepared updating headers fit both fresh and stale native fonts (1.089461ms)✔ overview countdown terminal labels fit full and compact native slots without shortening detail copy (4.361821ms)✔ secondary departure status labels fit native detail columns while primary copy stays complete (1.461218ms)✔ uncertain journey legend and secondary labels fit their native slots (1.104058ms)✔ real PRIM normalization crosses D2 warm overview, detail and traffic boundaries (22.198849ms)✔ changed six-favorite metadata finishes overview5 and detail5 without PRIM (16.322571ms)✔ phone restart and reorder retain six metadata records without another APP_OPEN (19.361824ms)✔ cache-only miss stays terminal while an independent overview flight completes (3.525835ms)✔ production entry profile 0: writable handshake, consultation and sole Back owner (36.005707ms)✔ production entry profile 1: writable handshake, consultation and sole Back owner (23.630461ms)✔ production entry rejects an unknown profile before opening transport (1.592884ms)✔ appearance records round trip and validate (5.176819ms)✔ displayHash pins scalar semantics across profiles and languages (1.250252ms)✔ clipped honours scalar endpoints and the ellipsis mask (1.025261ms)✔ prepared appearances prefix metro and tram labels consistently (9.420439ms)✔ prepared appearances contract metro bis lines without clipping (5.026928ms)✔ departure records validate bounds and pairing (0.347611ms)✔ departure status and uncertainty survive packing independently without record growth (3.785552ms)✔ traffic documents validate section counts and bounds (22.835572ms)✔ packed primitives count scalars, not UTF-16 units (0.498955ms)✔ traffic outcome union keeps prior documents on scoped errors (24.223163ms)✔ credential errors survive data retention and outrank other loading (4.172878ms)✔ epoch guards publish only on complete validated commits (5.569835ms)✔ restored metadata rejects unsolicited old epochs and recovers via READY (5.917707ms)✔ FULL clears metadata only after a durable marker and cannot restore interrupted data (13.634685ms)✔ obsolete work is cancelled without becoming the new favorite's failure (2.171929ms)✔ rapid detail navigation settles once on the final favorite after 500 ms (3.711644ms)✔ fifty refresh and rapid-navigation cycles keep durable and timer state bounded (11.51316ms)✔ enqueue failures belong to the attempted request, never unrelated sync (2.183301ms)✔ fresh traffic renders fresh despite missing or older departures (4.362032ms)✔ deleting the active traffic favorite falls back to the first detail (2.090556ms)✔ malformed cancellation needs full id, generation, kind and epoch (1.701959ms)✔ changed DIFF releases result owners only at the complete inventory boundary (6.977843ms)✔ malformed guards, no-ops and reorders keep warm results (11.327391ms)✔ released DIFF aborts end the loader and keep manual recovery (17.236122ms)✔ explicit manual retry rekeys after an aborted released sync (9.990597ms)✔ changed-DIFF recovery respects the final request ids without automatic rekeys (12.133071ms)✔ unrelated failed overview enqueue keeps a relevant manual detail intent (3.883095ms)✔ inventory entries release exactly when last used (6.459291ms)✔ zero-need commits release inventory arrays and preserve identity (3.65623ms)✔ inventory body guards reject duplicate, late and unrequested bodies (41.112134ms)✔ wire validation rejects malformed frames before any state changes (0.318857ms)✔ epoch allocation is durable, monotonic and fails closed (17.77961ms)✔ DIFF persistence faults preserve the committed configuration (28.306363ms)✔ pending marker faults stay before the destructive seam (6.46933ms)✔ load rejects foreign, epochless and corrupt storage as unconfigured (1.195891ms)✔ foreign manifests cannot reset epochs or create epochless pending writes (4.076598ms)✔ epoch grammar and request ids (0.338043ms)✔ profile 0 en: changed DIFF loading ends on abort and final cache miss (10.476618ms)✔ profile 0 fr: changed DIFF loading ends on abort and final cache miss (1.278836ms)✔ profile 1 en: changed DIFF loading ends on abort and final cache miss (1.799862ms)✔ profile 1 fr: changed DIFF loading ends on abort and final cache miss (1.966644ms)✔ profile 0: traffic pages preserve sections and scoped errors (3.589024ms)✔ profile 1: traffic pages preserve sections and scoped errors (1.156026ms)✔ profile 0: detail emphasizes the destination and aligns the primary countdown (0.775493ms)✔ profile 1: detail emphasizes the destination and aligns the primary countdown (1.268266ms)✔ rectangular overview fills the first three rows (1.275209ms)✔ retained credential failures outrank traffic loading until matching success (9.159701ms)✔ profile 0 en: uncertain detail keeps times, statuses and overview fallback (1.591652ms)✔ profile 0 en: mixed groups label uncertainty once without sorting times (1.550204ms)✔ profile 0 fr: uncertain detail keeps times, statuses and overview fallback (0.900107ms)✔ profile 0 fr: mixed groups label uncertainty once without sorting times (0.762488ms)✔ profile 1 en: uncertain detail keeps times, statuses and overview fallback (0.60311ms)✔ profile 1 en: mixed groups label uncertainty once without sorting times (0.646752ms)✔ profile 1 fr: uncertain detail keeps times, statuses and overview fallback (1.392489ms)✔ profile 1 fr: mixed groups label uncertainty once without sorting times (0.530444ms)✔ Gabbro ignores an uncertain fourth departure outside the visible detail (0.698649ms)ℹ tests 391ℹ suites 0ℹ pass 389ℹ fail 2ℹ cancelled 0ℹ skipped 0ℹ todo 0ℹ duration_ms 10803.12442✖ failing tests:test at packages/catalog/test/catalog-import.test.ts:101:1✖ import covers five modes, gates perimeter and unsupported modes, preserves homonyms, and uses rail terminals (67.208716ms) Error [CatalogImportError]: catalog candidate and active directory must share a filesystem at fail (file:///workspace/lapin-fute/packages/catalog/src/catalog-import.ts:198:9) at activateCatalogCandidate (file:///workspace/lapin-fute/packages/catalog/src/catalog-import.ts:1731:7) at TestContext.<anonymous> (file:///workspace/lapin-fute/packages/catalog/test/catalog-import.test.ts:111:3) at async Test.run (node:internal/test_runner/test:1332:7) at async Test.processPendingSubtests (node:internal/test_runner/test:911:7) { code: 'CROSS_DEVICE_ACTIVATION' }test at packages/catalog/test/catalog-import.test.ts:491:1✖ activation preserves stable services, removes stale IDs, and failed replacement leaves the active file untouched (77.93384ms) Error [CatalogImportError]: catalog candidate and active directory must share a filesystem at fail (file:///workspace/lapin-fute/packages/catalog/src/catalog-import.ts:198:9) at activateCatalogCandidate (file:///workspace/lapin-fute/packages/catalog/src/catalog-import.ts:1731:7) at TestContext.<anonymous> (file:///workspace/lapin-fute/packages/catalog/test/catalog-import.test.ts:496:3) at async Test.run (node:internal/test_runner/test:1332:7) at async Test.processPendingSubtests (node:internal/test_runner/test:911:7) { code: 'CROSS_DEVICE_ACTIVATION' }