Build the Wolfskin TV Home feed #31

Merged
justinzeus merged 14 commits from fm/tv-slice3-home into main 2026-11-05 21:34:30 +01:00
Owner

Wolfskin TV Home

AI-assisted (fork-internal)

Build the approved Home screen on the merged shell, Libraries, Requests and Discover: hero chain, Jellyfin and Your shelves, captions, focused rating plates, focus-follow, Discover continuation and Home recovery states. Home See all opens the real merged grid with the complete fixture list; the final continuation opens real Discover at its top. Remove the obsolete Home Discover stub.

Refs: approved TV specification (§6.2, §4.7–4.8, §7.8–7.9, §10.1); locked Opus v2 prototype; merged shell/navigation; merged Libraries and See all; merged Requests under Settings; merged Discover.

Head: 061670848f45ece00c0ae6e69dda3a39014b2536. Base: main (86d3432fb0078935a40785764f1eab536068668c). Plain additive main merges: 14a74ac4 Libraries, 4cd75cfa Requests, 575103ce Discover. Viewport fix 9c8fceb1; callback migration 5033c171; independently namespaced Library/Discover capture artifacts 06167084. The earlier Home-only gap override is superseded by main’s canonical 8px Library token. No rebase, force-push or merge of this pull request.

Review corrections and integration

  • Caption separator opacity: reuse Library.captionSeparatorOpacity; multiply the existing muted alpha by 0.4. Remove the duplicate Home token. Across st-009, st-019, st-020, st-099 and x-home-discover-start, isolated dot peak RGB is 77/77/79, versus reference 79/79/81 and the reviewed, incorrect native 101/101/102. The remaining two-channel levels are reported, not hidden by another alpha adjustment.
  • Home line-box rhythm: Home-only untrimmed text styles and exactLineBox allocate the declared CSS heights despite Android paragraph intrinsic minimums. Keep the original hero spacers and border-box-aware recovery padding. Shared shell/Library typography defaults are unchanged. Native paragraph diagnostics deliberately retain the raw 99px paragraph beside the declared 85.68px hero line; the Home layout allocates the rounded 86px box rather than using that intrinsic minimum.
  • Measured geometry: hero kicker glyphs align exactly in st-006/007/010/014/015/017/018/103; the two-line st-008 kicker differs by one pixel. Hero primary fills align in all nine frames. State panel bottom border is +1px in st-013 and exact in st-016, replacing the reviewed −12/−10px deficit. Caption and tile title/fact ink extents remain explicitly measured below and in the element report; no glyph-ink equality is claimed.
  • Fresh asynchronous entry: skeleton parks focus on nav; content arrival selects hero button zero only if no intervening input occurred. Deferred loading→ready tests replay two actual OK events for Play next and protect user-selected nav focus. Held native repeatCount > 0 remains consumed.
  • Shared code, clean cutover: one ShellContentFocus key-up/repeat/Back guard, shared TitleCard, Caption, LibrarySeeAllCard, canonical FocusLift shadows, and one bounded WolfskinImages loader. Remove obsolete Home card/See all/input/cache/shadow paths and duplicate Library image loading. Requests thumbnails retain their 96×144 slot and bitmap/URI model support; Discover retains its exact poster/backdrop slots and RGB565 requests. The shared interceptor preserves the strict global four-read limit. Requests recovery uses named onClick with the shared button API. Preserve main’s caption ellipsis/first-fact accent, overlay key precedence and selective Library focus registration.
  • Exact See all return: the new destination previously read mutable shell.view before its enter effect and borrowed/clamped Home’s scroller. Main’s canonical rememberedView(route) now binds each destination before effects; remove the superseded viewFor API and migrate all callers. Home retains actual per-row horizontal states, restores track before page using scrollToItem, and preserves the saved viewport without a return animation. Native Android focus stays with the existing shell; no second per-card focus system is introduced.
  • Real navigation proof: fixed-clock JVM cases traverse all 18 personal movies to Bleach the Movie: Fade to Black, and separately leave the horizontally scrolled Trending See all card. Back must display the original card with the same route-memory object, horizontal state, vertical/horizontal indices and pixel offsets, and selected-row offset. Personal-list Back failed before the ownership correction; the strengthened fixed-clock cases now pass both paths, without removing or weakening assertions.
  • Trivial review fixes and final spacing: Discover Saved warning pill, rounded progress clipping and separate 12px poster/10px overlay progress offsets. Home See all uses main’s canonical shared 8px gap, with no Home override or second gap parameter. Keep the locked nav Saved border at 50%; 45% belongs to .pill.warn, not .saved.
  • Independent screenshot producers: Library and Discover both wrote st-030/st-035/st-039 into root filenames. Namespace all their captures as library/ and discover/, including Discover text metadata, so one test cannot overwrite another renderer’s image. Keep every test, scenario and assertion. Home already uses home/.

Review reports: per-element geometry and retained Library scope · five caption dots · native dot atlas · exact text mask rectangles · viewport failure/fix and native replay.

Implementation

  • One lazy Home frame with stable row/card keys; resume → Next up → newest → pick hero precedence; stable hero removal from shelves; ordered, bounded Your rows and total-aware continuation cards.
  • Persist person-specific row/card, actual horizontal tracks and vertical viewport; restore visited columns, use nearest visible centers across mixed card widths and retain horizontal hysteresis. Pointer hover changes focus only; cards activate on release.
  • One focused-rating dwell collector; 350ms uncached gate, immediate cached return and bounded six-hour session cache. Hide signed-out scores. Locale-aware one decimal, RT truncation, ordered marks and the one-line plate shrinking/trailing-drop rule.
  • Exact-slot image requests, RGB565 posters, no crossfades, one 64MiB memory/128MiB disk cache, four image reads and next-shelf prefetch. Frozen missing-art gradients/glyphs and poster-only landscape wash remain supported.
  • HomeReadFacade isolates real selected-user Jellyfin Resume/NextUp/newest/destination reads, atomic last-known-good projection and actual film/episode playback preflight. Reuse the missing-person guard before Home’s view-model mounts. Debug household data/artwork use the frozen fixture seam; no handwritten Conductarr HTTP or live-server test reads.

Final merged-head verification

Gate Observed result
wolfskin-design JVM suite 152 tests; 0 failures; 0 errors; 0 skipped
app JVM suite 563 tests; 0 failures; 0 errors; 0 skipped
conductarr-client JVM suite 17 tests; 0 failures; 0 errors; 0 skipped
make test BUILD SUCCESSFUL, exit 0 on the head above; all existing app/design/client tests plus the generated-client loopback/disk/ETag/503 smoke
make apk-debug BUILD SUCCESSFUL, exit 0 on the same head; debug build only, no installation/publication
Native Home/grid replay Both fixed-clock exact-offset return cases pass; full 18-title list traversed; real shell key handling
Native asynchronous entry Deferred skeleton→ready Play next = two OK presses; intervening nav input retains its focus; held-repeat guard exercised
Native Dutch rating layout 7,8 remains one line; English captures retain 7.8

Every existing test remains; no assertion weakened. The missing-person regression retains its original backdrop/focus assertions plus the sign-in assertion. Final build logs, full XML and narrow failed-before/passed-after logs are in the bundle.

Approved key data replay the real Android shell/Home handler:

Path Presses
Play next 2
Resume 3
Open Discover 4
Deep-row Back/Down restore 9
Home → Trending 13
Trending → See all card 33

Capture exit check

All 23 pairs are prototype-left / native Compose-right, 1920×1080 at density 2.0, from the existing Robolectric/Roborazzi path. Each pair has raw images, a 4× diff and numeric RGB metrics in the bundle.

Font ruling: locked browser DejaVu Sans, mandated native platform Roboto. No font bundled, no per-title/per-row compensation, and no wrapping, ellipsis or ink-width parity claim. The table names every frame with measured text ink bounds (inclusive width×height in pixels, within the recorded mask rectangle); full line rows/bounds are in the reports. Other residual classes are reference JPEG compression, RGB565 poster quantisation, CSS/native blur/shadow/antialiasing, approved 1.05 control scale rather than 1.06, and omitted prototype sample pills. These numeric differences are evidence, not an automatic visual pass.

Capture pair Mean RGB error (0–255) Pixels >12 RGB Text ink: prototype → native (px) Explanation
st-005 1.2690 0.5910% wordmark light ink: 88×27 → 70×27 Loading: five non-focusable skeleton shelves and ambient bounds match; remaining differences are the nav glyphs and native elliptical-gradient interpolation.
st-006 7.7481 7.5489% hero title: 674×65 → 550×64 Next-up hero: Yu Yu Hakusho, episode score and shelf order preserved. Full line boxes now align the kicker glyph and primary fill; measured Roboto title/overview/button ink and line endings differ. Approved control scale 1.05 vs prototype 1.06.
st-007 7.9638 8.5175% hero title: 745×79 → 588×79 Mindel resume: Sex and the City, 28 min left, RT 70 and Ep 5.9 preserved. Kicker and primary fill align after full-leading correction; measured title/facts/overview ink and line endings differ under Roboto.
st-008 10.1399 8.3957% hero title: 956×165 → 766×166 Shared resume: Mussolini, 52 min left, RT 96 and Ep 7.4 preserved. Two-line hero uses original spacers and exact line boxes; kicker +1px, primary fill aligned. Measured heading ink, line endings and pill width differ.
st-009 4.2790 6.7078% poster caption title: 624×28 → 637×26 Trending: matching third-card Arifureta focus, TMDB 8.4 plate, scroll and caption band. Approved omission of prototype sample pills; narrower Roboto fits more caption text before ellipsis.
st-010 7.5772 7.2516% hero title: 674×65 → 550×64 Nav/Home focus: Yu Yu Hakusho and following shelves without a hero-control ring. Corrected full-leading hero geometry aligns kicker/resting fill; native nav/hero ink widths and overview endings differ.
st-011 3.3394 5.7609% shelf heading: 212×26 → 172×25 Deep-row Back: matching top-pinned Your shows shelf, nav ownership and suppressed card ring/caption. Only text metrics and artwork decoding remain.
st-012 1.9541 1.3488% continuation label: 355×28 → 324×27 Continuation: matching final Discover action position and cleared Home row focus. Roboto shortens the pill label; approved 1.05 focused-control scale.
st-013 2.9485 2.0860% state title: 454×34 → 366×34 Signed-out recovery and Jellyfin/Your rows retained, no numeric scores. Corrected CSS line boxes and border-box padding: title ink aligned, panel bottom +1px rather than -12px. Native paragraph/label ink and line endings differ.
st-014 7.6173 7.2787% hero title: 674×65 → 550×64 Discover nav focus over retained Home hero. Corrected kicker/resting fill align; nav glyph ink and measured hero text extents/line endings differ.
st-015 7.7612 7.6768% hero title: 674×65 → 550×64 Cached Home: 52px Saved chip, 28px wifi and 12px avatar gap retained. Kicker/fill align after line-box correction. Native label width moves chip left edge; hero ink widths/line endings and approved 1.05 scale differ.
st-016 2.3995 1.6619% state title: 373×34 → 297×33 Conductarr unavailable without cache: warning recovery and Jellyfin rows retained. Corrected border-box panel bottom aligns, replacing -10px deficit; title ink +1px at top/0px bottom. Native paragraph and secondary-label extents differ.
st-017 7.7612 7.6768% hero title: 674×65 → 550×64 Offline cache: retained Saved chip and Home data. Corrected kicker/fill align, chip geometry as st-015. Native chip/hero ink extents and approved focus scale differ.
st-018 6.9494 4.8293% hero title: 674×65 → 550×64 Jellyfin unavailable: retained Yu Yu Hakusho hero and warning state. Corrected kicker/fill align. Native paragraph line endings, glyph ink and title/button widths differ.
st-019 4.4650 8.1709% poster caption title: 392×28 → 317×26 Unavailable personal picks: matching fallback Trending/Comedy order, Spider-Man focus, 71/77 plate and caption. Prototype sample pills intentionally omitted; native caption/header metrics differ.
st-020 3.9391 3.4307% poster caption title: 198×28 → 156×26 Missing art: matching hashed gradients, film/TV glyphs, focus and 57/65 plate. Roboto wraps Fighting with My Family differently and changes fallback/caption baselines.
st-096 5.4165 8.7115% tile title: 313×29 → 303×29 Wide Killing of a Sacred Deer: 79/63/7.0 order and fixed card/ring slot retained. Untrimmed overlay boxes restore title/subtitle rhythm; both ink runs are +2px, with measured native title truncation and plate rasterisation differences.
st-099 3.6690 4.9524% poster caption title: 150×21 → 123×21 Memories poster: 82/7.5 score order, art and caption band retained. Muted-times-.4 dot corrected to peak77 vs reference79; exact caption boxes replace trimmed leading. Measured title/facts glyph extents and poster quantisation remain.
st-100 7.7837 12.5836% tile title: 310×28 → 305×28 Desperate Housewives: series RT72 and Ep8.0, following rows and scroll preserved. Restored overlay rhythm; title/subtitle ink +2px. Native ellipsis/plate widths differ; Ep label resolves Bold.
st-101 7.5490 11.8954% tile title: 154×29 → 123×29 Offspring: series TMDB6.9 only, no Ep prefix. Restored full-leading overlay rhythm; both ink runs +2px. Native title width/ellipsis and plate rasterisation differ.
st-102 5.4165 8.7115% tile title: 313×29 → 303×29 Killing of a Sacred Deer: same 79/63/7.0 order/focus as st-096. Restored overlay rhythm; title/subtitle ink +2px. Native title truncation and plate rasterisation differ.
st-103 7.7481 7.5489% hero title: 674×65 → 550×64 TMDB Ep7.4 hero preserved. Corrected kicker/fill align; measured native title/overview ink extents, line endings and approved 1.05 control scale differ.
x-home-discover-start 4.3170 5.7746% poster caption title: 392×28 → 317×26 First Home Discover shelves, 18-count real See all and first-card71/77 plate. Shared See all face uses 2px border/full Home line boxes; measured caption/See all ink widths differ. Muted-times-.4 caption dot corrected.

Native detail crops: Saved geometry · See all stroke · Episode weight · Caption separator.

Retained Library surface

Compared all 16 new native Library captures with the approved native halves from the earlier Libraries merge: 1 of 16 are pixel-identical. The earlier 15/16 statement predates Discover and is not claimed for this head. Main’s later canonical focus shadows/default caption ellipsis and the shared locked film-glyph stroke are retained rather than reverting them to satisfy an obsolete baseline. All changed pixel counts and bounds remain visible. All 16 measured scope rows.

Retained Requests surface

After both main merges and the shared cache/callback/focus-button migration, 1 of 8 native frames are pixel-identical to the approved Requests native halves. Main’s button-shadow fringe changes st-083/st-084 by maximum 7 channel levels; the other five nonzero frames change only 1–4 edge pixels (maximum 11 levels). Do not carry forward the earlier 8/8 equality claim from head 5033c171. All eight measured Requests scope rows.

Retained Discover surface

Compared independently generated Discover captures with the approved merged Discover native halves: 24 of 28 are pixel-identical. The four remaining frames (st-029/033/037/105) change 55/158/55/158 rounded-poster-edge pixels, at maximum 4 channel levels; connected component bounds are retained in the bundle. [INFERENCE] These tiny edge changes are clip compositing through the shared card frame, not text or layout shifts. This comparison uses later main styles, not browser font parity. The three formerly colliding st-030/st-035/st-039 outputs are all exact against the approved Discover halves, and both independent renderer images now survive. All 28 measured Discover scope rows.

Proof bundle: Complete merged-head Home evidence.

Main integration and upstream files

Upstream files touched: none. No changes under app/src/main/ or upstream-owned tests. Reuse the existing upstream hook and destination registration.

Resolve all main merges additively: preserve Home/Library/Requests/Discover routing, route memory, content-overlay key precedence, Settings muted avatar, Coming-in sheet, glyphs and all token groups; regenerate canonical Kotlin/CSS/checksum outputs. Reuse main’s rememberedView, FocusLift, caption first-fact accent/default ellipsis and shared 8px See all gap; remove superseded APIs rather than aliases. Migrate Requests and Discover image callers into the canonical bounded loader without losing their model support, dimensions or strict four-read interception. Only capture output directories change in the two existing renderer tests; no assertion or scenario changes. Home See all and Discover continuation use the real merged destinations, not obsolete stubs.

Fork integration lives under app/src/wolfskin/ and app/src/test/java/org/justinvisser/wolfskin/tv/; shared UI/models/assets/tests live in :wolfskin-design. The scoped Home styles do not change shared typography defaults. docker/README.md documents the data, focus, scroll ownership and continuation contracts. GPL notices intact.

Explicit boundaries and nonblocking follow-ups

  • Discover and See all are real merged destinations. Title content remains the clearly named later-slice target; this Home slice does not claim to implement title pages.
  • Conductarr TV sign-in/live catalogue activation remains later work; unsigned release Home has Jellyfin plus the sign-in state and no ratings. Catalogue and screenshot reads are local fixtures, never a live server.
  • Follow-ups: series/season enrichment cache identity (N3), upstream LatestNextUpService/session integration (N4), pre-composition saved-projection seeding without main-thread disk I/O (N5), actual Conductarr recovery backend (N6), and additional locked poster-only/newest/pick captures (N8). The focus fix does not claim to eliminate the cold saved-copy skeleton flash. Full nonblocking review scope.
  • No ADB, device, installation, release/tag/release asset, signing/version change or physical-TV performance claim. Frame/memory measurements remain deferred by spec p1. Native proof is Robolectric, not a physical TV or AVD.
  • Forgejo Actions is disabled; no CI status touched. Ready for firstmate-arranged review; not merged.
# Wolfskin TV Home AI-assisted (fork-internal) Build the approved Home screen on the merged shell, Libraries, Requests and Discover: hero chain, Jellyfin and Your shelves, captions, focused rating plates, focus-follow, Discover continuation and Home recovery states. Home See all opens the real merged grid with the complete fixture list; the final continuation opens real Discover at its top. Remove the obsolete Home Discover stub. Refs: [approved TV specification](https://pages.justinvisser.org/wolfskin/tv-spec) (§6.2, §4.7–4.8, §7.8–7.9, §10.1); [locked Opus v2 prototype](https://pages.justinvisser.org/wolfskin/tv-prototype-v2-opus/); [merged shell/navigation](https://git.justinvisser.org/justinzeus/wolfskin/pulls/29); [merged Libraries and See all](https://git.justinvisser.org/justinzeus/wolfskin/pulls/30); [merged Requests under Settings](https://git.justinvisser.org/justinzeus/wolfskin/pulls/32); [merged Discover](https://git.justinvisser.org/justinzeus/wolfskin/pulls/33). Head: `061670848f45ece00c0ae6e69dda3a39014b2536`. Base: `main` (`86d3432fb0078935a40785764f1eab536068668c`). Plain additive main merges: `14a74ac4` Libraries, `4cd75cfa` Requests, `575103ce` Discover. Viewport fix `9c8fceb1`; callback migration `5033c171`; independently namespaced Library/Discover capture artifacts `06167084`. The earlier Home-only gap override is superseded by main’s canonical 8px Library token. No rebase, force-push or merge of this pull request. ## Review corrections and integration - **Caption separator opacity:** reuse `Library.captionSeparatorOpacity`; multiply the existing muted alpha by 0.4. Remove the duplicate Home token. Across st-009, st-019, st-020, st-099 and x-home-discover-start, isolated dot peak RGB is **77/77/79**, versus reference **79/79/81** and the reviewed, incorrect native **101/101/102**. The remaining two-channel levels are reported, not hidden by another alpha adjustment. - **Home line-box rhythm:** Home-only untrimmed text styles and `exactLineBox` allocate the declared CSS heights despite Android paragraph intrinsic minimums. Keep the original hero spacers and border-box-aware recovery padding. Shared shell/Library typography defaults are unchanged. Native paragraph diagnostics deliberately retain the raw 99px paragraph beside the declared 85.68px hero line; the Home layout allocates the rounded 86px box rather than using that intrinsic minimum. - **Measured geometry:** hero kicker glyphs align exactly in st-006/007/010/014/015/017/018/103; the two-line st-008 kicker differs by one pixel. Hero primary fills align in all nine frames. State panel bottom border is +1px in st-013 and exact in st-016, replacing the reviewed −12/−10px deficit. Caption and tile title/fact ink extents remain explicitly measured below and in the element report; no glyph-ink equality is claimed. - **Fresh asynchronous entry:** skeleton parks focus on nav; content arrival selects hero button zero only if no intervening input occurred. Deferred loading→ready tests replay two actual OK events for Play next and protect user-selected nav focus. Held native repeatCount > 0 remains consumed. - **Shared code, clean cutover:** one `ShellContentFocus` key-up/repeat/Back guard, shared `TitleCard`, `Caption`, `LibrarySeeAllCard`, canonical `FocusLift` shadows, and one bounded `WolfskinImages` loader. Remove obsolete Home card/See all/input/cache/shadow paths and duplicate Library image loading. Requests thumbnails retain their 96×144 slot and bitmap/URI model support; Discover retains its exact poster/backdrop slots and RGB565 requests. The shared interceptor preserves the strict global four-read limit. Requests recovery uses named `onClick` with the shared button API. Preserve main’s caption ellipsis/first-fact accent, overlay key precedence and selective Library focus registration. - **Exact See all return:** the new destination previously read mutable `shell.view` before its enter effect and borrowed/clamped Home’s scroller. Main’s canonical `rememberedView(route)` now binds each destination before effects; remove the superseded `viewFor` API and migrate all callers. Home retains actual per-row horizontal states, restores track before page using `scrollToItem`, and preserves the saved viewport without a return animation. Native Android focus stays with the existing shell; no second per-card focus system is introduced. - **Real navigation proof:** fixed-clock JVM cases traverse all 18 personal movies to Bleach the Movie: Fade to Black, and separately leave the horizontally scrolled Trending See all card. Back must display the original card with the same route-memory object, horizontal state, vertical/horizontal indices and pixel offsets, and selected-row offset. Personal-list Back failed before the ownership correction; the strengthened fixed-clock cases now pass both paths, without removing or weakening assertions. - **Trivial review fixes and final spacing:** Discover Saved warning pill, rounded progress clipping and separate 12px poster/10px overlay progress offsets. Home See all uses main’s canonical shared 8px gap, with no Home override or second gap parameter. Keep the locked nav Saved border at 50%; 45% belongs to `.pill.warn`, not `.saved`. - **Independent screenshot producers:** Library and Discover both wrote st-030/st-035/st-039 into root filenames. Namespace all their captures as `library/` and `discover/`, including Discover text metadata, so one test cannot overwrite another renderer’s image. Keep every test, scenario and assertion. Home already uses `home/`. Review reports: [per-element geometry and retained Library scope](https://git.justinvisser.org/attachments/d15a7317-b628-4521-b05a-810695fbb847) · [five caption dots](https://git.justinvisser.org/attachments/948decc4-af70-458e-ba48-4b3459b10b55) · [native dot atlas](https://git.justinvisser.org/attachments/6e00f873-80ff-41f9-bff4-581be8c0a4cc) · [exact text mask rectangles](https://git.justinvisser.org/attachments/b0ce413d-4f9b-46d5-9dd5-508f250720b2) · [viewport failure/fix and native replay](https://git.justinvisser.org/attachments/48286d29-da80-4a3d-ac0b-422f5c3f5bb2). ## Implementation - One lazy Home frame with stable row/card keys; resume → Next up → newest → pick hero precedence; stable hero removal from shelves; ordered, bounded Your rows and total-aware continuation cards. - Persist person-specific row/card, actual horizontal tracks and vertical viewport; restore visited columns, use nearest visible centers across mixed card widths and retain horizontal hysteresis. Pointer hover changes focus only; cards activate on release. - One focused-rating dwell collector; 350ms uncached gate, immediate cached return and bounded six-hour session cache. Hide signed-out scores. Locale-aware one decimal, RT truncation, ordered marks and the one-line plate shrinking/trailing-drop rule. - Exact-slot image requests, RGB565 posters, no crossfades, one 64MiB memory/128MiB disk cache, four image reads and next-shelf prefetch. Frozen missing-art gradients/glyphs and poster-only landscape wash remain supported. - `HomeReadFacade` isolates real selected-user Jellyfin Resume/NextUp/newest/destination reads, atomic last-known-good projection and actual film/episode playback preflight. Reuse the missing-person guard before Home’s view-model mounts. Debug household data/artwork use the frozen fixture seam; no handwritten Conductarr HTTP or live-server test reads. ## Final merged-head verification | Gate | Observed result | |---|---| | `wolfskin-design` JVM suite | 152 tests; 0 failures; 0 errors; 0 skipped | | `app` JVM suite | 563 tests; 0 failures; 0 errors; 0 skipped | | `conductarr-client` JVM suite | 17 tests; 0 failures; 0 errors; 0 skipped | | `make test` | BUILD SUCCESSFUL, exit 0 on the head above; all existing app/design/client tests plus the generated-client loopback/disk/ETag/503 smoke | | `make apk-debug` | BUILD SUCCESSFUL, exit 0 on the same head; debug build only, no installation/publication | | Native Home/grid replay | Both fixed-clock exact-offset return cases pass; full 18-title list traversed; real shell key handling | | Native asynchronous entry | Deferred skeleton→ready Play next = two OK presses; intervening nav input retains its focus; held-repeat guard exercised | | Native Dutch rating layout | `7,8` remains one line; English captures retain `7.8` | Every existing test remains; no assertion weakened. The missing-person regression retains its original backdrop/focus assertions plus the sign-in assertion. Final build logs, full XML and narrow failed-before/passed-after logs are in the bundle. Approved key data replay the real Android shell/Home handler: | Path | Presses | |---|---:| | Play next | 2 | | Resume | 3 | | Open Discover | 4 | | Deep-row Back/Down restore | 9 | | Home → Trending | 13 | | Trending → See all card | 33 | ## Capture exit check All 23 pairs are prototype-left / native Compose-right, **1920×1080 at density 2.0**, from the existing Robolectric/Roborazzi path. Each pair has raw images, a 4× diff and numeric RGB metrics in the bundle. Font ruling: locked browser **DejaVu Sans**, mandated native **platform Roboto**. No font bundled, no per-title/per-row compensation, and **no wrapping, ellipsis or ink-width parity claim**. The table names every frame with measured text ink bounds (inclusive width×height in pixels, within the recorded mask rectangle); full line rows/bounds are in the reports. Other residual classes are reference JPEG compression, RGB565 poster quantisation, CSS/native blur/shadow/antialiasing, approved 1.05 control scale rather than 1.06, and omitted prototype sample pills. These numeric differences are evidence, not an automatic visual pass. | Capture pair | Mean RGB error (0–255) | Pixels >12 RGB | Text ink: prototype → native (px) | Explanation | |---|---:|---:|---|---| | [st-005](https://git.justinvisser.org/attachments/efe1501e-fca3-47e9-918f-9790a5072461) | 1.2690 | 0.5910% | wordmark light ink: 88×27 → 70×27 | Loading: five non-focusable skeleton shelves and ambient bounds match; remaining differences are the nav glyphs and native elliptical-gradient interpolation. | | [st-006](https://git.justinvisser.org/attachments/60858a6c-b123-4e47-b7ef-9685d74966f1) | 7.7481 | 7.5489% | hero title: 674×65 → 550×64 | Next-up hero: Yu Yu Hakusho, episode score and shelf order preserved. Full line boxes now align the kicker glyph and primary fill; measured Roboto title/overview/button ink and line endings differ. Approved control scale 1.05 vs prototype 1.06. | | [st-007](https://git.justinvisser.org/attachments/9092d315-07f3-43a6-8d2e-07658ff6b0c7) | 7.9638 | 8.5175% | hero title: 745×79 → 588×79 | Mindel resume: Sex and the City, 28 min left, RT 70 and Ep 5.9 preserved. Kicker and primary fill align after full-leading correction; measured title/facts/overview ink and line endings differ under Roboto. | | [st-008](https://git.justinvisser.org/attachments/6f84a986-da42-46f7-aa6a-06429949f23f) | 10.1399 | 8.3957% | hero title: 956×165 → 766×166 | Shared resume: Mussolini, 52 min left, RT 96 and Ep 7.4 preserved. Two-line hero uses original spacers and exact line boxes; kicker +1px, primary fill aligned. Measured heading ink, line endings and pill width differ. | | [st-009](https://git.justinvisser.org/attachments/0186e3ce-80ba-406d-a44e-f43feb6f0f5d) | 4.2790 | 6.7078% | poster caption title: 624×28 → 637×26 | Trending: matching third-card Arifureta focus, TMDB 8.4 plate, scroll and caption band. Approved omission of prototype sample pills; narrower Roboto fits more caption text before ellipsis. | | [st-010](https://git.justinvisser.org/attachments/2c378834-8403-47c2-9769-36510c907844) | 7.5772 | 7.2516% | hero title: 674×65 → 550×64 | Nav/Home focus: Yu Yu Hakusho and following shelves without a hero-control ring. Corrected full-leading hero geometry aligns kicker/resting fill; native nav/hero ink widths and overview endings differ. | | [st-011](https://git.justinvisser.org/attachments/c43c7a63-fa8f-40af-ad6e-f8e9d0049e9c) | 3.3394 | 5.7609% | shelf heading: 212×26 → 172×25 | Deep-row Back: matching top-pinned Your shows shelf, nav ownership and suppressed card ring/caption. Only text metrics and artwork decoding remain. | | [st-012](https://git.justinvisser.org/attachments/1e73aeed-3369-45ff-b0b7-ad97ad4e40cf) | 1.9541 | 1.3488% | continuation label: 355×28 → 324×27 | Continuation: matching final Discover action position and cleared Home row focus. Roboto shortens the pill label; approved 1.05 focused-control scale. | | [st-013](https://git.justinvisser.org/attachments/02712cf7-2f60-4b96-a114-b22b81e473cb) | 2.9485 | 2.0860% | state title: 454×34 → 366×34 | Signed-out recovery and Jellyfin/Your rows retained, no numeric scores. Corrected CSS line boxes and border-box padding: title ink aligned, panel bottom +1px rather than -12px. Native paragraph/label ink and line endings differ. | | [st-014](https://git.justinvisser.org/attachments/0f153cb4-1b6c-4249-9e84-eeb2ffc6a3d5) | 7.6173 | 7.2787% | hero title: 674×65 → 550×64 | Discover nav focus over retained Home hero. Corrected kicker/resting fill align; nav glyph ink and measured hero text extents/line endings differ. | | [st-015](https://git.justinvisser.org/attachments/0fa35465-c866-42e5-b0d5-33b65298eca8) | 7.7612 | 7.6768% | hero title: 674×65 → 550×64 | Cached Home: 52px Saved chip, 28px wifi and 12px avatar gap retained. Kicker/fill align after line-box correction. Native label width moves chip left edge; hero ink widths/line endings and approved 1.05 scale differ. | | [st-016](https://git.justinvisser.org/attachments/0bf19231-17a5-4488-82e4-635b5520c134) | 2.3995 | 1.6619% | state title: 373×34 → 297×33 | Conductarr unavailable without cache: warning recovery and Jellyfin rows retained. Corrected border-box panel bottom aligns, replacing -10px deficit; title ink +1px at top/0px bottom. Native paragraph and secondary-label extents differ. | | [st-017](https://git.justinvisser.org/attachments/fba40f33-0e87-4f13-8598-774c85ad334f) | 7.7612 | 7.6768% | hero title: 674×65 → 550×64 | Offline cache: retained Saved chip and Home data. Corrected kicker/fill align, chip geometry as st-015. Native chip/hero ink extents and approved focus scale differ. | | [st-018](https://git.justinvisser.org/attachments/d79d52b5-cf9f-413b-bba1-476e5cf21c1c) | 6.9494 | 4.8293% | hero title: 674×65 → 550×64 | Jellyfin unavailable: retained Yu Yu Hakusho hero and warning state. Corrected kicker/fill align. Native paragraph line endings, glyph ink and title/button widths differ. | | [st-019](https://git.justinvisser.org/attachments/f522c84b-4a88-46cf-bb1a-41796be63129) | 4.4650 | 8.1709% | poster caption title: 392×28 → 317×26 | Unavailable personal picks: matching fallback Trending/Comedy order, Spider-Man focus, 71/77 plate and caption. Prototype sample pills intentionally omitted; native caption/header metrics differ. | | [st-020](https://git.justinvisser.org/attachments/dc2ededf-a239-4466-8934-dd519cb0d9e3) | 3.9391 | 3.4307% | poster caption title: 198×28 → 156×26 | Missing art: matching hashed gradients, film/TV glyphs, focus and 57/65 plate. Roboto wraps Fighting with My Family differently and changes fallback/caption baselines. | | [st-096](https://git.justinvisser.org/attachments/c12c4b32-764e-4ec8-a9e6-edec0fcc40f5) | 5.4165 | 8.7115% | tile title: 313×29 → 303×29 | Wide Killing of a Sacred Deer: 79/63/7.0 order and fixed card/ring slot retained. Untrimmed overlay boxes restore title/subtitle rhythm; both ink runs are +2px, with measured native title truncation and plate rasterisation differences. | | [st-099](https://git.justinvisser.org/attachments/781564e1-44c1-4be9-9f8a-6ce951d8f3b6) | 3.6690 | 4.9524% | poster caption title: 150×21 → 123×21 | Memories poster: 82/7.5 score order, art and caption band retained. Muted-times-.4 dot corrected to peak77 vs reference79; exact caption boxes replace trimmed leading. Measured title/facts glyph extents and poster quantisation remain. | | [st-100](https://git.justinvisser.org/attachments/52da5e2d-2b57-4bd9-8534-3cfad145cfd0) | 7.7837 | 12.5836% | tile title: 310×28 → 305×28 | Desperate Housewives: series RT72 and Ep8.0, following rows and scroll preserved. Restored overlay rhythm; title/subtitle ink +2px. Native ellipsis/plate widths differ; Ep label resolves Bold. | | [st-101](https://git.justinvisser.org/attachments/40eab6a8-6022-45e5-b135-8d775e3beffd) | 7.5490 | 11.8954% | tile title: 154×29 → 123×29 | Offspring: series TMDB6.9 only, no Ep prefix. Restored full-leading overlay rhythm; both ink runs +2px. Native title width/ellipsis and plate rasterisation differ. | | [st-102](https://git.justinvisser.org/attachments/591c2a3f-6bce-444c-a6a6-6abaa12b0436) | 5.4165 | 8.7115% | tile title: 313×29 → 303×29 | Killing of a Sacred Deer: same 79/63/7.0 order/focus as st-096. Restored overlay rhythm; title/subtitle ink +2px. Native title truncation and plate rasterisation differ. | | [st-103](https://git.justinvisser.org/attachments/80f15dc6-e305-4c60-bb3b-e582fdfad02f) | 7.7481 | 7.5489% | hero title: 674×65 → 550×64 | TMDB Ep7.4 hero preserved. Corrected kicker/fill align; measured native title/overview ink extents, line endings and approved 1.05 control scale differ. | | [x-home-discover-start](https://git.justinvisser.org/attachments/a3dfa358-d066-49a9-bf73-e70fcd42ad77) | 4.3170 | 5.7746% | poster caption title: 392×28 → 317×26 | First Home Discover shelves, 18-count real See all and first-card71/77 plate. Shared See all face uses 2px border/full Home line boxes; measured caption/See all ink widths differ. Muted-times-.4 caption dot corrected. | Native detail crops: [Saved geometry](https://git.justinvisser.org/attachments/2a97db4f-57cf-4b91-97a2-049804e2f2ac) · [See all stroke](https://git.justinvisser.org/attachments/5f5dff03-c50d-4a3f-b779-4170080448ff) · [Episode weight](https://git.justinvisser.org/attachments/bb3e5e26-f548-4926-b39f-c4b098a31243) · [Caption separator](https://git.justinvisser.org/attachments/7be846ef-d20e-4140-af3d-8d272540314a). ### Retained Library surface Compared all 16 new native Library captures with the approved native halves from the earlier Libraries merge: **1 of 16 are pixel-identical**. The earlier 15/16 statement predates Discover and is not claimed for this head. Main’s later canonical focus shadows/default caption ellipsis and the shared locked film-glyph stroke are retained rather than reverting them to satisfy an obsolete baseline. All changed pixel counts and bounds remain visible. [All 16 measured scope rows](https://git.justinvisser.org/attachments/323f34f4-dc0c-4934-8958-f6b0e5310965). ### Retained Requests surface After both main merges and the shared cache/callback/focus-button migration, **1 of 8** native frames are pixel-identical to the approved Requests native halves. Main’s button-shadow fringe changes st-083/st-084 by maximum 7 channel levels; the other five nonzero frames change only 1–4 edge pixels (maximum 11 levels). Do not carry forward the earlier 8/8 equality claim from head 5033c171. [All eight measured Requests scope rows](https://git.justinvisser.org/attachments/fe6c5a48-d28b-4933-8aac-4a4c20c90eb6). ### Retained Discover surface Compared independently generated Discover captures with the approved merged Discover native halves: **24 of 28 are pixel-identical**. The four remaining frames (st-029/033/037/105) change 55/158/55/158 rounded-poster-edge pixels, at maximum 4 channel levels; connected component bounds are retained in the bundle. [INFERENCE] These tiny edge changes are clip compositing through the shared card frame, not text or layout shifts. This comparison uses later main styles, not browser font parity. The three formerly colliding st-030/st-035/st-039 outputs are all exact against the approved Discover halves, and both independent renderer images now survive. [All 28 measured Discover scope rows](https://git.justinvisser.org/attachments/86842eeb-e75b-4432-8df2-2fb39546b740). Proof bundle: [Complete merged-head Home evidence](https://git.justinvisser.org/attachments/d27c75e1-ae17-478d-bac2-d047c56eea7a). ## Main integration and upstream files **Upstream files touched: none.** No changes under `app/src/main/` or upstream-owned tests. Reuse the existing upstream hook and destination registration. Resolve all main merges additively: preserve Home/Library/Requests/Discover routing, route memory, content-overlay key precedence, Settings muted avatar, Coming-in sheet, glyphs and all token groups; regenerate canonical Kotlin/CSS/checksum outputs. Reuse main’s `rememberedView`, `FocusLift`, caption first-fact accent/default ellipsis and shared 8px See all gap; remove superseded APIs rather than aliases. Migrate Requests and Discover image callers into the canonical bounded loader without losing their model support, dimensions or strict four-read interception. Only capture output directories change in the two existing renderer tests; no assertion or scenario changes. Home See all and Discover continuation use the real merged destinations, not obsolete stubs. Fork integration lives under `app/src/wolfskin/` and `app/src/test/java/org/justinvisser/wolfskin/tv/`; shared UI/models/assets/tests live in `:wolfskin-design`. The scoped Home styles do not change shared typography defaults. `docker/README.md` documents the data, focus, scroll ownership and continuation contracts. GPL notices intact. ## Explicit boundaries and nonblocking follow-ups - Discover and See all are real merged destinations. Title content remains the clearly named later-slice target; this Home slice does not claim to implement title pages. - Conductarr TV sign-in/live catalogue activation remains later work; unsigned release Home has Jellyfin plus the sign-in state and no ratings. Catalogue and screenshot reads are local fixtures, never a live server. - Follow-ups: series/season enrichment cache identity (N3), upstream LatestNextUpService/session integration (N4), pre-composition saved-projection seeding without main-thread disk I/O (N5), actual Conductarr recovery backend (N6), and additional locked poster-only/newest/pick captures (N8). The focus fix does not claim to eliminate the cold saved-copy skeleton flash. [Full nonblocking review scope](https://git.justinvisser.org/attachments/7f5d2fe4-e37c-45a0-b9a0-e79612f94056). - No ADB, device, installation, release/tag/release asset, signing/version change or physical-TV performance claim. Frame/memory measurements remain deferred by spec p1. Native proof is Robolectric, not a physical TV or AVD. - Forgejo Actions is disabled; no CI status touched. Ready for firstmate-arranged review; not merged.
justinzeus added 7 commits 2026-11-05 17:26:34 +01:00
Author
Owner

Design review (Claude, cross-family) of head b54bcc148c362a7332c502d96643b541eb2f7b83: REQUEST CHANGES — 3 blocking findings.

Checked: side-by-side measurement of st-005..020, st-096, st-099..103 and x-home-discover-start at native resolution; spec 6.2 / 7.1 / 7.2 / 7.3 / 7.8 / 7.9; the six press-count paths (real key replay, real data; they fail if row order or skipping breaks); architecture (no app/src/main file touched, one shell hook, one Jellyfin facade, per-person cache scope, no network in tests); hygiene (no test deleted/weakened, plain commits, no release/signing/version change). Font-only differences (DejaVu vs Roboto widths, wraps, ellipsis) accepted as named.

Blocking:

  1. Caption separator dot colour. The locked frame draws the dot as muted at 40% (peak pixel 79,79,81 on bg 6,6,8). The build draws foreground at 40% (peak 101,101,102), about 30% brighter, identical in st-009, 019, 020, 099 and x-home-discover-start. Fix is one line in Caption.kt.
  2. Stacked-text vertical rhythm is not font-caused. Hero kicker glyph is 8 px high (y 334 vs 342), facts line 4-5 px low, overview 3-4 px low; poster caption facts line 3 px high; tile overlay title/subtitle pair 3-5 px tighter; Home state panels 10 px (st-013) and 12 px (st-016) shorter at the same top edge. Probable cause: no explicit LineHeightStyle, so the 1.3 line box is not reproduced. Re-derive the spacing and re-measure.
  3. Focus never leaves the nav when content arrives in the real path. The view model starts as the skeleton, HomeScreen parks focus on the nav, and nothing hands it back to the hero when rows become focusable, so Play next is 3 presses rather than 2 (Resume 4, not 3). The press tests use a synchronous snapshot and cannot see it. Needs the fix plus a skeleton-to-loaded replay test.

Non-blocking (N1-N8: Saved pill in the Discover header, progress bar clip/inset, episode ratings cache key, SDK-direct Resume/NextUp read, skeleton flash despite saved copy, Try again toast on Discover states, saved-chip border alpha, no capture for poster-only art) are in the full report: /root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-31/report.md.

No Gradle run (read and pixel review only). Commit status review/design-claude set to failure on this SHA.

Design review (Claude, cross-family) of head `b54bcc148c362a7332c502d96643b541eb2f7b83`: **REQUEST CHANGES — 3 blocking findings.** Checked: side-by-side measurement of st-005..020, st-096, st-099..103 and x-home-discover-start at native resolution; spec 6.2 / 7.1 / 7.2 / 7.3 / 7.8 / 7.9; the six press-count paths (real key replay, real data; they fail if row order or skipping breaks); architecture (no `app/src/main` file touched, one shell hook, one Jellyfin facade, per-person cache scope, no network in tests); hygiene (no test deleted/weakened, plain commits, no release/signing/version change). Font-only differences (DejaVu vs Roboto widths, wraps, ellipsis) accepted as named. Blocking: 1. **Caption separator dot colour.** The locked frame draws the dot as muted at 40% (peak pixel 79,79,81 on bg 6,6,8). The build draws foreground at 40% (peak 101,101,102), about 30% brighter, identical in st-009, 019, 020, 099 and x-home-discover-start. Fix is one line in `Caption.kt`. 2. **Stacked-text vertical rhythm is not font-caused.** Hero kicker glyph is 8 px high (y 334 vs 342), facts line 4-5 px low, overview 3-4 px low; poster caption facts line 3 px high; tile overlay title/subtitle pair 3-5 px tighter; Home state panels 10 px (st-013) and 12 px (st-016) shorter at the same top edge. Probable cause: no explicit `LineHeightStyle`, so the 1.3 line box is not reproduced. Re-derive the spacing and re-measure. 3. **Focus never leaves the nav when content arrives in the real path.** The view model starts as the skeleton, `HomeScreen` parks focus on the nav, and nothing hands it back to the hero when rows become focusable, so Play next is 3 presses rather than 2 (Resume 4, not 3). The press tests use a synchronous snapshot and cannot see it. Needs the fix plus a skeleton-to-loaded replay test. Non-blocking (N1-N8: Saved pill in the Discover header, progress bar clip/inset, episode ratings cache key, SDK-direct Resume/NextUp read, skeleton flash despite saved copy, Try again toast on Discover states, saved-chip border alpha, no capture for poster-only art) are in the full report: `/root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-31/report.md`. No Gradle run (read and pixel review only). Commit status `review/design-claude` set to failure on this SHA.
justinzeus added 3 commits 2026-11-05 20:07:38 +01:00
justinzeus added 2 commits 2026-11-05 20:31:59 +01:00
justinzeus added 2 commits 2026-11-05 21:15:44 +01:00
Keep overlapping screen captures in separate namespaces
All checks were successful
review/design-claude Design re-review: B1-B3 fixed, no blocking findings (head 06167084)
061670848f
Author
Owner

Design re-review (Claude, round 2) of head 061670848f45ece00c0ae6e69dda3a39014b2536: approve from design review (review/design-claude = success). No blocking findings.

Checked at native resolution on the refreshed pairs, my own measurements:

  • Caption dot colour (was blocker B1): fixed. Peak pixel (77,77,79) vs locked (79,79,81) in st-009, 019, 020, 099 and x-home-discover-start (was 101,101,102).
  • Vertical rhythm (was blocker B2): fixed. The 1.3 line box is real through Home-only HomeType plus exactLineBox; shared Type.* tokens are untouched. Hero kicker 0 (was -8); caption facts +2 and tile title/subtitle +2 (were -3 and -5); Home state panel bottom border st-016 0 and st-013 +1 (were -12 and -10). Remaining: a uniform +1..+2 px downward offset of Home text blocks, block-internal rhythm within 1 px. Not font-attributable by metrics; low severity, please name it in the PR text.
  • Async focus entry (was blocker B3): fixed. HomeScreen takes hero focus when rows turn focusable if no key/nav input arrived while loading. asynchronousFreshHomePlaysNextInTwoPresses fails without the fix; asynchronousHomeDoesNotStealFocusAfterNavInput guards the other side.
  • Back from See all: the real-key tests assert the same remembered view and horizontal state objects, vertical and horizontal first item and pixel offsets, selected-row offset and the exact card displayed. Fine.
  • Discover continuation routes to the real merged Discover screen; press counts 3, 2, 13, 33, 9, 4 are still real tests through ShellSurface; no existing test deleted or weakened.
  • No new visible deviation of the sibling classes (strokes, weights, avatar initial, squashed panels, lift shadows) found. Font-only wrap/ellipsis/width differences are named in the report.

Non-blocking, needs a ruling: the public design object LibraryImages was removed and replaced by WolfskinImages (all callers migrated, disk cache directory renamed), which conflicts with the "no public design-module API removed or renamed" check. Also shared wolfskin_film.xml stroke now matches the locked glyph and moves merged Library fallback glyph pixels (intentional). Other low items are in the report.

Not run: Gradle/make or any device (lane reports 732 tests green at this head; not verified by me). Full report: /root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-31-r2/report.md.

Design re-review (Claude, round 2) of head `061670848f45ece00c0ae6e69dda3a39014b2536`: **approve from design review** (`review/design-claude` = success). No blocking findings. Checked at native resolution on the refreshed pairs, my own measurements: - **Caption dot colour (was blocker B1): fixed.** Peak pixel (77,77,79) vs locked (79,79,81) in st-009, 019, 020, 099 and x-home-discover-start (was 101,101,102). - **Vertical rhythm (was blocker B2): fixed.** The 1.3 line box is real through Home-only `HomeType` plus `exactLineBox`; shared `Type.*` tokens are untouched. Hero kicker 0 (was -8); caption facts +2 and tile title/subtitle +2 (were -3 and -5); Home state panel bottom border st-016 0 and st-013 +1 (were -12 and -10). Remaining: a uniform +1..+2 px downward offset of Home text blocks, block-internal rhythm within 1 px. Not font-attributable by metrics; low severity, please name it in the PR text. - **Async focus entry (was blocker B3): fixed.** `HomeScreen` takes hero focus when rows turn focusable if no key/nav input arrived while loading. `asynchronousFreshHomePlaysNextInTwoPresses` fails without the fix; `asynchronousHomeDoesNotStealFocusAfterNavInput` guards the other side. - **Back from See all:** the real-key tests assert the same remembered view and horizontal state objects, vertical and horizontal first item and pixel offsets, selected-row offset and the exact card displayed. Fine. - Discover continuation routes to the real merged Discover screen; press counts 3, 2, 13, 33, 9, 4 are still real tests through `ShellSurface`; no existing test deleted or weakened. - No new visible deviation of the sibling classes (strokes, weights, avatar initial, squashed panels, lift shadows) found. Font-only wrap/ellipsis/width differences are named in the report. Non-blocking, needs a ruling: the public design object `LibraryImages` was removed and replaced by `WolfskinImages` (all callers migrated, disk cache directory renamed), which conflicts with the "no public design-module API removed or renamed" check. Also shared `wolfskin_film.xml` stroke now matches the locked glyph and moves merged Library fallback glyph pixels (intentional). Other low items are in the report. Not run: Gradle/make or any device (lane reports 732 tests green at this head; not verified by me). Full report: `/root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-31-r2/report.md`.
justinzeus merged commit 9dd321f07e into main 2026-11-05 21:34:30 +01:00
Sign in to join this conversation.
No reviewers
No labels
exploring
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: justinzeus/wolfskin#31
No description provided.