HF-Contrib-v2 / VALIDATION.md
fffiloni's picture
Record verified 0.4.18 deployment and final UI checks
e2a5c74 verified
|
Raw History Blame Contribute Delete
64.4 kB

A newer version of the Gradio SDK is available: 6.32.0

Upgrade

Release validation · 0.4.18

v0.4.18 — readable controls and immediate daily feedback

Base deployed revision: 1af892994109645d9c271b06b6e735339072645b (0.4.17).

  • Automated: 103 Python tests and all five Node suites pass. Added checks for selected-day feedback/jump/focus, date-picker placement, contextual private labels, native category selection, desktop Home/End tab navigation, accessible unavailable export help, touch copy and a single launch status. Existing privacy, cache, cancellation, gesture, mounting and motion coverage remains intact.
  • Real browser: production Gradio 6.31.0, synthetic owner/stream only, in Chromium. Welcome inspected at 390px EN/light and 320px FR/dark. Loaded layout measured at 320/390/520/640/780/960/1160px: document and viewport widths match in every case (305/375/505/625/765/945/1145px with scrollbar). Essential source text measures 14px. No real account data or Hub scans.
  • Daily inspection: selecting January 6 showed its date and 171 contributions immediately beneath the grid. View details scrolled to the separate inspector, focused hc-selected-day and exposed eight fixture entries. Date input, previous/next and explicit close remain native/accessible.
  • Progress and export: a complete synthetic run showed one grid pulse phase and one finale. Activating unavailable Export displayed its explanation without opening export. A complete result opened the export overview and Back restored exploration. PNG rendering is unchanged and was not repeated.
  • Keyboard finding and responsive decision: narrow horizontally scrolled tab activation reproducibly crashed this Chromium renderer (error 4), including native keyboard input; no server traceback. Desktop mouse selection and Home/End succeeded. Reordering scroll/focus and preserving text nodes did not resolve the narrow case; the renderer's internal cause remains unestablished. Phones now use a native five-option category selector instead of the overflowing tab strip. Its Home/End and category changes passed in the real browser. Desktop retains tabs. This avoids the reproducible interaction rather than claiming a browser-engine fix.
  • Cancellation: final 320px FR/dark refresh/Stop test retained 451 synthetic contributions, displayed the stopped notice and removed the grid pulse. The native category selector remained usable; no page overflow (305px document and viewport).
  • Deployed: code commit bd1f2421eb4a93b7c2c5a9e5a5e7aa1454d9b990 reached RUNNING. Production /config returned 200 with BETA 0.4.18, the mobile selector and daily navigation. The real Space browser showed BETA 0.4.18, one sign-in action, authenticated=false and the scan form display:none. No authenticated production collection was started.
  • Preserved: collector, OAuth scopes/relay, session-private cache, API/schema, exports and dependencies. Gradio and sdk_version remain 6.31.0.
  • Limits: physical iPhone/Safari and real authenticated private collection were not rerun. No GPU work. Browser checks use synthetic data; keyboard/DOM simulations are distinguished above.

v0.4.17 — aligned scope, action and secondary controls

Base deployed revision: 1823c5b0f57c9568965d5165afeb21c2c88fd889 (0.4.16).

  • Automated: 103 Python tests and all five Node suites pass. git diff --check and Python compilation pass. The real Gradio 6.31.0 configuration confirms scope and collection are separate named children of the shared toolbar. Existing owner isolation, explicit private choice, cancellation, cache, date, navigation and motion coverage is retained.
  • Browser layout: actual Gradio in Chromium, using an isolated synthetic owner and stream. Welcome inspected in EN/light at 640px and FR/dark at 320px; collection inspected at 320/390px. Loaded layout measured at 320, 390, 520, 640, 780, 960 and 1160px. Document and viewport widths match, including the browser scrollbar. At 320px, both rows are 273px wide with 16px gutters, Stop/Refresh are 112 × 44px at x=16, and feedback starts at x=140. At 780px and above, scope and action share a baseline. Secondary account/capture actions and grouped preferences were visually reviewed.
  • Loading and cancellation: private choice changed the initial label without starting collection. A FR/dark synthetic run showed public + private scope and live feedback beside Stop. Stop preserved 1,845 contributions, displayed the cancellation notice, removed the grid pulse and replaced Stop with Refresh at the identical coordinates. No real Hub account was scanned.
  • Complete result and capture: a second synthetic run reached 4,359 contributions, one pulse phase and exactly one finale. Capture was disabled during collection, enabled on completion, and opened its overview. Returning restored exploration and keyboard focus to Capture. PNG generation was not repeated.
  • Environment: one Chromium renderer crash occurred during the first streaming inspection; the page was reloaded. The repeated narrow-screen collection/Stop flow completed successfully. The remote Gradio process reported no application traceback. This is recorded as a browser-test limitation, not attributed to or claimed fixed by the CSS changes.
  • Dependencies and authentication: Gradio/sdk remain 6.31.0. Official Row/layout documentation and the installed version's configuration were consulted. Only the visible translated sign-out label changed; the native OAuth relay, scopes, collector, cache and formats are unchanged.
  • Limits: no physical iPhone/Safari, real OAuth/private-account scan or GPU inference. Browser data is synthetic. Deployment is checked separately after upload.

v0.4.16 — responsive graphic coherence

Base deployed revision: 7b40444045308b065fb4741a23d6d610a072d96d (0.4.15).

  • Automated frontend: all five Node suites pass. Targeted DOM checks ensure Capture remains separate from the scrolling tabs and that moved private contribution counts retain their switch description. Owner, scope, localization, double-submit, date, cache, motion and navigation regressions remain green. git diff --check is clean.
  • Real Gradio browser checks: Chromium with a responsive iframe at 320, 390, 520, 640, 780, 960 and 1160 CSS px. The welcome document width equals its viewport in every case. Initial action widths: 288, 358, 400, 304, 377, 400 and 400px respectively. The layout stays in two columns at 640/780/960px and stacks without additional gutters on narrow phones. The signed-in header footprint is present in the explicitly labelled synthetic fixture.
  • Collection: at 780px Stop is 76 x 44px on the same row as the 72px year field. At 390px it is 76 x 44px beside collection feedback. At 320px the content viewport/document are both 305px after the browser scrollbar; annual totals and source states use two columns. EN/light and FR/dark were inspected. The existing pulse was measured while loading (brightness 0.947437 in light, 1.093 in dark). A complete synthetic run recorded one pulse phase and one finale.
  • Scope and daily inspection: selecting private scope did not collect; the explicit action produced the public + private view, with the private-count hint in the status area. Selecting January 6 at 320px showed eight synthetic entries and the full localized date. With the Close action present, the date field was 123px wide; its 61px text fit its 61px display area. Document width stayed 305px.
  • Guest check: the production signed-out view exposed a CSS cascade regression: the welcome grid rule overrode the account gate. The account gate now follows every responsive display rule; the deployed signed-out view is rechecked after this fix.
  • Scope of change: CSS and presentation only; the preview now includes a disabled sign-out placeholder to test its footprint. The production OAuth path, collection engine, caches, dependencies and data schema are unchanged. Gradio/sdk_version remain 6.31.0. The 103-test Python baseline from 0.4.15 was not repeated for this presentation-only patch; the actual Gradio application was built and exercised.
  • Limits: browser measurements are desktop Chromium in a responsive iframe, not physical Safari/iPhone. Real OAuth/private-account collection and PNG export were not repeated. Synthetic results contain no account data. The isolated preview is terminated after release. Production version and rendering are checked after publishing the commit.

v0.4.15 — launch layout and collection feedback

Base revision: 7bfcac996522c557759b7f4ce5dce2905ccc6b5d (0.4.14).

  • Automated: 103 Python tests pass, including owner/account isolation, same-request private scope, strict boolean opt-in, stale request rejection and cleared-year errors. The collector, caches, source accounting and error retention remain covered.
  • Automated frontend: five Node suites cover selectors, DOM interactions, motion lifecycle, native-scroll gesture simulations and mounting order. A browser-discovered race between the independent header and dashboard now has a targeted delayed-mount regression. Reduced-motion behavior and duplicate submissions are covered by simulation.
  • Real browser, synthetic data: production Gradio 6.31.0 in Chromium, through a responsive iframe. Desktop 1160px uses a 460px launch group and full-width button. At 390px and 320px, viewport and document widths match, with 16px gutters and buttons of 358px and 288px. EN/light and FR/dark were inspected. These are CSS viewport checks, not physical phone tests.
  • Real browser collection: selecting private repositories changed the initial action without fetching; clicking it produced public + private scope. The full synthetic run recorded one pulse phase and one finale. A refresh showed hc-grid-breathe, brightness 1.15281 and unknown-cell overlay opacity 0.13885 during collection. Stop removed the collecting state and filter, retained received activity and displayed the stopped-collection notice, without a second finale. Switching to unloaded 2025 did not fetch; returning to 2026 restored the cached public + private result.
  • Browser-discovered fixes: Gradio prefixes CSS selectors, so root-state descendant selectors failed to match. View state is now mirrored onto explicit workspace/header IDs. The controller now waits for both independently mounted header and dashboard before constructing counters/tabs.
  • Build: Gradio and README sdk_version remain pinned together at 6.31.0. No collector, OAuth permission, dependency or GPU changes. Archive excludes caches, environments, credentials, temporary fixtures and dependencies downloaded for testing.
  • Limits: real OAuth/private-account collection, physical Safari/iPhone, native OS date picker and PNG export were not repeated for this release. Date, export and error paths retain existing automated coverage. A Gradio CDN stylesheet-preload warning was observed separately from the corrected application mount error; no dependencies were changed to hide it. Deployment is verified separately after committing this release.

v0.4.14 grouped action, neutral pulse and readable dates

  • Desktop: the 240px Load button follows year/privacy instead of being pushed to the far edge by an empty feedback component. Saved-year feedback occupies its own row. The production Gradio 6.31 layout was inspected in Chromium, in dark and light themes, using an explicitly labelled synthetic owner and stream with no Hub account scan.
  • Mobile: at a 320px iframe width, the viewport/document both measured 305px after scrollbar and the control row measured 273px with 16px gutters. Year, two 44px arrow buttons and Private/Privé remain on one row; the explicit Load action is full width. No page overflow was observed.
  • Replaced the focus-gold pseudo-element overlay with a 3.6s grid brightness animation from 1 to 1.09. During synthetic collection computed styles reported hc-grid-breathe and brightness(1.05645), with no cell ::after overlay; after completion the animation/filter were none. Existing reveal/fade/star/finale code is unchanged; the synthetic fixture observed one finale.
  • The date control has a stable visible face and full-sized native input. Empty states read Choose date / Choisir un jour; choosing 2026-01-06 showed Jan 6, 2026 / 6 janv. 2026. At 320px the selected date field measured 123 × 44px with no text overflow. Closing details restored the visible prompt without opening a date picker. Keyboard input revealed native segments and blur restored the visible face. Native change, invalid range, locale switching, clearing and explicit dismissal have DOM regression coverage.
  • Four Node suites pass (frontend, interactions, motion and gestures); git diff --check is clean. Collection logic and Python handlers are unchanged except version labels, so the prior 97-test engine baseline was not rerun. Gradio/sdk remain pinned together at 6.31.0. No real OAuth login, private-data scan or GPU inference was performed. Browser metadata-extension errors were present; they were unrelated to app code.
  • Proofs: validation/welcome-v0.4.14.jpg and validation/date-mobile-v0.4.14.jpg use synthetic data only. Physical Safari/iPhone and its OS date picker remain unverified; the input is still native and directly clickable, without a cross-origin showPicker() dependency. Browser validation used Chromium and a responsive iframe, not device emulation.

v0.4.13 native scrolling, compact scope and gradual fills

  • Replaced competing custom touch movement with a native horizontal scroller. Each edge has a real 72px end cap; 52px of travel into it selects the adjacent year. Touch pointer cancellation is no longer used to infer whether the pan ended. Vertical page scrolling and pinch zoom remain native. Mouse/pen dragging uses the same scroll geometry. Wheel momentum cannot skip multiple years; programmatic scroll positioning cannot initiate navigation. Month browsing remains first, followed by the adjacent year at the edge. Cache-only year handlers, owner isolation and explicit Load/private consent are unchanged.
  • A real initial-mount error was observed in Chromium: the controller could render before the independent private HTML control existed. Initialization now waits for its named toolbar siblings; a regression test mounts that control late and checks automatic recovery.
  • At 320px iframe width (305px content viewport after scrollbar), the 273px control row contains 44px arrows, a 72px year selector and the short Private / Privé switch on the same line. Status spans the next row. App gutters remain 16px; document and viewport widths match. Gradio's native dropdown icon overlapped the year in the first compact attempt; scoped component theme variables now provide a 12px chevron beside all four digits. The native menu was opened and closed successfully. The switch retains its full accessible name and 44px height.
  • Removed the rectangular backing pulse. Browser computed styles during a synthetic scan confirmed no ::before background and hc-grid-breathe on the cell pseudo-element, with an interpolated opacity of 0.035. The grid breathes only while collecting. Updated colours fade for 950ms, confirmed zero days for 1150ms. Pending dates coalesce and active fills retarget from their displayed colour; zero-day confirmation produces no contribution pop or particles. Finale sequencing waits for fills, pops and particles. Reduced-motion/local/cache changes settle immediately. Partial results stay explicitly partial.
  • Validation: 97 Python tests and all four Node suites passed. Targeted cases cover native-scroll geometry, touch pointer cancellation, vertical intent, multitouch/cancel, programmatic movement, wheel inertia, late HTML mounts, zero-day fades and finale waiting. git diff --check is clean. The code continues to pin Gradio and sdk_version to 6.31.0; no engine, schema, dependency or authentication changes.
  • Real production Gradio layout was tested with a synthetic owner and no Hub scans. Desktop mouse dragging restored the exact per-day counts after 2026 → unloaded 2025 → 2026. At 320px, native horizontal wheel scrolling opened the explicit unloaded-2025 state; reversing it restored every day's count and all 2,265 synthetic contributions, with no collection request. The visible fixture observer recorded one pulse phase and one finale for a complete run, and an earlier desktop partial run also recorded exactly one finale. EN/light desktop and FR/dark mobile were inspected. The final mobile proof is validation/controls-mobile-v0.4.13.jpg.
  • Code revision 6bc8f6216ab314435ba34008859f48177cb8f7c8 reached RUNNING. The deployed /config returned HTTP 200 with version 0.4.13, native calendar track and mount guard. The live FR/light guest view was reloaded and inspected with one sign-in action; its DOM reports BETA 0.4.13. Proof: validation/guest-v0.4.13.jpg. No new application errors appeared after the settled-version reload. Physical iPhone/Safari touch, a new OAuth login, real-account collection and PNG export were not repeated. Touch tests simulate native scroll events; the browser navigation checks used mouse and horizontal-wheel input in Chromium. No GPU work. Browser screenshot capture occasionally timed out or returned a preceding frame; the final proof was captured again after the UI settled.

v0.4.12 mobile alignment, progressive reveals and annual scope

  • Narrow screens now use explicit year/arrow columns. Browser inspection identified Gradio's generated form wrapper retaining the selector's old 132px flex basis; the scoped parent/child layout rule now fills the middle column. The wrapper contract is tied to the pinned Gradio 6.31.0 layout and the explicit year ID, without generated class selectors. Private labels wrap beside their switch. Native date fields retain their width when empty and selected, including a Safari-specific value height rule.
  • Collection warnings sit after the calendar and legend. An explicit year heading introduces annual totals, source statuses and diagnostics before the daily inspector. The date heading and bounded activity list remain a separate section. Refresh paths now meet their arrowheads, toolbar strokes have rounded caps/joins, day arrows use SVG chevrons and commits use a horizontal commit symbol.
  • Replaced immediate whole-batch colour changes plus modulo-seven animation delays with one persistent reveal queue. Repeated pending dates coalesce without restarting their reveal; numerical totals and accessible records remain immediate. Only visible cells consume the reveal cadence and particle budget. Earliest pending deadlines prevent repeated incoming updates from extending the tail. Reset, changed scope, cached results, reduced motion, hidden documents and detached charts clear or settle the queue.
  • The calendar backing surface pulses only during the loading phase; text and cell colours are not pulsed. Complete and partial terminal transitions wait for queued reveals and particles before the finale. Partial outcomes keep an amber Finished with gaps label, warning and disabled capture. Cancelled/error outcomes do not display success.
  • Validation: 97 Python tests and all four Node suites passed. After the final pacing adjustment, the motion and DOM interaction suites passed again. New cases verify delayed per-cell colour application, latest-target coalescing, queue cancellation, finale sequencing, partial labels, warning placement and annual/day DOM order. Existing owner, cache, private visibility, navigation, keyboard, details and reduced-motion tests remain green. git diff --check is clean. No collector, cache policy, OAuth scope, schema or dependency changes.
  • Production Gradio layout was exercised in an isolated synthetic-owner fixture with 24-date batches every 600ms. The fixture's DOM observer recorded exactly one collecting pulse state and one finale for a partial run on desktop and at narrow width. The final pacing version also recorded one finale. This observer is fixture-only and does not modify the production engine or authentication.
  • Responsive Chromium inspected at 360px and 320px in FR/dark; EN/light desktop was also inspected. At 320px (305px after the scrollbar), document/client widths both measured 305px. The year selector measured 169px between 44px arrows, with 16px app gutters. The date input measured 123 x 44px with an open day and 173 x 44px after closing it, with an empty value. The annual 90-space fixture statistic appears under Bilan 2026 above the January 6 inspector, never below the day list. Proofs: validation/annual-day-v0.4.12.jpg and validation/mobile-layout-v0.4.12.jpg contain synthetic data only.
  • Code revision 95e205360d3c4ae7a7575d8f5f648869938169eb reached RUNNING. The deployed guest view was inspected in FR/light with one sign-in action; proof: validation/guest-v0.4.12.jpg. Physical iPhone/Safari, real-account scanning, a new OAuth login and PNG export were not repeated. No GPU work. Browser automation occasionally timed out reading the streaming DOM; screenshots and the fixture's visible observer confirmed the resulting states. This is not a physical-device performance benchmark.

v0.4.11 retained snapshots and independent gesture paths

  • Reproduced cache loss on the previous release: complete/partial snapshots survived year navigation, while cancelled/error snapshots returned as unloaded years. Both terminal phases now retain counts, daily records, notices and private visibility in the bounded owner-scoped session cache. An interrupted refresh cannot overwrite an existing complete cached result. No private data is stored in the shared cache or browser storage.
  • Include private is now a stable standalone HTML control beside the native year selector in the workspace row. It wraps below the selector on small screens for legibility. There is no reparenting of native Gradio components. The switch remains local/setup-only and never starts a scan.
  • Reproduced missing horizontal-wheel navigation: the previous implementation had no wheel handler. Trackpad/wheel input now pans months and changes year beyond an edge; one gesture and its inertia can advance at most one year. Touch uses a dedicated non-passive horizontal-move path independent of pointer cancellation. Vertical movement, pinch zoom, cancellation, bounds and busy guards remain. A translated target-year cue makes edge dragging visible.
  • 97 Python tests and all four Node suites passed. Regression cases cover stopped/error round trips, private-visibility restoration after an unloaded year, completed-cache protection, TouchEvent cancellation and multiple fingers, wheel thresholds/inertia, vertical movement and interior month panning. git diff --check is clean. Dependency pins and Gradio SDK version remain aligned at 6.31.0.
  • Real production Gradio layout with a synthetic owner, never a Hub account scan: browser horizontal wheel changed completed 2026 to unloaded 2025 and restored all 2,780 contributions. After an explicit Stop on a separate synthetic stream, 2026 → 2025 → 2026 restored 2,502 contributions with identical counts for every rendered day and the stopped notice. The private control appears beside the year. Proof: validation/controls-cache-v0.4.11.jpg (synthetic data).
  • Responsive Chromium rendering checked at 360px and 320px iframe widths, in EN/light and FR/dark. At 320px, document and client widths both measured 305px after the scrollbar; no page overflow. Private setup opened without a Stop action or collection. Proof: validation/controls-mobile-v0.4.11.jpg.
  • Code revision cdb58f0cddcdb09e31596033556373af7b8a15b7 reached RUNNING; the deployed guest view was inspected in FR/light with one sign-in action and no scan form. Physical iPhone/Safari touch, a new real OAuth login, an actual Hub scan and PNG export were not repeated. Touch behavior is covered by deterministic events, not a physical device. No GPU inference.

v0.4.10 integrated controls and reliable year gestures

  • The native year selector and collection action now belong to the calendar workspace, below its compact account identity, activity tabs and totals. The redundant readonly account field stays mounted for authenticated event inputs but is not part of the visible layout. Previous/next controls surround the single selector. Load appears for new years; Refresh appears for an existing result. Gradio components are not reparented.
  • Unloaded years show a prominent localized message, outlined days, no numeric total and no day inspector. Their accessible day labels say Not loaded rather than zero contributions. A completed empty year still displays a real zero. Cache navigation never starts a Hub collection. Initial year arrows only prepare the welcome form; clearing the selector after a result restores its displayed year.
  • Reproduced the touch failure before fixing it: transferring implicit capture from a day button to the calendar produces a bubbling lostpointercapture event. The old listener cancelled the gesture. It now responds only to capture loss on the scroller itself. Diagonal intent is resolved conservatively, final pointer-up travel is included, and a continuous drag may pan months then cross an edge by 56px to select the adjacent year. Busy, pending, bounds, cancellation and release-click guards remain.
  • Validation: 91 Python tests and four Node suites passed. The Gradio integration subset (6 tests) also passed after adding independent localization to the new HTML controls. git diff --check is clean. The gesture regression failed on v0.4.9 and passes on this version, including capture transfer, diagonal/vertical paths, fast release, edge crossing, busy state, bounds and cancellation.
  • Real Gradio browser fixture with a synthetic owner and synthetic stream: initial year preparation, explicit collection, translated controls, dark/light rendering, desktop dragging to an unloaded year, dragging back to a cached year, and native selector synchronization were checked. Responsive rendering was inspected at 360px and 320px iframe widths. At 320px, the scrollbar leaves a 305px document viewport; both document/client widths measured 305px and root padding measured 16px. Horizontal overflow is confined to the calendar/tabs.
  • Proofs: validation/calendar-v0.4.10.jpg and validation/unloaded-mobile-v0.4.10.jpg show synthetic activity, not the account's real contributions. validation/guest-v0.4.10.jpg shows the deployed public guest view. Code revision 8c64c1625fcf075e2c1f2510c46642e38b8a067e was published to the existing Space.
  • Limitations: physical iPhone/Safari touch was not tested. Touch capture uses deterministic simulated pointer events; browser dragging used Chromium mouse input. No real account scan, new OAuth login, GPU inference or PNG export was repeated. Engine, dependencies, OAuth scopes and data formats remain unchanged.

v0.4.9 form transition, persistent day details and year gestures

  • Split the presentation-only welcome from the native form and explorer. The form follows the welcome in document order. A 620ms grid-row collapse moves it upwards without reparenting Gradio controls; reduced motion removes the transition. Explicit launch provides immediate request feedback, with a recovery message if no snapshot arrives. If the form moved above the viewport, it scrolls back to a 16px top margin. Shared component foundations now live in theme.css so guest and owner views keep the same typography, palette and button styles.
  • Removed document-level outside-pointer dismissal. Close, Escape, a cleared date input and a second click on the selected day remain deliberate deselection actions. The browser fixture confirmed an outside click leaves the selected day open. Simulated pointer tests cover vertical movement, short drags, pointer cancellation and click suppression after dragging.
  • Added previous/next-year controls and horizontal dragging with a 64px threshold. On narrow calendars, an interior drag scrolls months; only a new outward drag starting at an edge changes year. Busy state, pending requests and 2018/current-year bounds are enforced. Native vertical pan and pinch zoom remain enabled. Keyboard day navigation is unchanged; year buttons are 44px targets with translated labels.
  • Year selection, including the native dropdown, is cache-only. An uncached year has an explicit Not loaded state and requires Load. Cached private data still requires the owner and preserves visibility; a public-only cached year remains available when navigating from a private view. The custom event rejects stale run/year identifiers, invalid years, other owners and active collections. Native year input stays synchronized. No collection engine, OAuth scope, counting-key or dependency changes; year_preview is an additive UI snapshot flag.
  • All 89 Python tests and three Node suites pass; git diff --check is clean. New regressions cover cache-only navigation, explicit collection after an unloaded view, owner isolation, stale/out-of-range requests, mixed private/public caches and session reservations. Gradio 6.31 custom HTML trigger/watch guidance was reviewed; sdk_version and pinned requirements remain aligned.
  • A separate Gradio 6.31 application used the production layout and handlers with a labelled synthetic owner and synthetic collection stream, never a real Hub scan. Desktop form top changed from 550px before launch to 100px after collapse. Browser dragging changed 2026 to unloaded 2025; Next year restored the cached 2026 result. The native selector displayed the selected year. EN/light and FR/dark were inspected.
  • At 320px mobile iframe width, the vertical scrollbar left a 305px document viewport; document/client widths matched and the form width was 273px at x=16. After launch and automatic recovery scrolling, its top was 16px. At 360px, the initial welcome, form and private toggle were inspected. A browser mouse drag inside the narrow calendar moved scrollLeft from 0 to 155 while retaining 2026; after returning to the edge, a fresh outward drag selected unloaded 2025. Proofs: validation/welcome-v0.4.9.jpg and validation/navigation-mobile-v0.4.9.jpg (synthetic owner).
  • Code revision 5a89bb97db8024ff32e6742699890bd594ce2b9b reached RUNNING. The actual public Space guest UI was inspected in EN/dark and FR/light, with one sign-in action, retained illustration, translated controls and no scan form for guests. Proof: validation/guest-v0.4.9.jpg. A full real OAuth login, private-account scan, physical touch/Safari device and PNG export were not repeated. Touch pointer semantics and reduced motion have deterministic regression/CSS checks; browser drags used a mouse in Chromium. No GPU inference.

v0.4.8 separate outer gutters from welcome scale

  • Kept the app's single 16px mobile gutter. Removed the welcome's extra horizontal desktop/tablet inset and the illustration's 408px cap. Enlarged the title, body and sign-in target modestly; retained the approved minimal composition, unchanged logo, themes and decorative colour animation.
  • At the live 1363px desktop viewport, the illustration measures 580.8px wide and cells measure 20.36px, compared with the former 408px cap. At 360px, the welcome is 328px wide at x=16; at 320px it is 288px wide at x=16. Both document/client widths match, with no horizontal page overflow. Mobile uses a 440px decorative calendar plane with 14.5px cells, softly clipped inside the content area. The real activity calendar is unchanged.
  • Code revision 17f7f73571b44772907407ad94627cbf269c1850 reached RUNNING. Visually checked the live guest app on desktop in FR/light and EN/dark, and through Chromium iframes at 360px FR/light, 320px FR/dark and 360px FR/dark. Theme and language controls remain usable. Proofs: validation/welcome-v0.4.8.jpg and validation/welcome-v0.4.8-mobile.jpg.
  • git diff --check is clean. This correction changes welcome CSS plus version/documentation only; assets/theme.css is byte-for-byte unchanged. Existing automated suites were not rerun for this visual scaling fix. No engine, API, OAuth, dependency or account-data changes. No new sign-in, live collection, physical-phone/Safari validation or GPU inference was performed.

v0.4.7 airy welcome and mobile gutters

  • Applied the approved light/dark composition: lighter two-line title, one-line guest description, compact outlined sign-in action and a 24 × 7 straight calendar fragment. The original staggered three-square logo CSS is byte-for-byte unchanged. Removed the welcome eyebrow, guest note, oversized illustration and decorative header/footer rules. The version remains in source/configuration and fetched-data diagnostics.
  • The illustrative calendar is independent of account data. Three staggered CSS colour accents use a 24-second cycle; global keyframes avoid Gradio's nested CSS limitation. The real deployed page showed the declared animation and an interpolated cell colour while neighbouring accents remained at rest. Reduced-motion CSS disables the accents. No timers or Hub requests were introduced for this illustration.
  • Increased the single outer gutter to a minimum of 16px. The mobile header reserves the logo's natural width and lets the sign-out label wrap. Theme/language controls retain visible pressed and keyboard focus indicators with 44px targets. Page, native controls and canvas background colours remain aligned with neutral light and blue-black dark palettes.
  • 22 targeted Python authentication/Gradio contract tests and all three Node suites pass. Existing welcome assertions were updated for the concise translation, neutral palette and 168 decorative cells. git diff --check is clean. No engine, OAuth, API or dependency changes. Final mobile header adjustment was CSS only.
  • The labelled synthetic fixture verified the initial authenticated state and private setup in EN/FR at 320px. Its header logo height is 28px, with a 288px content area at x=16. A selected day's 12 records stayed in a 300px scroll area; after the vertical scrollbar reduced the viewport to 305px, document/client widths were equal and the real calendar wrapper was 273px wide at x=16. No real account data was used.
  • Code revision ff45bbdfe9bec03024681c467ad2e385c39d3778 reached RUNNING. Live guest UI was visually inspected in EN/dark and FR/light on desktop, plus FR/dark at 360px and FR/light at 320px through a browser iframe. At 360px, content width is 328px at x=16, with equal document/client widths. At 320px, document/client widths are also equal; the sign-in target is 243.7 × 46px at x=16. Proofs: validation/welcome-v0.4.7.jpg, validation/welcome-light-v0.4.7.jpg and validation/mobile-v0.4.7.jpg.
  • This pass did not repeat a full OAuth login, live authenticated scan or PNG download. Initial owner states and activity details used synthetic regression data. Responsive Chromium is not physical-phone/Safari verification. Reduced motion is covered by CSS/regression coverage, not fresh browser preference emulation. No GPU inference.

v0.4.6 straight welcome grid correction

  • Corrected the previous interpretation of the selected mockup: the welcome grid must be straight. Removed desktop and mobile perspective and rotation transforms. The existing logo, colours, glints, text and application behavior are unchanged.
  • All three existing Node regression suites pass; git diff --check is clean. No new tests or Python-suite rerun for this CSS-only visual correction and version bump.
  • Code revision 8182eab99f6dd8339a9b93d72baff48ba7ed1546 reached RUNNING. Inspected the actual guest app in desktop EN/light, EN/blue-dark and a 360px iframe in FR/blue-dark. Computed transform and perspective are both none on desktop and mobile. At 360px, document and client widths are equal, with no horizontal overflow.
  • Proofs: validation/welcome-v0.4.6.jpg and validation/mobile-v0.4.6.jpg. Browser verification uses Chromium, not physical iOS/Safari. No new OAuth login, activity collection or GPU inference was performed.

v0.4.5 approved welcome composition B

  • Applied the approved second visual direction: two-line introduction on the left, enlarged contribution-grid illustration on the right with mild perspective, a single sign-in action and no capability strip. The current staggered three-square logo and its CSS are preserved exactly. Credits remain visible. EN/FR wording stays factual.
  • Extracted the decorative welcome into assets/welcome.js and assets/welcome.css. Its 84 static tiles, one highlighted tile and three subtle glints have no dates, account data, interactive controls or Hub requests. Theme changes preserve the tile DOM. Reduced-motion CSS makes the glints static. Authenticated privacy setup and the native sign-in forwarding path are unchanged.
  • 22 targeted Python authentication/Gradio contract tests and all three Node suites pass. Updated assertions cover the non-interactive illustration, tile count, theme identity and translated welcome states; existing owner, privacy, calendar, details and motion tests remain green. git diff --check is clean. No collection engine, OAuth scope, API or dependency changes.
  • Code revision 8c45070999e76342156299e2849c18e024cbf248 reached RUNNING and was visually checked in the real Gradio app: FR/blue-dark and EN/light on desktop. At 360 CSS px, the live app in a browser iframe had equal document/client widths of 360px, a 344 × 52px sign-in target at x=8 and no horizontal page overflow. Mobile FR/blue-dark was inspected with the full header, CTA, illustration and credits. Proofs: validation/welcome-v0.4.5.jpg and validation/mobile-v0.4.5.jpg.
  • Browser checks exercise the real guest UI. Authenticated states use existing simulated regression coverage; a full OAuth login and activity collection were not repeated. Responsive Chromium is not a physical-phone or Safari test. Reduced-motion behavior is covered by CSS and regression tests, not a new browser preference emulation. No GPU inference.

v0.4.4 factual welcome and compact activity composition

  • Replaced the full-width calendar card and numbered promotional explanations with a two-column introduction, single sign-in action and four compact illustrative matrices. Category descriptions identify repository, community, reaction and paper coverage. A short definition list describes filtering, daily records and PNG export. EN/FR text now describes functionality directly. Decorative matrices have no interactive controls, account data or network actions, and rebuild only on theme changes.
  • 22 existing Python authentication/Gradio contract tests and all three Node suites pass. Updated preview assertions verify the four non-interactive samples; existing owner, privacy, calendar, day-filter and motion checks remain green. git diff --check is clean. No engine, dependency, OAuth or API changes.
  • Code revision c2a3aa50de466dedc5ee8bbcca51930a98215052 reached RUNNING and was visually checked in the real Gradio app. EN/light and FR/blue-dark were inspected on desktop and in a 360px iframe. At 345px content width with the browser scrollbar, document and client widths were equal; the sign-in target measured 329 × 48px at x=8. All four sample matrices fit without horizontal scrolling. Proofs: validation/welcome-v0.4.4.jpg and validation/mobile-v0.4.4.jpg.
  • This pass exercised the real guest UI and simulated authenticated states in regression tests. A full OAuth login and real activity collection were not repeated. Responsive Chromium checks do not constitute physical-phone or Safari validation. No GPU inference.

v0.4.3 welcome, daily filters and intensity

  • Enriched the welcome screen with an explicitly illustrative calendar and three concise explanations of progressive collection, daily exploration and full-year export. It makes no Hub requests and does not populate account data. The single sign-in action and owner-only access are unchanged.
  • Removed daily pagination. All retained records render in one keyboard-scrollable list, bounded to 330px on desktop and 300px on mobile. Category breakdown buttons filter that list immediately, preserve focus, and do not change the annual calendar or request data. All activities restores the complete list. Private visibility continues to apply to the filters, counts and records.
  • Calendar, preview, legend and PNG export share six positive intensity levels: 1, 2–3, 4–7, 8–15, 16–31 and 32+, plus zero. Legend swatches expose exact ranges; the legend has a translated accessible description.
  • 22 targeted Python authentication/Gradio contract tests and all three Node suites pass. New assertions cover all-record rendering, local filters without callback/fetch, private-hidden zero-count categories, focus/scroll preservation and reset, seven distinct colours, intensity boundaries and the isolated welcome preview. git diff --check is clean.
  • Production frontend was exercised in a labelled synthetic fixture: all 12 records occupied a 330px scrolling list (923px content), keyboard End reached the final record, Models reduced the list to two records, All restored 12, and hiding private under Models showed zero while All retained nine public records. The same fixture at 345px content width had no page overflow, 44px category targets and a 300px list containing all 12 records. Proof: validation/day-list-v0.4.3.jpg. This image contains synthetic events, not account data.
  • Code revision e6f7c75126893d52e62d5d5cf963fc9bfea13ec0 reached RUNNING. Live Gradio guest rendering showed BETA 0.4.3, the expanded welcome and one sign-in button in FR/blue-dark and EN/light. Proof: validation/welcome-v0.4.3.jpg. A 360px iframe containing the actual Space had equal client/scroll widths and a 344px-wide, 48px-high CTA at x=8. EN and FR were exercised. Proof: validation/mobile-v0.4.3.jpg. This is responsive Chromium verification, not a physical-phone or Safari test.
  • All events means all details retained by the existing collector. Metadata limits (50 per date/type and 12,000 per collection), API coverage and the explicit excerpt warning remain unchanged. Dependencies, collection, auth and private opt-in logic are unchanged. A real OAuth login, authenticated scan and PNG download were not repeated in this pass; export colour sharing is verified by its use of the same tint function. No GPU inference.

v0.4.2 layout and daily activity

  • Consolidated brand, account action and preferences into one responsive header. Removed the obsolete account row, the empty guest search row and decorative welcome calendar; balanced welcome text and its single action. Direct Space rendering reserves room for the observed HF platform badge ID. Dependencies, OAuth scopes and collection logic are unchanged.
  • Selected dates now have one heading beside the date navigation and SVG close action. Daily activity has a compact category breakdown, full-row safe Hub links, SVG icons, titles, concise repository/collaborator context, private badges and aligned UTC time. The owner is not redundantly credited on every row. Three entries appear initially, only the list scrolls, and Show more scrolls/focuses the newly revealed entries. Empty days omit the unused footer.
  • 22 targeted Python authentication/Gradio contract tests and all three Node suites pass. Interaction assertions cover the single selected-date heading, focus after Show more, close/reset and existing date/privacy behavior. git diff --check is clean.
  • Production frontend rendered in a clearly labelled standalone synthetic fixture. EN/light and FR/blue-dark were inspected. The 246px list showed three initial records, then newly revealed entries with private badges. Hiding private changed the selected-day total from 12 to 9 and removed private badges. Partial state displayed its warning; an empty day displayed its empty message. Closing details cleared the date and restored focus to the calendar. No account data or Hub requests were used by this fixture. Proof: validation/details-v0.4.2.jpg (after Show more).
  • In a 360px browser iframe with a 345px content viewport, the synthetic frontend had equal client/scroll widths. Category counts moved above the list, long titles wrapped/clamped without horizontal overflow, and six then nine retained records stayed inside the 246px list. This is a responsive Chromium check, not a physical-phone or Safari test.
  • Final code revision b285d7d715992fb8df038bdd6ef2f2b4c5c834bd was visually verified live as BETA 0.4.2. The guest header measured 65px, the obsolete search row had display:none, and only one login button was visible. Proof: validation/welcome-v0.4.2.jpg.
  • The deployed Space was also embedded at 360 CSS px: client and scroll widths both 360px, login CTA x=8 / width=344 / height=48px, two-row mobile header height 103px, search row hidden. EN/light and FR/light were observed. Proof: validation/mobile-v0.4.2.jpg.
  • A complete real OAuth login and authenticated live scan were not repeated. Connected daily data, private records and category examples in this pass are synthetic; guest Gradio rendering is live. No GPU inference.

v0.4.1 single sign-in action

  • Removed the redundant guest header button from layout, accessibility tree and keyboard navigation. The welcome CTA retains the native OAuth forwarding path. Once authenticated, the header account action remains available for signing out. Authentication and collection logic are unchanged.
  • 22 targeted Python authentication/Gradio contract tests and all three Node suites pass; git diff --check is clean. A computed-style check with the production CSS confirmed the header is hidden before hydration and for guests, and visible for a simulated authenticated state.
  • Code revision ac81e8fde663cbbca4b085bde055a48f5fa1392d reached RUNNING. Live Chromium shows exactly one visible sign-in button in EN/light and FR/blue-dark. Clicking it reaches the real HF login form with the Space callback. No credentials were entered. Proof: validation/login-v0.4.1.jpg.
  • Full OAuth login/logout, a new narrow viewport and physical phones were not exercised in this pass. Previous owner/access regression coverage and limits remain below.

v0.4.0 owner-only access

  • Existing Gradio 6.31 OAuth session injection and HF Sign-in documentation reviewed; read-repos scope is unchanged. No new permissions are requested.
  • Added direct-handler regressions for anonymous, expired and mismatched identities across main load, year navigation, private load and Refresh, including retained private snapshots. Added owner hydration, authenticated cache reuse, and HTTP transport tests proving tokens reach repository/profile endpoints while private reads remain opt-in.
  • The recent-activity endpoint remains deliberately anonymous. Its shared quota is a known remaining limitation; this release does not claim to solve all concurrency or quota issues.
  • 78 Python tests and all three Node suites pass; git diff --check is clean. OAuth identities and repository HTTP responses in these automated tests are simulated.
  • Code revision e1e34679e695ed5791a4635303eb18f93050e5b7 reached RUNNING. Live Chromium shows BETA 0.4.0, a dedicated sign-in screen, no editable profile/year/scan controls for guests, and no API footer. EN/light and FR/blue-dark states were checked. The central sign-in action reaches the real Hugging Face login form with the correct Space return URL; no credentials were entered. Proof: validation/owner-v0.4.0.jpg.
  • The deployed API description lists only the native /_check_login_status endpoint. The removed /activity route returns Gradio's generic HTTP 500 for an unknown function; it does not return activity. A direct internal prediction is rejected with HTTP 404 because the queue is required. A separately submitted anonymous queue event reached the actual load handler and returned the sign-in-required error, an empty run ID/viewer and allow_private=false through completion.
  • A complete real OAuth sign-in and authenticated public/private scan were not exercised. Token routing, ownership rejection, private filtering and cached-owner flows have deterministic tests, not a live account-quota measurement. This pass did not validate a physical phone, Safari or a new narrow viewport; the prior responsive checks remain recorded below. No GPU inference is involved.

v0.3.6 additional UX audit

  • Before correction, four deterministic tests reproduced delayed private visibility targeting another year, cached results replacing an active scan, a no-op Refresh after session expiry, and a delayed Refresh targeting the wrong current result. Network responses and OAuth profiles in these tests are simulated.
  • Live v0.3.5 Chromium reproduced an empty date field with the January 28 detail still open and the day still selected. Selected cells had no pressed state. Invalid @fffiloni input retained the valid 2026 result (4,697 activities), with an explicit validation notice, but a native button reverted to English after the activity session expired.
  • Added per-session collection reservations, originating-run checks, explicit-action recovery, retained language and synchronized date selection. No collection engine, API format or dependency changes.
  • 62 Python tests and all three Node suites pass; git diff --check is clean. New cases cover independent sessions, reservation release on errors/generator close, expired private-action ownership checks, retained language, action payloads, date clearing and selected-state accessibility.
  • Code revision c7694c7e903f461873a6c8373e9b6534a467615f reached RUNNING normally. Live Chromium showed v0.3.6 and restored FR/blue-dark. A fresh public 2026 scan completed with 4,698 activities and all five sources ready. Moving sparkle effects were visible during collection.
  • In the deployed app, selecting January 28 exposed aria-pressed=true and three entries. Clearing the native date field closed details and set the cell to false. Typing an out-of-year date restored January 28. ArrowRight selected February 4, moved focus to that day, and Escape cleared it while focusing the calendar.
  • Invalid @fffiloni input retained all 4,698 activities and displayed a French error. The native button remained French. Correcting the field and pressing Enter restored the cached result. Guest private intent opened the sign-in explanation with an unchanged total and no scan.
  • EN/light and FR/blue-dark were checked. At 400% desktop Chromium zoom, viewport and document both measured 337 CSS px; the calendar and date controls were 321px wide at x=8. Three day entries occupied a 240px bounded area. This is not a physical-phone test.
  • Capture overview displayed all categories with the same global total. Explicit Refresh immediately disabled its action with a French acknowledgement, then performed a real scan and returned to 4,698 activities, five ready sources and an enabled Refresh button. Final proof: validation/ux-v0.3.6.jpg.
  • Runtime startup logs contained three ignored BaseEventLoop.__del__ / invalid-file-descriptor exceptions, with no app-owned frame. The app remained RUNNING and completed the public scan. These warnings were not suppressed; their originating dependency is not established by this trace.
  • Session-expiry, delayed-response and private-owner scenarios use deterministic simulated requests. No authenticated OAuth/private scan, physical iOS/Android or Safari test was performed.

v0.3.5 UX audit

  • 54 Python tests and all three Node suites pass. New regressions cover initial year selection without collection, shared click/Enter submission, returning to the private owner, scoped summary counts, endpoint-date dismissal and Refresh visibility after invalid input.

  • Before correction, live Chromium reproduced a no-op Enter key, automatic first collection on year selection, and a disabled Previous day button left behind after dismissing January 1. A missing-profile error exposed Refresh without a result.

  • Public 2026 data loaded with 4,694 contributions. Details initially showed three of 47 retained entries, in a 270px scrolling area; closing them focused the calendar without opening the date picker. Capture from the Reactions tab retained the global total and all eight categories. The downloaded PNG was opened and visually verified at 2800 × 3080.

  • A live public 2024 scan was stopped at 418 activities: the stopped notice retained results, every unfinished source reported stopped, capture remained disabled and no completion badge appeared.

  • EN/FR changes preserved the selected tab and totals. Fresh reload restored FR and dark mode. A tab left open across the previous deployment initially had stale backend language state; reloading restored coherent native labels.

  • Code revision 37c02990813d6c40f15a5fed16c615a74007cf89 reached RUNNING. Live verification confirmed the initial 2025 choice stayed idle with no stop control; Enter then started collection. Repository/model summaries displayed only the selected creation/commit counts. Closing January 1 restored Previous day. At 400% zoom: 337px client width, 337px document width, 321px calendar at x=8, and local 740px calendar content.

  • A fresh public 2025 scan finished partial at 3,085 activities, with an explicit missing-discussion-metadata warning; 2026 finished complete at 4,695. Light/EN and blue-dark/FR views were exercised.

  • A final keyboard check reproduced Escape closing an underlying day instead of the visible capture view. A focused DOM regression now protects the corrected priority and preserves the selected day. The final patch is deployed at 83119d0f6cdd33cb36e3f70657b7c9c8507bf5a1; its browser check is recorded below.

  • Returning to 2025 showed 3,085, Cached result, both saved years, retained partial warning, no completion badge and no finale replay. The signed-out private switch retained the total and only opened setup.

  • The final deployment encountered two build failures with code 128; the logs only contained Build Queued. A factory rebuild completed and the Space returned to RUNNING, without dependency changes. The rebuilt app showed a missing-profile error without Refresh and accepted an explicit retry using Enter.

  • Final rebuilt-instance verification: public 2026 completed with all five sources ready and 4,696 activity units. Escape exited capture while retaining the selected January 28 and restored focus to Capture overview. Models showed 7 contributions = 2 creations + 5 commits. Proof: validation/ux-v0.3.5.jpg.

  • Authenticated private access remains covered by simulated profiles, not a real OAuth session. Narrow rendering was checked in desktop Chromium at 400%, not on physical iOS/Android or Safari.

Previous v0.3.4 targeted validation

  • 51 Python tests and all three Node suites pass. Regressions cover private intent versus explicit collection, instant filtering, current-viewer metadata, initial authenticated scans, one-use OAuth form drafts, completion choreography, cancellation and reduced motion. git diff --check is clean.

  • Production frontend tested in foreground Chromium with clearly labelled synthetic data. The final wave and larger stars were captured in light and dark themes. Proof: validation/finale-v0.3.4.jpg and validation/finale-light-v0.3.4.jpg.

  • Synthetic owner flow: the private switch left the public total at 328; the explicit load action added 57 simulated private activities (385 total); hiding them immediately restored 328 and reported 57 hidden contributions. Guest and other-profile states are covered by DOM regression tests. No real private account data was used.

  • At 400% zoom (337 CSS px viewport), the setup panel is 321px wide at x=8px, with a fully visible 44px-high action and no document overflow. This is a narrow desktop viewport check, not a physical-phone test.

  • A signed-in owner was also simulated from the empty screen: switching on caused no collection; the separate Scan public + private action started the synthetic result directly, with no prerequisite public scan. OAuth drafts are tested for profile/year preservation, expiry, single use and unavailable storage. Real OAuth sign-in has not been exercised.

  • Live Gradio validation: a public fffiloni / 2026 scan completed with all five sources ready and 4,692 activity units. The signed-out private switch retained that total and opened the contextual sign-in prompt without fetching. Proof: validation/private-live-v0.3.4.jpg.

  • Final code revision 33a735dbfb1ade64a27516de537ce7db19f29277 reached RUNNING and its initial private control was checked in the deployed app, including the contextual sign-in action. The header controls remain accessible below the floating HF badge. At 400% zoom the initial private panel is 321px wide at x=8, with no document overflow. Proof: validation/private-initial-v0.3.4.jpg.

  • The finale was visually checked with synthetic data, not captured during the real public scan. No authenticated private activity was collected. The original Space remains unchanged at 673f6eb380708ee2ae5a0b1cdc533b9b6393716c.

Previous v0.3.3 targeted validation

  • 49 Python tests and all three Node suites pass. New regressions cover count increases on already coloured cells while their pop is running, all five burst lifetimes, four-burst spacing, and reserving the animation budget for dates within a horizontally scrolled viewport.
  • The production frontend was served in a standalone, explicitly labelled synthetic motion lab. Chromium foreground rendering was visually inspected in light and blue-dark themes, with 250 ms batches on both empty and already filled calendars. Successive screenshots show visible outlined stars moving away from the cells. Proof: validation/motion-light-v0.3.3.jpg and validation/motion-dark-v0.3.3.jpg. These screenshots use synthetic data, not a live Hub scan.
  • At 400% browser zoom (337 CSS px viewport), the synthetic calendar starts at x=8px, has width 321px and scrolls its 744px content locally. No global horizontal overflow. Successive screenshots show moving stars in the visible months. This is a narrow desktop browser check, not a physical-phone test.
  • Deployed code revision 27f3e807b311060fad6f75e15cbc85f0099760ef reached RUNNING. In foreground Chromium, a fresh public scan of fffiloni / 2026 visibly emitted moving stars while real counts rose (including at 1,328 activities). Live proof: validation/desktop-v0.3.3.jpg. The scan completed with all five sources ready and 4,690 activity units; no bursts remained afterwards. The brief final sweep was not captured in this live run; its sequencing is covered by the deterministic tests.
  • Light/dark switching preserved the running scan. No authenticated private activity was fetched. The original Space remains at 673f6eb380708ee2ae5a0b1cdc533b9b6393716c.

Previous v0.3.2 targeted validation

  • 49 Python tests and all three Node suites pass. The added motion suite simulates rapid batches on the same cell, neighbouring first fills, the burst cap, differing particle completion times, old pop callbacks, scope reset during completion, and reduced motion.
  • Particles now live in a non-interactive layer above the grid, independently of cell transforms. Three bursts maximum; new anchors within 48 CSS px of a running burst are skipped. Counts always update regardless of decorative effect admission.
  • Removal follows animation finish events, with no per-burst timeout. The whole-calendar sweep waits for the remaining real animation lifetimes. Changing view or run invalidates obsolete completion callbacks.
  • Live Chromium validation on code revision d443012d41304f5d41d10a0a217c8b8ca9780f06: the particle layer is above cells (z-index 3), with no more than three bursts. Across five samples, the real total advanced from 1,142 to 1,184 while ongoing bursts kept identical anchor coordinates and continued their transforms/opacity without restarting.
  • Public 2026 collection finished with all five sources ready and 4,688 activity units. The ready state appeared while the last two bursts finished, then no bursts or scaling cells remained. Completion sequencing is additionally covered by the deterministic motion test; the brief live sweep itself was not captured.
  • Browser proof: validation/desktop-v0.3.2.jpg. This pass used desktop Chromium; previous narrow-viewport checks are recorded below. No authenticated private data was collected.

Previous v0.3.1 validation

Checked on 2026-11-11 with Python 3.12, Gradio 6.31.0 and jsdom 26.1.0.

Automated checks

  • 49 pytest cases pass: counting, isolation, cancellation, session caches, Gradio/OAuth contracts, separate 401/403 errors, retry timing, cancellation during backoff and explicit private collection.
  • Node tests pass, including actual controller modules in a simulated DOM. Clicking the private switch with missing data causes no fetch; the separate Load private activity button triggers one guarded request. Loaded privacy changes remain instant and unqueued.
  • Changing years cannot initiate private collection. Cached authorized private snapshots can still be reused.
  • HTTP tests use mock transports. They do not establish real account permissions or reproduce a live 401/403.

Browser reproduction before correction

  • In the live v0.3.0 browser, Gradio wrapped css_template inside a selector. CSSOM omitted all four application @keyframes definitions; sparkle, loading spinner and completion effects could not run.
  • At 175% browser zoom (779 CSS px viewport), the application accumulated 28px outer padding and 32px Gradio main padding per side. At desktop width, the same cumulative padding was present.
  • A live public 2026 collection completed with all five sources and 4,684 activity units. No authentication was used.

Changes and verification status

  • Keyframes now load globally through launch(css_paths), outside the nested component stylesheet.
  • Gradio main wrapper padding is removed at all viewport widths. Outer padding is fluid and becomes 8px on each side on mobile.
  • HTTP 429 pauses use server reset/retry headers without a 20-second truncation. Anonymous workers share the pause. It is cancellable and its reason appears in the calendar. HTTP 401/403 remain actionable partial results rather than automatic retry loops.
  • Deployed application observed in Chromium on the HF Space. All four global keyframes appear in CSSOM. For the same cells, successive real samples changed sparkle transform from scale 0.3 / translation (-0.9, 1.2) to scale 0.673 / translation (0.492, -0.656), and opacity from 0 to 0.795. Source spinners also render correctly.
  • Desktop and actual browser zoom at 175%, 300% and 400% were inspected. At the final 400% viewport (~340 CSS px), content starts at x=8px and measures 321px; brand, search, toolbar, tabs and date controls have no global horizontal overflow. The calendar retains its own horizontal scroll. These are narrow browser viewport checks, not physical-phone or touch tests; DevTools emulation was unavailable.
  • EN/light and FR/blue-dark observed. Theme/language changes preserved the profile, year and totals.
  • Public 2026 completed with all five sources and 4,686 activity units in the final code run. Public 2025 finished partial with 3,085 activity units because a discussion feed record omitted discussion metadata, not because of an observed HTTP access denial. This warning and partial status were retained.
  • Returning to 2026 showed the same 4,686 total, Cached result, both saved years, ready sources and no completion effect replay.
  • Browser proof: validation/desktop-v0.3.1.jpg. Code deployed at 0f912f9626260ff4328fd2b8029d57ae72a76bbd; release tag v0.3.1 includes this verification and the complete source archive. The original Space remains at 673f6eb380708ee2ae5a0b1cdc533b9b6393716c.

Limits

  • Authenticated private collection has only simulated-profile tests; no private account data was collected during validation.
  • A genuine Hub access denial cannot be repaired by the app; the account must already have permission. Public feed history is not an exhaustive archive.
  • Metadata caps: 50 records per day/type and 12,000 per collection. Totals count every collected event.
  • Previous runtime startup emitted asyncio event-loop cleanup warnings (Invalid file descriptor: -1); no filters hide them.
  • CPU application, no GPU inference.