Skip to content

2026-10-30 — the deploy chain moved out of STATE.md ​

STATE.md's ✅ DEPLOYED line had grown to 26 KB: every deploy since 2026-10-24 appended a "Before it" clause. Kept here verbatim (newest first) as the record of what each deploy served.

- ✅ **DEPLOYED = `20c23f5` (2026-10-30 — docs only: 0266's write-up served at `/docs/mistakes/postgres-schema` (greps "first fix guessed the state"); the 0266 change itself is database-only, applied to production first; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `23301d4` (2026-10-30 — docs + smoke only: three write-ups served, `/docs/mistakes/app-state` greps `retryDelayMs`; `DEPLOY_EXIT=0`; VM HEAD read back; docs published the same minute. Before it `c3c602e` (2026-10-30 — แลก Rotation: a failed board read backs off 3 s→60 s and says the data may be old; the off-criteria sheet shows the classmate's KKU Mail (0265 applied to production FIRST, rotation0265 11/11 there); served `/rotation` loads `page-u_ABps84.js` which greps `rotation_contact_email` + "เชื่อมต่อไม่ได้ชั่วคราว" with control `rotation_board`, `public-DEwvfotH.css` greps `rot-pill.is-stale`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back; `tools/browser/rotation-page.mjs` 38/38 on samo-dev. Before it `b679acd` (2026-10-26 — feat(rotation): show green, 0.2-0.3, >0.3, and missing GPA adjacent in Group B for practice showcase; served `/rotation` loads `page-dmD23_Te.js`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `6fa4b4c` (2026-10-26 — feat(rotation): enrich practice mode with 100% demo persona and off-criteria simulation (0.2–0.3, missing GPA, >0.3); served `/rotation` loads `page-daUbeiE5.js` which greps `one_asks_me_off_criteria` and `ask-off-criteria`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `6da27b2` (2026-10-26 — feat(rotation): dim unswappable members (staying and different sex); served `/rotation` loads `page-WVrDbkvA.js` which greps `is-dim` and `public-j9IQLCpV.css` which greps `.rot-member.is-dim`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `0e86298` (2026-10-26 — feat(rotation): show custom meme photos on 2nd, 3rd, and locked GPA edits; served `/rotation` loads `page-HH-7LoC3.js` which greps `rotation-memes/edit-2.jpg`, `rotation-memes/edit-3.jpg`, `rotation-memes/locked.jpg`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `bf13c4a` (2026-10-26 — fix(rotation): remove misleading dropdown of groups on member cards and fix template strings; served `/rotation` loads `page-CGajHibT.js` where `rot-admin-move` is absent; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `bfd0203` (2026-10-26 — fix(rotation): restore rotation_board state gatekeeper and remove non-existent academic_year (0263)). Before it `7db5b81` (2026-10-26 — feat(rotation): off-criteria swaps (0.2-0.3, missing GPA, >0.3) + anti-probing GPA edit lock (0262); served `/rotation` loads `page-BPugErBS.js` which greps `ask-off-criteria` and `rotMemeModal` with control `rotation_board`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `e956bb6` (2026-10-26 — feat(rotation): silent audit trail for GPA changes (0261) + admin audit viewer; served `/rotation` page chunk greps `view-gpa-audit` with control `rotation_board`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `9daa7f9` (2026-10-24 — feat(home): place rotation banner first and credit ภูริพัฒณ์ มหาพรหมรักษ์ (เอิง); served index.html greps `โดย ภูริพัฒณ์ มหาพรหมรักษ์ (เอิง)` as first slide; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `c71382f` (2026-10-24 — feat(home): add rotation banner slide to hero carousel and surface in tools rail; served index.html greps `hero-slide--rotation` and `public-D4gEzT_4.css` greps `.hero-slide--rotation`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `70d3347` (2026-10-24 — feat(rotation): safeguard chain-kick against misclick with confirmation checkbox; served `/rotation` loads `page-Cvvl6xZ-.js` which greps `data-rot-sheet-confirm` and `public-CuJiW89H.css` greps `rot-kick-btn`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `66df249` (2026-10-24 — feat(rotation): separate staying students from missing GPA callout and banner; served `/rotation` loads `page-BF7GCA1y.js` which greps `rot-unswappable-staying-box`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `aeba2a2` (2026-10-24 — fix(rotation): wire click listener to unswappable modal; served `/rotation` loads `page-KxA7JkfU.js` which greps `rotUnswappableModal`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `bef7038` (2026-10-24 — แลก Rotation: missing GPA visibility + dismiss open offers (0260 applied to dev and production FIRST) — HANDOFF §32; served `/rotation` loads `page-CvVjBnyo.js` which greps `dismiss-offer` + `view-unswappable`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `b9b3ef0` (2026-10-24 — แลก Rotation: allow chain starter to kick/reject a taker from an open leg (0259 applied to dev and production FIRST) — HANDOFF §32; served `/rotation` loads `page-ByOBiV9v.js` which greps `rotation_chain_kick` + "ปฏิเสธคนนี้"; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `5a7337f` (2026-10-24 — docs only: the แลกต่อเนื่อง design, `docs/ROTATION-CHAINS.md` served 200 at `/docs/ROTATION-CHAINS` and greps "Per seat"; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `378c8c5` (2026-10-24 — แลก Rotation follow-ups: swap pairs + who-just-moved, the guide, offers banner, โหมดทดลอง, contact + nickname, "ฉันอยากอยู่กลุ่มนี้", the faculty GPA rule ON, GPA visible to the owner's account only (0251–0254 applied to production FIRST) — HANDOFF §32; served `/rotation` has `id="rotAlert"`, `page-BAvyQV7h.js` greps `rotation_set_staying` + `many_ask_me` + `gpa_viewer` with control `rotation_events`; `/var/www/docs` published the same minute; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `88c9253` (2026-10-24 — แลก Rotation ปี 6 at `/rotation` (0250 applied to production FIRST, roster imported, round CLOSED + hidden — HANDOFF §32); served `/rotation` HTML has `id="pills-rotation"`, `page-Bp31h4vI.js` greps `rotation_board` + "ดูและตอบรับ" with control `rotation_events`, `/docs/ROTATION-SWAP` 200; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `27acc42` (2026-10-23 — docs + HANDOFF §31c (the Q1-day เริ่มปี SAMO loop, reproduced, fix drafted on samo-dev only — 0249 NOT on production) + two unused imports dropped; served `/docs/state/HANDOFF` greps "Pressing เริ่มปี SAMO on Q1 day"; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `0350612` (2026-10-23 — ONE year system: 1 มี.ค. starts the ปี SAMO for every system and the Passport วาระสโม together (0248, applied to production FIRST; SAMO'69 bridged to 2569) + the check-ignore guard fix — HANDOFF §31; served `samo-year-admin-DUEx7HSq.js` greps `next_samo_year` + "พร้อมวาระสโมของ Passport" with control "ส่งต่อให้ทีมใหม่", `core-CM8ZxeK9.js` greps `Content-Profile` (the chip's season_status call), Passport `admin-*.js` greps "ปี SAMO + วาระสโมใหม่"; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `59710b1` (2026-10-23 — Passport's ฝ่าย list is admin-managed from ทีม SAMO (0247; รพ. ร่วมผลิต #11 + #5–#7 added on production through the RPC) and moving an activity's quarter moves its points (0246), both applied to production FIRST — HANDOFF §30; served `/passport/html/admin.html` has `depts-section` and no hand-typed `<option>`, `admin-*.js` greps `department_catalog` + `QUARTER_NOT_OPEN_HAS_SCANS` with control `start_season`, `depts-*.js` greps `list_passport_departments`; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `372db5e` (2026-10-23 — the frozen Passport leaderboard (PostgREST row cap → `pagedFetch` on every client) + ปีการศึกษา and Passport quarters change themselves (0244/0245, applied to production FIRST, Q3 repaired backwards) — HANDOFF §29; served `/passport/assets/routes-*.js` greps `ROW-CAP`, `admin-*.js` greps `start_season`, `scan-*.js` greps `SEASON_NOT_OPEN`, `core-Dpb2UdVh.js` greps `set_academic_year_schedule` + `rpc/season_status`, `samo-year-admin-9InF3V8l.js` greps `data-sy-acad-save` with control `ส่งต่อให้ทีมใหม่`; `row-cap-probe.mjs` 6/6 on production after the deploy; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `14ab059` (2026-10-23 — docs only: HANDOFF §28 matches what shipped (grid, Safari checks, what was removed); served `/docs/state/HANDOFF` greps "What was tried and REMOVED"; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `374bf26` (2026-10-23 — ภาพรวม keeps the ฝ่าย order: a ฝ่าย with >5 ฝ่ายย่อย is a TALL tile (two rows), no dense fill; read back from PRODUCTION at 1440×900 and 390×844 — 11 tiles, reading order = ฝ่าย order; `DEPLOY_EXIT=0`; VM HEAD read back. Before it `26290f3` (2026-10-23 — ภาพรวม card opens/closes as a 0.94 scale toward the tile + fade (no shrink into the tile), closing overlay ignores the pointer; served `public-CFp0o5sN.js` greps `transformOrigin`, old `scale(0.96)` 0, control `orgo-sr`; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `2e93d70` (2026-10-23 — ภาพรวม is one aligned grid on every device (5/3/2 cols, ฝ่าย order, >5 ฝ่ายย่อย = wide tile), masonry deleted; served `public-BJInkF0t.js` + `public-CdP63f-Q.css` grep `is-wide` / `row dense`, `is-laid` 0, control `orgo-sr`; production layout read back at 1440×900 and 390×844 (11 ฝ่าย, the wide tile on its own row); `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `36a1add` (2026-10-23 — ภาพรวม on phones is an aligned two-column grid in reading order (masonry stays on desktop); served `public-eatuO_rj.js` + `public-BOgwzgDM.css` grep `--orgo-layout`, control `orgo-sr`; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `8567c77` (2026-10-23 — ภาพรวม tile disclosure is "N คน ›", verb for screen readers only; served `public-DujjEilW.js` greps `orgo-sr`, `ดูทุกคน · ` 0, control `--orgo-cols`; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `9c165a0` (2026-10-23 — ภาพรวม tiles end in "ดูทุกคน · N คน ›" (hint sentence removed), tiles placed by `layoutOverview`, 5 columns ≥992px; served `public-7t-TgSTS.js` greps `ดูทุกคน` + `--orgo-cols`, old hint 0, control `data-sheet-jump`; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `cf24d3e` (2026-10-23 — ภาพรวม arrival glow only on a section that cannot reach the top, softer (18% rise-and-fade, 0.9s); served `public-BSIbLymV.css` greps the new `orgsArrive` keyframes, control `more-right`; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `2d52385` (2026-10-22 — ภาพรวม's jump row follows the reader: selected chip tracks the scroll, arrival flash, edge fades; served `public-B3fZMuvi.js` + `public-CylkwXn6.css` grep `is-arrived` / `more-right`, control `data-sheet-jump`; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `683caa4` (2026-10-22 — ภาพรวม's sheet is one open list: sticky ฝ่ายย่อย headers + a jump row, no disclosures, no modes (open items HANDOFF §28); served `public-Du4jASG2.js` greps `data-sheet-jump`, `data-sheet-mode` 0, control `ผังสายงาน`; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `4dbb8bb` (2026-10-22 — bug scan: double-tap no longer closes the sheet, WebKit-safe masonry cells, stale "no scroll" prose, frontend-ui.md write-up; served `/docs/mistakes/frontend-ui` greps "in an intrinsic pass"). Before it `20b106e` (2026-10-22 — ภาพรวม tiles run edge to edge on phones (8px gutter); served `public-Dk7lAh78.css` greps `50% - 50vw + .5rem` + control `orgo-sub-who`, `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `2478561` (2026-10-22 — ภาพรวม on phones shows every ฝ่ายย่อย head too (two-column masonry, page scrolls ~1.5 screens); served `public-CemgZIbl.css` greps `@media(max-width:599.98px){…orgo-grid{columns:2`, `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `9a75981` (2026-10-22 — ภาพรวม lists every ฝ่ายย่อย with its head (masonry columns, no "+N"), the sheet opens as a who-heads-what list; served `public-C87SRPB_.js` greps `orgo-sub-who` + `orgc-unit-head`, control `ผังสายงาน`, `และอีก` 0, `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `bc5cf88` (2026-10-22 — เกี่ยวกับเรา gets a fourth view, ภาพรวม: the whole org on one screen, each ฝ่าย opens a sheet (default view unchanged); served `public-D_5PeEuY.js` greps `orgo-apex` + control `ผังสายงาน`, `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `2b6c31f` (2026-10-22 — year0242 registered so `npm run proofs` runs again (68/75 prod, HANDOFF §27) + two mistakes write-ups; served `/docs/state/HANDOFF` greps "7 stale on production", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `fbb7c9e` (2026-10-22 — tools + docs: `house-year-sheets --gaps-only` leaves out rows ฝ่ายข้อมูล answered (MD52 7 → 1 on a production dry run); served `/docs/state/HANDOFF` greps "answered rows are not sent back", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `50ce1b3` (2026-10-22 — docs only: HANDOFF §26 MD53/MD54 สาย 256 decided correct; `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `523cf73` (2026-10-22 — ข้อมูลไม่ครบ: rows ฝ่ายข้อมูล answered move to ตอบแล้ว (ต้องมีคนทำ 12 → 6 on production), TONE_ORDER; served `admin-nSG1ZHZs.js` greps "ฝ่ายข้อมูลตอบแล้ว — ยังเปิดที่ไว้", `house-sai-grid.mjs` 16/16 on samo-dev, `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `edb3958` (2026-10-22 — docs only: HANDOFF §26b decisions + the half-identity kkumail edit gap; served `/docs/state/HANDOFF` greps "moves only HALF", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `19a1035` (2026-10-22 — review fixes (66-prefixed landline phones), `tools/browser/house-advisor-page.mjs` 16/16 on samo-dev, samo-dev browser scripts survive the users guard again, MD51 kkumail answers imported (held 106 → 30, HANDOFF §26b); served `/docs/state/HANDOFF` greps "MD51 แบบสอบถาม", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `7c9d01e` (2026-10-21 — อาจารย์ page: สายที่ดูแล | ทั้งบ้าน switch + อาจารย์ร่วมบ้าน, HANDOFF §26 (data owed); served `/admin/` HTML greps `hadvScopeSeg`, `/docs/state/HANDOFF` greps "imported 2026-10-21", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `864a4b1` (2026-10-21 — ระบบบ้าน อาจารย์ phones: 0243 applied to production FIRST (`house0243` 20/20 prod), 125 อาจารย์ + 113 phones imported; served `/admin/` HTML has `id="haPhone"` + "เห็นเฉพาะผู้ดูแลระบบบ้าน นักศึกษาไม่เห็น", `core-PjBop8gO.js` greps `advisor_phones(phone)`, `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `5bd6116` (2026-10-21 — docs only: HANDOFF §17 night agent PAUSED mid task 20 + the stop command in `skills/night-agent.md` no longer kills its own ssh shell; served `/docs/state/HANDOFF` greps "PAUSED AGAIN", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `05169b1` (2026-10-20 — docs only: HANDOFF §17 night agent PAUSED, no sha in HANDOFF (its CI guard went red on the first wording); served `/docs/state/HANDOFF` greps "WIP commit at the tip", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `677d4b1` (2026-10-20 — ระบบบ้าน อาจารย์ tab is a finder: type a name, tap, see their นักศึกษา by สาย or ชั้นปี; house sub-nav scrolls on phones; served `/admin/` HTML greps "พิมพ์ชื่ออาจารย์ เพื่อดูนักศึกษาในความดูแล" + `house-subnav`, `admin-LtcEY0gy.js` and `admin-E_c5wyYR.css` grep `hadv-seg`, `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `ab02bfb` (2026-10-20 — the ปี admin page `/admin/#years` + 0242 `start_samo_year` (applied to production FIRST, `year0242` 23/23 prod); served `/admin/` HTML has `data-admin-pane="years"` + `adminYearChip`, `admin-C2DkdobR.js` greps the `hasOwnProperty.call` iOS fix, `samo-year-admin-C6JN2mZj.js` greps "ครั้งนี้ไม่เปลี่ยน", `/docs/state/HANDOFF` greps "The ปี admin page", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `4ce2a7c` (same work minus the two scan fixes). Before it `4fa7f78` (2026-10-20 — docs only: HANDOFF §17 night-agent status; served `/docs/state/HANDOFF` greps "RUNNING task 15", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `da0c236` (2026-10-20 — night agent tasks 8–13 REVIEWED + merged, 12 defects fixed, 0230–0233 applied to production first; served `/admin/` loads `admin-Dc_clc_u.js`, which greps "เก็บเข้าคลังได้", `public-0BQTSBZB.js` greps the ⌘-click selector, `/docs/state/HANDOFF` greps "DONE 2026-10-20 by the owner session", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `16a39ce` (2026-10-20 — night agent stops at the natural weekly reset; manual-reset + board gap recorded in HANDOFF §17; served HANDOFF greps "does not see a manual reset", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `beb1801` (2026-10-20 — night agent tasks 20–21 added, queue 13–23 (docs + queue only); served `/docs/state/HANDOFF` greps "Passport on a phone", `DEPLOY_EXIT=0`; read back from the VM's HEAD. Before it `42f1622` (2026-10-20 — quality queue armed; served HANDOFF greps "the quality queue". Before it `8302cdb` (2026-10-19 — night agent runs to 100%: `Reserve sessions: 0` drops the margin and stop line, `Revise passes: N` keeps a finished queue scanning; served `/docs/state/HANDOFF` greps "RUNNING TO 100%", VM runner installed, live gate `หยุดที่ 100%`; read back from the VM's HEAD. Before it `42d032d` (2026-10-19 — night agent: a stop at the owner's week reserve is no longer reported as a Claude booking (watch exit 7, `CUT_BY=reserve`); served `/docs/mistakes/tooling-proofs` greps "showed nobody booked", VM runner + queue.mjs installed, live `allowance` on the VM returns `for:"reserve"`; read back from the VM's HEAD. Before it `7cc1d83` (2026-10-18 — night-agent docs + handoff (HANDOFF §17, `docs/state/claude-2026-10-18.md`), reset checkpoint follows the measured reset; served `/docs/state/claude-2026-10-18` and `/docs/state/HANDOFF` grep the new text, VM runner + queue.mjs diff clean; read back from the VM's HEAD. Before it `0a120db` (2026-10-18 — the night agent takes what the Claude booking board offers an unbooked person (rail band for the current minute; allowance fixed at task start; `skills/night-agent.md`); served `/docs/mistakes/tooling-proofs` greps "UNBOOKED USER", VM runner byte-identical to the repo, live gate waits on the 21:30–00:00 booking; read back from the VM's HEAD. Before it `f3900b5` (2026-10-18 — night agent: a booking stops only NEW work, the runner no longer reads task reports as errors, timeouts capped inside systemd's 5 h; served `/docs/mistakes/tooling-proofs` greps "would have started inside a 100% Claude booking"; read back from the VM's HEAD. `4b4b0ed` before it FAILED at the docs build (a bare `<sha>` in markdown) — CI would have said so; fixed, not left. Before it `a6a2291` (2026-10-18 — PENDING release note for the booking-aware night agent; PENDING is not bundled, so the evidence is the VM's HEAD, read back. Before it `77c38dc` (2026-10-18 — the night agent honours the Claude booking board: the reporter leaves `~/samo-night/bookings.json`, the runner gates and watches on it (`skills/night-agent.md`); live gate on the VM refused with the real 21:30–00:00 booking; read back from the VM's HEAD. Before it `8caf2f5` (2026-10-16 — docs wording only; served `/docs/state/claude-2026-10-16` greps "the only check prose has"; read back from the VM's HEAD. Before it `1ee7842` (2026-10-16 — second sweep: stale "home page" comments → /me, dead `.home-welcome` CSS removed, README Home page line; served CSS has `home-me` and no `home-welcome`, `/docs/state/claude-2026-10-16` serves step 6, `/discord/config` 200; read back from the VM's HEAD. Before it `bd72741` (2026-10-16 — bug scan: banner focus follows the slide, ⌘/Ctrl-click opens a new tab, "หน้าแรก" directions → ข้อมูลของฉัน, analytics `/me` label; served public chunk greps `a[href][data-dept-tool-tab]`, admin HTML has the new ระบบบ้าน copy and not the old, `/docs/state/claude-2026-10-16` 200, `home-hero.mjs` 34/34 on production; read back from the VM's HEAD. Before it `c536c9f` (2026-10-16 — home tool row as home-screen icons (owner's colours/labels, MDI/RT ฝ่าย logos, shop = banner mark), Golden Period sheet heading removed; served chunks grep `SAMO Booking` / `launcher-tool-icon--logo`, HTML has no `ตารางข้อมูลเต็ม`, `home-hero.mjs` 28/28 + 28/28 on production; read back from the VM's HEAD. Before it `75aa6f5` (2026-10-16 — ข้อมูลของฉัน moved to its own page `/me`, home keeps one account row, phone top bar = avatar; served `public-*.js` greps `pills-me-tab` + `meSignedOut`, `/me` 200 with `meMySeat` and no `homeMySeat`; `tools/browser/me-page.mjs` 17/17 on samo-dev (signed in — it refuses production), `home-hero.mjs` 28/28 on production; read back from the VM's HEAD. Before it `4248b9a` (2026-10-16 — home banner carousel (welcome · SAMO Shop · ประกาศ) + tool rail under it, flick fix; served core chunk greps `hero-progress`, `tools/browser/home-hero.mjs` 28/28 against production twice; read back from the VM's HEAD. Before it `466451b` (2026-10-15 — ยอดขาย review round + handoff docs; served admin chunk greps "ยังไม่ส่งสลิป หรือสลิปไม่ถูกต้อง" and "ไม่เต็มสัปดาห์", `/docs/state/claude-2026-10-15` served; read back from the VM's HEAD. Before it `9f06a5f` (2026-10-15 — shop admin ต้องจัดการ row + slip queue rebuilt + order ประวัติ; served admin chunk greps "รอลูกค้าส่งสลิปใหม่" and "เรียงจากส่งสลิปก่อน", CSS greps `attn-tile`/`om-history`; read back from the VM's HEAD. Before it `c2e3b20` (2026-10-15 — ยอดขาย grid in baht: revenue per size / colour / cell; served admin chunk greps "ไซส์ × สี แสดงเป็น", CSS greps `sales-matrix-pct`; read back from the VM's HEAD. Before it `ffe4534` (2026-10-15 — SAMO Shop ยอดขาย tab + admin polish; served admin chunk greps "ส่งออกยอดขาย", served CSS greps `sales-hero-value`, `/docs` greps the new tooling write-up; read back from the VM's HEAD. Before it `92aefff` (2026-10-14 — Apps Script v16 recorded; served `/docs/state/claude-2026-10-14` greps "Keep checking"; read back from the VM's HEAD. Before it `26240c4` (— session note `docs/state/claude-2026-10-14.md` served, stale-archive badge no longer invites a mid-handover re-publish (served chunk greps "เผยแพร่ซ้ำถ้ายังเป็นทีมปีนี้"); read back from the VM's HEAD. Before it `f5b0ebd` (fifth deploy — handover guidance publish → edit → switch (served chunk greps "ส่งต่อให้ทีมใหม่", old advice absent), 0227/0228 applied dev + prod; smoke 17/17; read back from the VM's HEAD. Before it `b24c458` (fourth deploy — HANDOFF §22 now says Apps Script live is v15, served `/docs/state/HANDOFF` greps "live: v15"; read back from the VM's HEAD. Before it `aa564b4` (third deploy — 0226 write-up in `/docs` (served page greps "explicit anon grant"); Apps Script v15 (memoised top-folder ids); smoke 17/17; read back from the VM's HEAD. Before it `de832a8` (v13 hardening write-ups), then `d147d2c` (2026-10-14 — SAMO-year work 0219–0224 (PR/VS year pickers, PR CSV export, ทีม SAMO handover, year-export tool) + 0225 publish fix + ฝ่าย logos (PR #23) + previews' picture fix; served chunks grep `prStaffYearFilter` / `start_team_term` / `dept-title-logo`, `/dept-icons/rt.png` 200 image/png; browser smoke 17/17; read back from the VM's HEAD. Before it `59af05e` (2026-10-13 night — ระบบบ้าน follow-up flow + ผังตามสาย picker, served chunks grep `houseSaiGridChips` / `set_unresolved_follow_up`; before it `4cb9e9d`; `4b88939` earlier that day + nginx framing headers installed by hand, `.bak-20261013` kept)** — `4cb9e9d` adds only the ระบบบ้าน import-back write-up in `/docs` (served page greps it) and an unused รหัส check-digit helper; v4.8.0 + unreleased fixes (tag `v4.8.0` = `d08ffcb`; notes staged in PENDING), read back from the VM's

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