Skip to content

Session notes — claude-2026-10-16 ​

One person's notes, never rewritten by anyone else. docs/state/HANDOFF.md §23 holds what is NOT done, and STATE.md holds what is true now (the deployed sha's only home is its ✅ DEPLOYED line). This file is WHY each thing was done, and how it was checked.

All on production, every deploy <== exit 0 — ran to the end, read back from the VM's HEAD, the served bundle grepped for a string from code that runs unconditionally. No migration, no Apps Script change, no new read path, no new permission. User-visible notes are staged in PENDING (src/data/changelog.js).

Read these before touching the same code ​

If you touch…Read first
the banner (#homeHero)src/js/home-hero.js header. Native scroll-snap — do not replace it with a transform you animate: the finger drives the platform scroller. The autoplay CLOCK is the active dot's CSS animation (hero-progress); animationend advances, animation-play-state pauses — rename the keyframes and autoplay silently stops (a test pins the name)
a mouse-drag landinglandingIndex: above FLICK_PX_S the velocity's SIGN against the drag's own direction decides (with = next, against = back home); only a slow release uses the projection. Test any direction rule from the MIDDLE slide — from an end the clamp makes a wrong rule pass
anything that hides a slide/panelfocus does not leave a region because you hid it (setIndex moves it)
the tool railONE entry in src/data/tools.js: home = rank, short = the label under the icon, color = the square, ink = a glyph colour of its own (shop only), deptLogo = draw the ฝ่าย's logo from depts.js. Never markup in tab-home.html (a test fails on a hand-written tile)
tool coloursthey reach the launcher and every ฝ่าย page too (same renderer). Glyphs are WHITE by the owner's decision — §23 has the contrast numbers
the rail's full bleed on a phonesyncBleed MEASURES the distance to each screen edge. Not 100vw (counts a desktop scrollbar → sideways page scroll)
/me or the home account rowsrc/js/me-page.js header. The row's "มีข้อมูลรอให้คุณตรวจสอบ" must come from the cards' own functions (identityCheckState, ownIssues) — the check moved off home and this is what keeps it from going quiet
"signed out" UI anywherethe first onAuthChange call is ALWAYS null, before the session restore. Say "signed out" only after authReady (syncMePage)
a click handler on in-app linkslet a modified click (⌘/Ctrl/Shift/Alt) through on an a[href] — departments.js does now
moving a featuregrep for the old place's NAME in prose (Thai and English, app + tools + docs) — four admin/tool strings still said "หน้าแรก"
any of this UInode tools/browser/home-hero.mjs (production-safe) and node tools/browser/me-page.mjs (samo-dev only, signed in) — skills/drive-the-browser.md §12

What happened, in order ​

  1. "Put the tools below the banner, horizontal scroll; banner autoswipe and manual swipe; slides for samoshop and ประกาศ." Loaded the apple-design skill. Chose native scroll-snap over a hand-animated track (1:1 touch and platform momentum for free); JS adds autoplay, mouse drag with momentum projection, holds (press/hover/visible focus/hidden/offscreen/pause button), reduced motion = no autoplay. The pause button is there because WCAG 2.2.2 requires one for content that moves on its own for >5 s. The shop slide uses the storefront's palette by adding .hero-slide--shop to the token selector in shop-storefront.css (one home). The ประกาศ slide names the pinned post else the newest, and shows its cover only if it has a real one — the stock Unsplash placeholder would read as news. The news slide is a dark island OFF the --ink scale on purpose (that scale flips in dark mode). The rail renders from the registry through the launcher's own renderer; it replaced the bottom "เริ่มต้นกับ SAMO" strip.

  2. Two carousel drag bugs, both 1-in-5 flakes in the driver, both found by instrumenting events rather than rerunning: (a) a drag whose moves were coalesced away read as a click and OPENED the slide link; (b) a short quick flick (120 px at 816 px/s, measured on production) projected to 1.54 slides and rounded back. Write-ups in docs/mistakes/frontend-ui.md.

  3. "Should ข้อมูลของฉัน move to a separate page?" Yes — Apple's account-row pattern. Cards moved unchanged to /me; home keeps one row with the flag; avatar menu entry; phone top bar's Logout became the avatar (an UNASKED design change — §23 asks the owner to confirm); drawer user strip opens /me; the Discord OAuth return /#discord=… is moved to /me client-side (the VM's callback was left alone, so links in flight keep working). Caught before shipping: the sign-in prompt flashed for a signed-in person opening /me directly (second site of an existing app-state.md rule).

  4. "Tools like this: icon with text under it, no description" (owner screenshot of an iOS icon), then the owner's palette, labels (SAMO Booking, SAMO Project, VitalSound), white glyphs, ฝ่าย logos for MDI/RT, and the banner's espresso bag mark for SAMO Shop (rebuilt from the same glyph and tokens, not the screenshot — sharp, untilted). My first cut gave pale colours a deep same-hue glyph for contrast; the owner said white, so it is white with a soft drop-shadow edge. Golden Period: the "ตารางข้อมูลเต็ม" heading + lead removed, the sheet button KEPT (they pasted only the text).

  5. Bug scan of the day's work: keyboard focus left on a hidden slide; stale "หน้าแรก" directions in four strings + three docs; ⌘/Ctrl-click cancelled on every in-app link (pre-existing, newly exposed by the new links); analytics had no label for tab:me; phone rail bleed and Thai label wrap (measured). Each CODE bug was FALSIFIED (fix removed → its driver check red → restored); the stale copy was found and fixed by grep, which is the only check prose has.

  6. "Scan until you find none" — the second pass. Swept every comment, stylesheet header and doc for claims that the cards are "on the home page" (14 rewritten to /me: my-seat.js ×4, admin-main.js ×2, my-house.js ×2, house/index.js, three CSS headers, tab-home/tab-team partial comments); deleted the dead .home-welcome rules (nothing renders that class since the account row replaced it); README gained a Home page feature line; the Discord callback's back() now points at the client-side /me redirect, and me-page.test.js pins the new URL('/', origin) it depends on. A typo had put a Devanagari character inside "ข้อมูล" in the README — fixed, and every file touched today was swept for non-Thai/non-Latin letters (only hit: the Russian spam quote in an old write-up, which is correct). Check counts were taken out of the skill and this note (they rot; the VERIFIED line in HANDOFF §23 keeps the dated one).

Decisions the owner made today (do not re-litigate) ​

  • Tool glyphs are WHITE on every colour, including pale ones.
  • The palette in tools.js (PR #ff8bbf, Golden Period #ffd077, …) and the rail labels SAMO Booking / SAMO Project / VitalSound.
  • MDI and RT use their ฝ่าย logos; SAMO Shop uses the banner's mark.

Working docs. STATE.md is the status file and lives at the repo root, not here.