diff --git a/AGENTS.md b/AGENTS.md index 45122d1..f0af3d7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -39,18 +39,18 @@ for sideways scroll at 360/390/820/1280/1440. Two widths because one was not eno desktop width reported zero violations while eight buttons below 640px had no accessible name at all. ด่านนี้ยัง **เปิดพาเนลขึ้นมาตรวจด้วย** ไม่ใช่สแกนแค่หน้าตอนโหลด — พาเลตสูตร, AI, ข้อมูลสด, conditional -formatting, กราฟ, pivot, ค้นหา/แทนที่, จำกัดค่า, ชื่อช่วง, คอมเมนต์, หน้าคีย์ลัด, แถบเตือนตอนบันทึกไม่ลง ช่องสีพื้น หน้าต่างถามตอนเปิดไฟล์ทับงาน หน้าต่างถามก่อนเริ่มไฟล์ใหม่ หน้าต่างถามก่อนเรียงที่สูตรจะผิด รายงานสิ่งที่ไฟล์เก็บไว้ไม่ได้ หน้าต่างถามก่อนวางทับแถวที่ตัวกรองซ่อน ช่องแก้ชื่อชีตที่บอกว่าชื่อผิดกติกา Excel หน้าต่างถามของแท็บที่สองบนงานเดียวกันกับแถบของแท็บที่ดูอย่างเดียว การ์ดคำตอบของผู้ช่วย AI ทั้งแบบมีสูตรและแบบชี้ไปฟอร์ม แถบของแท็บที่แก้ต่อเพราะอีกแท็บปิด หน้ากู้งานหลังแอปพัง หน้าต่างแปลงเป็นวันที่ แถบของข้อมูลตัวอย่างหลังกดเปิด เมนูคลิกขวาที่เซลล์ การ์ดปัญหาบนหน้า landing ที่กางออก สองหน้าต่างของข้อมูลสด (เลือกข้อมูล · เพิ่มแหล่งข้อมูล) ฟอร์มต่อ API จากเบราว์เซอร์กับรายการตรวจสำหรับ IT ที่ขึ้นตอนต่อไม่ติด และห้าอย่างที่มีเฉพาะบนมือถือ (เมนู · เครื่องมือเซลล์ · แถบปุ่มตอนพิมพ์สูตร · แถบเลือกช่วงตอนกด ⌖ · ป้าย "แตะอีกครั้งเพื่อพิมพ์" หลังแตะครั้งเดียว สแกนเฉพาะที่ 390px ด้วยจอสัมผัส) กล่องจากสถานะบันทึก ข้อความลอยหลังเปิดไฟล์ และสองขนาดจอเตี้ย (มือถือแนวนอน 844×390 · ซูม 200% 195×422 ซึ่งตกด่านถ้าหน้าเลื่อนข้างได้) บนหน้า `/`, `/app`, `/guide`, หน้า 404 และหน้าสูตร (`/formulas` กับ `/formulas/sumif`) รวม 119 checks **เพิ่มพาเนลใหม่เมื่อไร เติมใน +formatting, กราฟ, pivot, ค้นหา/แทนที่, จำกัดค่า, ชื่อช่วง, คอมเมนต์, หน้าคีย์ลัด, แถบเตือนตอนบันทึกไม่ลง ช่องสีพื้น หน้าต่างถามตอนเปิดไฟล์ทับงาน หน้าต่างถามก่อนเริ่มไฟล์ใหม่ หน้าต่างถามก่อนเรียงที่สูตรจะผิด รายงานสิ่งที่ไฟล์เก็บไว้ไม่ได้ หน้าต่างถามก่อนวางทับแถวที่ตัวกรองซ่อน ช่องแก้ชื่อชีตที่บอกว่าชื่อผิดกติกา Excel หน้าต่างถามของแท็บที่สองบนงานเดียวกันกับแถบของแท็บที่ดูอย่างเดียว การ์ดคำตอบของผู้ช่วย AI ทั้งแบบมีสูตรและแบบชี้ไปฟอร์ม แถบของแท็บที่แก้ต่อเพราะอีกแท็บปิด หน้ากู้งานหลังแอปพัง หน้าต่างแปลงเป็นวันที่ แถบของข้อมูลตัวอย่างหลังกดเปิด เมนูคลิกขวาที่เซลล์ การ์ดปัญหาบนหน้า landing ที่กางออก สองหน้าต่างของข้อมูลสด (เลือกข้อมูล · เพิ่มแหล่งข้อมูล) ฟอร์มต่อ API จากเบราว์เซอร์กับรายการตรวจสำหรับ IT ที่ขึ้นตอนต่อไม่ติด ป้ายใต้เซลล์ข้อมูลสดที่ถูกพิมพ์ทับ และห้าอย่างที่มีเฉพาะบนมือถือ (เมนู · เครื่องมือเซลล์ · แถบปุ่มตอนพิมพ์สูตร · แถบเลือกช่วงตอนกด ⌖ · ป้าย "แตะอีกครั้งเพื่อพิมพ์" หลังแตะครั้งเดียว สแกนเฉพาะที่ 390px ด้วยจอสัมผัส) กล่องจากสถานะบันทึก ข้อความลอยหลังเปิดไฟล์ และสองขนาดจอเตี้ย (มือถือแนวนอน 844×390 · ซูม 200% 195×422 ซึ่งตกด่านถ้าหน้าเลื่อนข้างได้) บนหน้า `/`, `/app`, `/guide`, หน้า 404 และหน้าสูตร (`/formulas` กับ `/formulas/sumif`) รวม 121 checks **เพิ่มพาเนลใหม่เมื่อไร เติมใน `OPENED_STATES` เมื่อนั้น** และสถานะที่เปิดไม่ขึ้นถือว่าด่านตก ไม่ใช่ข้าม The gate also **opens panels before scanning them** rather than only scanning the page as it loads — the formula palette, AI, live data, conditional formatting, charts, pivots, find/replace and the shortcut -dialog, the validation, names and comment popovers, the alert shown when a save is refused, the fill swatches, the dialog asked when a file would open on top of work, the one asked before New file, the one asked before a sort that would get a formula wrong, the report of what an opened file cannot keep, a sheet-name editor saying why Excel would refuse the name, the one asked before a paste over rows a filter hides, the one a second tab on the same workbook asks and the notice on a tab that is only looking, the AI assistant's answer card and the one that declines and points at a form, the notice on a tab that edits again because the other closed, the rescue screen after a crash, the Convert to dates dialog, the sample's notice once it is opened, the cell menu, a landing problem card unfolded, the two live-data dialogs (the picker and adding a source), the connect-from-this-browser form and the checklist for IT it shows when a connection fails, and five things only a phone shows (the menu, cell tools, the keys bar while a formula is typed, the picking bar after ⌖ and the "tap again to type" label after one tap, scanned at 390px only with a touch screen), the save status's popover, the toast after a file opens, and two short screens (a phone on its side at 844×390, and 200% zoom at 195×422, which also fails on sideways scroll), across `/`, `/app`, `/guide`, the 404 page and the formula pages (`/formulas` and `/formulas/sumif`) — 119 checks in all. **A new panel means a new entry in `OPENED_STATES`**, and a state that will not +dialog, the validation, names and comment popovers, the alert shown when a save is refused, the fill swatches, the dialog asked when a file would open on top of work, the one asked before New file, the one asked before a sort that would get a formula wrong, the report of what an opened file cannot keep, a sheet-name editor saying why Excel would refuse the name, the one asked before a paste over rows a filter hides, the one a second tab on the same workbook asks and the notice on a tab that is only looking, the AI assistant's answer card and the one that declines and points at a form, the notice on a tab that edits again because the other closed, the rescue screen after a crash, the Convert to dates dialog, the sample's notice once it is opened, the cell menu, a landing problem card unfolded, the two live-data dialogs (the picker and adding a source), the connect-from-this-browser form and the checklist for IT it shows when a connection fails, the note under a live-data cell that was typed over, and five things only a phone shows (the menu, cell tools, the keys bar while a formula is typed, the picking bar after ⌖ and the "tap again to type" label after one tap, scanned at 390px only with a touch screen), the save status's popover, the toast after a file opens, and two short screens (a phone on its side at 844×390, and 200% zoom at 195×422, which also fails on sideways scroll), across `/`, `/app`, `/guide`, the 404 page and the formula pages (`/formulas` and `/formulas/sumif`) — 121 checks in all. **A new panel means a new entry in `OPENED_STATES`**, and a state that will not open fails the gate rather than being skipped. -`npm run check:e2e` ขับแอปจริงในเบราว์เซอร์ 57 flow — เปิดแผงถาม AI แล้วสิ่งที่พิมพ์ลงช่องคำถามไม่ลงเซลล์ที่ถูกบัง และ Esc ปิดแผงแล้ว focus กลับเซลล์เดิม, บนมือถือแตะเซลล์สูตรครั้งที่สองแล้วช่องแก้ไขเปิดพร้อมสูตรครบ และสิ่งที่พิมพ์ไม่ไปทับเซลล์สองแถวล่าง แตะเซลล์อื่นแล้วเลือกแค่เซลล์นั้น, บนมือถือพิมพ์หลัง Enter ลงเซลล์ที่มีค่าแล้วแทนที่ค่าเดิม ไม่ต่อท้าย และแตะซ้ำยังแก้ต่อท้ายได้, บนมือถือหลัง Enter ในแถบสูตรแตะเซลล์แล้วเลือกเซลล์นั้น ไม่ต่อที่อยู่ลงสูตรของเซลล์ถัดไป และสูตรที่แค่เปิดดูไม่ถูกชี้ใส่, พิมพ์ C02 ลงช่อง dropdown แล้วได้ C02 ไม่ใช่ตัวแรกที่ขึ้นต้นด้วย C ค่านอกรายการถูกปฏิเสธและบอกเหตุผล และเลือกจากรายการยังบันทึกได้ ทั้งที่ 1280 และ 390, เปิดไฟล์จริงที่มีรูป กราฟ และฟังก์ชันที่เอนจินไม่มีแล้วแอปบอกก่อนว่าจะหาย ปิดแล้วเปิดดูจากเมนูได้ ไฟล์ธรรมดาไม่เห็นอะไร และชื่อช่วงที่นำเข้าไม่ได้อยู่ในรายงานเดียวกัน ไม่ใช่ alert แยก, แหล่งข้อมูลสดที่ตอบหลังหน้าต่างเลือกข้อมูลเปิดไม่ทำให้เซลล์กลายเป็นช่องว่าง, หน้าสูตรกด "ลองในตาราง" แล้วค่าในเซลล์ตรงกับบนหน้า ชื่อบทเรียนหายจาก URL และบนงานที่มีอยู่ถามก่อนโดยตัวเลือกที่ focus เก็บงานไว้, งานเก่าที่ชื่อชีตซ้ำหรือผิดกติกา Excel เปิดมาแล้วชื่อถูกและสูตรชี้แท็บที่ถูก ตั้งชื่อผิดกติกาแล้วถูกปฏิเสธตรงที่พิมพ์ และส่งออกได้ไฟล์ที่ชื่อชีตกับสูตรถูกต้อง, ปิดแท็บที่แก้อยู่แล้วแท็บที่ดูอยู่แก้ต่อได้เองพร้อมงานครบ, แอปพังแล้วหน้ากู้งานขึ้น ไฟล์ที่โหลดมีงานครบ และลองอีกครั้งกลับมาที่ตารางเดิม, วันที่ พ.ศ. นับได้จริงและคำสั่งแปลงเป็นวันที่จากเมนูคลิกขวาแสดงตัวอย่างและ undo ครั้งเดียวกลับ, ผู้ช่วย AI ใส่ยอดรวมใต้คอลัมน์ไม่ทับสูตรเดิม และคำถามที่มีเงื่อนไขชี้ไปฟอร์ม SUMIF, ลากเลือกช่วงบนมือถือไม่เลยคอลัมน์และแตะระหว่างพิมพ์ `=` ไม่บันทึกทับ, แตะครั้งเดียวบนมือถือแค่เลือก ไม่มีคีย์บอร์ดค้าง เซลล์บอก "แตะอีกครั้งเพื่อพิมพ์" และสิ่งที่พิมพ์ไม่หายเงียบ, Enter หรือ ↓ ที่แถวสุดท้ายเพิ่มแถวโดยไม่มีค่าไหนถูกทับและ undo ครั้งเดียวเอาค่ากับแถวออกแล้วพิมพ์ต่อได้, บนมือถือ undo ตอนช่องแก้ไขเปิดอยู่บนแถวที่ Enter งอกขึ้นมาแล้วช่องปิด บอกว่าทิ้งข้อความที่พิมพ์ค้าง และค่าถัดไปพิมพ์ลงได้, แท็บที่สองบนงานเดียวกันถามก่อน ขอใช้แล้วแท็บเดิมดูอย่างเดียวและไม่มีงานหาย, วันที่ในคอลัมน์กว้างค่าตั้งต้นของ Excel ขึ้นเป็นวันที่ไม่ใช่ `###` ทั้งที่ 1280 และ 390, ชีตชื่อไทยดาวน์โหลดเป็นไฟล์ชื่อไทย, เรียงชีตตัวอย่างแล้วทุกแถวยังคูณของตัวเองและการเรียงที่สูตรจะผิดถามก่อน, กรองแล้วกด Delete บนช่วงที่เห็นแถวที่ซ่อนไม่หาย และวางทับแถวที่ซ่อนแล้วถามก่อน, เปอร์เซ็นต์ที่บันทึกไว้ก่อน #53 ยังขึ้นเหมือนเดิมหลัง migrate, เปิดมาเป็นตารางว่างและข้อมูลตัวอย่างที่ค้างในเบราว์เซอร์ไม่กลับมา (แต่ถ้าแก้แล้วต้องอยู่) ไฟล์ใหม่ถามก่อนและ Ctrl+Z เอางานคืน, พิมพ์สูตรแล้วดูค่าขยับ, ส่งออก `.xlsx` แล้วนำกลับเข้ามา, เปิดไฟล์ทับงานแล้วแอปถามก่อน (ตัวเลือกที่ focus อยู่ต้องเก็บงานไว้ และ undo ถอนไฟล์ออกได้) พร้อม `Ctrl+B`, Tab ตามแถวแล้ว Enter กลับคอลัมน์แรก กับเมนูเซลล์จาก `Shift+F10`, ลากคอลัมน์ให้กว้างแล้ว undo ครั้งเดียวกลับ, Enter บนมือถือเข้าช่องถัดไปโดยคีย์บอร์ดไม่พับ, +`npm run check:e2e` ขับแอปจริงในเบราว์เซอร์ 58 flow — พิมพ์ทับเซลล์ข้อมูลสดแล้วมีป้ายใต้เซลล์บอกเหตุผลและ Enter ไม่พาเคอร์เซอร์หนีไปก่อนอ่าน, เปิดแผงถาม AI แล้วสิ่งที่พิมพ์ลงช่องคำถามไม่ลงเซลล์ที่ถูกบัง และ Esc ปิดแผงแล้ว focus กลับเซลล์เดิม, บนมือถือแตะเซลล์สูตรครั้งที่สองแล้วช่องแก้ไขเปิดพร้อมสูตรครบ และสิ่งที่พิมพ์ไม่ไปทับเซลล์สองแถวล่าง แตะเซลล์อื่นแล้วเลือกแค่เซลล์นั้น, บนมือถือพิมพ์หลัง Enter ลงเซลล์ที่มีค่าแล้วแทนที่ค่าเดิม ไม่ต่อท้าย และแตะซ้ำยังแก้ต่อท้ายได้, บนมือถือหลัง Enter ในแถบสูตรแตะเซลล์แล้วเลือกเซลล์นั้น ไม่ต่อที่อยู่ลงสูตรของเซลล์ถัดไป และสูตรที่แค่เปิดดูไม่ถูกชี้ใส่, พิมพ์ C02 ลงช่อง dropdown แล้วได้ C02 ไม่ใช่ตัวแรกที่ขึ้นต้นด้วย C ค่านอกรายการถูกปฏิเสธและบอกเหตุผล และเลือกจากรายการยังบันทึกได้ ทั้งที่ 1280 และ 390, เปิดไฟล์จริงที่มีรูป กราฟ และฟังก์ชันที่เอนจินไม่มีแล้วแอปบอกก่อนว่าจะหาย ปิดแล้วเปิดดูจากเมนูได้ ไฟล์ธรรมดาไม่เห็นอะไร และชื่อช่วงที่นำเข้าไม่ได้อยู่ในรายงานเดียวกัน ไม่ใช่ alert แยก, แหล่งข้อมูลสดที่ตอบหลังหน้าต่างเลือกข้อมูลเปิดไม่ทำให้เซลล์กลายเป็นช่องว่าง, หน้าสูตรกด "ลองในตาราง" แล้วค่าในเซลล์ตรงกับบนหน้า ชื่อบทเรียนหายจาก URL และบนงานที่มีอยู่ถามก่อนโดยตัวเลือกที่ focus เก็บงานไว้, งานเก่าที่ชื่อชีตซ้ำหรือผิดกติกา Excel เปิดมาแล้วชื่อถูกและสูตรชี้แท็บที่ถูก ตั้งชื่อผิดกติกาแล้วถูกปฏิเสธตรงที่พิมพ์ และส่งออกได้ไฟล์ที่ชื่อชีตกับสูตรถูกต้อง, ปิดแท็บที่แก้อยู่แล้วแท็บที่ดูอยู่แก้ต่อได้เองพร้อมงานครบ, แอปพังแล้วหน้ากู้งานขึ้น ไฟล์ที่โหลดมีงานครบ และลองอีกครั้งกลับมาที่ตารางเดิม, วันที่ พ.ศ. นับได้จริงและคำสั่งแปลงเป็นวันที่จากเมนูคลิกขวาแสดงตัวอย่างและ undo ครั้งเดียวกลับ, ผู้ช่วย AI ใส่ยอดรวมใต้คอลัมน์ไม่ทับสูตรเดิม และคำถามที่มีเงื่อนไขชี้ไปฟอร์ม SUMIF, ลากเลือกช่วงบนมือถือไม่เลยคอลัมน์และแตะระหว่างพิมพ์ `=` ไม่บันทึกทับ, แตะครั้งเดียวบนมือถือแค่เลือก ไม่มีคีย์บอร์ดค้าง เซลล์บอก "แตะอีกครั้งเพื่อพิมพ์" และสิ่งที่พิมพ์ไม่หายเงียบ, Enter หรือ ↓ ที่แถวสุดท้ายเพิ่มแถวโดยไม่มีค่าไหนถูกทับและ undo ครั้งเดียวเอาค่ากับแถวออกแล้วพิมพ์ต่อได้, บนมือถือ undo ตอนช่องแก้ไขเปิดอยู่บนแถวที่ Enter งอกขึ้นมาแล้วช่องปิด บอกว่าทิ้งข้อความที่พิมพ์ค้าง และค่าถัดไปพิมพ์ลงได้, แท็บที่สองบนงานเดียวกันถามก่อน ขอใช้แล้วแท็บเดิมดูอย่างเดียวและไม่มีงานหาย, วันที่ในคอลัมน์กว้างค่าตั้งต้นของ Excel ขึ้นเป็นวันที่ไม่ใช่ `###` ทั้งที่ 1280 และ 390, ชีตชื่อไทยดาวน์โหลดเป็นไฟล์ชื่อไทย, เรียงชีตตัวอย่างแล้วทุกแถวยังคูณของตัวเองและการเรียงที่สูตรจะผิดถามก่อน, กรองแล้วกด Delete บนช่วงที่เห็นแถวที่ซ่อนไม่หาย และวางทับแถวที่ซ่อนแล้วถามก่อน, เปอร์เซ็นต์ที่บันทึกไว้ก่อน #53 ยังขึ้นเหมือนเดิมหลัง migrate, เปิดมาเป็นตารางว่างและข้อมูลตัวอย่างที่ค้างในเบราว์เซอร์ไม่กลับมา (แต่ถ้าแก้แล้วต้องอยู่) ไฟล์ใหม่ถามก่อนและ Ctrl+Z เอางานคืน, พิมพ์สูตรแล้วดูค่าขยับ, ส่งออก `.xlsx` แล้วนำกลับเข้ามา, เปิดไฟล์ทับงานแล้วแอปถามก่อน (ตัวเลือกที่ focus อยู่ต้องเก็บงานไว้ และ undo ถอนไฟล์ออกได้) พร้อม `Ctrl+B`, Tab ตามแถวแล้ว Enter กลับคอลัมน์แรก กับเมนูเซลล์จาก `Shift+F10`, ลากคอลัมน์ให้กว้างแล้ว undo ครั้งเดียวกลับ, Enter บนมือถือเข้าช่องถัดไปโดยคีย์บอร์ดไม่พับ, เดินด้วยคีย์บอร์ดล้วน, วางตัวเลขจาก clipboard แบบที่ Excel ก๊อปออกมา (`1,250` `15%` `฿1,234.50`) แล้ว SUM ถูกและรหัสยังเป็นข้อความ, undo, แก้ต่อหลัง undo การเพิ่มชีต, ตัดข้ามชีต, แถบสูตรไม่เขียนค่าค้าง, "เปลี่ยนอะไรไกลจากเคอร์เซอร์แล้วพูดออกมาไหม", ผู้ช่วย AI (stub route ไว้ ทั้งกรณีตอบปกติและกรณีโดน rate limit) CSP (header มาจริง, ยิงออกนอก policy ไม่ได้, แอปเองไม่สะดุด) บันทึกไม่ลงแล้วแอปบอกและยังส่งออกได้, ต่อ API จากเบราว์เซอร์แล้วค่าลงตารางและรีเฟรชเอง โดยไม่มีอะไรเกี่ยวกับมันถึง `/api/*` (และ CSP ของคนที่ไม่เคยเพิ่มแหล่งยังเหมือนเดิมทุกตัวอักษร · แท็บใหม่ที่ไม่มีค่า header ขึ้นว่ารอค่า ไม่ใช่เชื่อมต่อไม่ได้), API ที่ไม่ตอบ CORS ได้รายการตรวจสำหรับ IT ไม่ใช่ error เปล่า, ไม่มีหน้าไหนเรียกตัวเองว่าเดโมทั้งสองภาษา, ทุกหน้าใน sitemap ประกาศ canonical ของตัวเองและหน้าแรกมี JSON-LD ที่ถือ nonce โดยคำถามที่พบบ่อยใน JSON-LD ตรงกับบนหน้าคำต่อคำ และที่ 390px ทางไปข้อมูลสดอยู่บนจอและมีชื่อ บนมือถือการแตะระหว่างพิมพ์ `=` ไม่บันทึกสูตรครึ่งเดียว แต่ใส่ที่อยู่เซลล์ลงสูตร ลากขยายเป็นช่วงได้ และ ⌖ เลือกช่วงจากตารางได้ หลังเปิดไฟล์บนมือถือข้อความขึ้นทีละอัน ตารางเหลือ 12 แถวขึ้นไปและปัดข้างได้ มือถือแนวนอนเห็นตาราง 6 แถวขึ้นไปและกดค้างเปิดเมนูเซลล์ และค่าข้ามชีตบนจอยังถูกหลังส่งออก PDF, sort และ undo เกณฑ์เลือก flow มีข้อเดียว: **unit test จับได้อยู่แล้วหรือเปล่า** ถ้าจับได้ ไม่ต้องอยู่ที่นี่ ที่เหลือคือรอยต่อ ซึ่งเป็นที่ที่บั๊กของโปรเจกต์นี้อยู่ทุกตัว -`npm run check:e2e` drives the real app in a browser through 57 flows — opening Ask AI putting what is typed in the question box rather than in the cell it covers, with Escape closing it back to that cell, on a phone, a second tap on a formula cell opening its editor with the formula whole and typing landing there rather than two rows down and a tap away selecting one cell, on a phone, typing after Enter into a filled cell replacing its value rather than going on the end, with a second tap still editing in place, on a phone, a tap after Enter in the formula bar selecting the cell rather than pointing into the next cell's formula, with a formula only opened to look at left alone, C02 typed into a dropdown cell saving C02 rather than the first option starting with C, text off the list refused out loud and a pick from the list still saving, at 1280 and 390, a real file with a picture, a chart and a function the engine lacks saying what it will lose as it opens, reopened from the menu, with nothing for a plain file, and range names that could not come in listed in the same report rather than a separate alert, a live source answering after the picker opens never blanking the cell, a formula page's "try it in the sheet" landing the page's own numbers in the sheet, leaving the address clean and, over work, asking first with keeping the work focused, an old save with duplicate or invalid sheet names opening with names Excel takes and formulas on the right tab, a bad name refused where it is typed, and an export whose sheet names and formulas are right, a view-only tab editing by itself with all the work once the editing tab closes, a crash that brings up the rescue screen, whose file holds the work and whose Try again comes back to the sheet, a Buddhist-Era date that counts and Convert to dates from the cell menu, previewed and undone in one step, the AI assistant putting a column's total under it rather than over a formula and sending a condition to the SUMIF form, a range dragged on a phone staying in its column and a tap during `=` saving nothing, one tap on a phone only selecting, with no keyboard left up, the cell saying "tap again to type" and nothing typed lost in silence, Enter or ↓ on the last row adding a row with nothing typed over and one undo taking the value and its row back with typing still landing after it, on a phone an undo with an editor open on a row Enter grew closing the editor, saying what it dropped, and the next value landing, a second tab on the same workbook asking first, with taking over turning the first view-only and no edit lost, dates in Excel's default column width showing as dates, not `###`, at 1280 and 390, a Thai sheet name downloading as a Thai file name, the sample sorted with every row still its own and a risky sort asking first, Delete on a filtered range leaving the hidden rows alone and a paste over them asking first, a percent saved before #53 still reading the same after the migration, opening blank, with a sample an older version saved not coming back (and one edited, staying), New file asking first and Ctrl+Z bringing the work back, type a formula and watch the value +`npm run check:e2e` drives the real app in a browser through 58 flows — typing over a live-data cell getting a note under it saying why, with Enter not taking the cursor away before it is read, opening Ask AI putting what is typed in the question box rather than in the cell it covers, with Escape closing it back to that cell, on a phone, a second tap on a formula cell opening its editor with the formula whole and typing landing there rather than two rows down and a tap away selecting one cell, on a phone, typing after Enter into a filled cell replacing its value rather than going on the end, with a second tap still editing in place, on a phone, a tap after Enter in the formula bar selecting the cell rather than pointing into the next cell's formula, with a formula only opened to look at left alone, C02 typed into a dropdown cell saving C02 rather than the first option starting with C, text off the list refused out loud and a pick from the list still saving, at 1280 and 390, a real file with a picture, a chart and a function the engine lacks saying what it will lose as it opens, reopened from the menu, with nothing for a plain file, and range names that could not come in listed in the same report rather than a separate alert, a live source answering after the picker opens never blanking the cell, a formula page's "try it in the sheet" landing the page's own numbers in the sheet, leaving the address clean and, over work, asking first with keeping the work focused, an old save with duplicate or invalid sheet names opening with names Excel takes and formulas on the right tab, a bad name refused where it is typed, and an export whose sheet names and formulas are right, a view-only tab editing by itself with all the work once the editing tab closes, a crash that brings up the rescue screen, whose file holds the work and whose Try again comes back to the sheet, a Buddhist-Era date that counts and Convert to dates from the cell menu, previewed and undone in one step, the AI assistant putting a column's total under it rather than over a formula and sending a condition to the SUMIF form, a range dragged on a phone staying in its column and a tap during `=` saving nothing, one tap on a phone only selecting, with no keyboard left up, the cell saying "tap again to type" and nothing typed lost in silence, Enter or ↓ on the last row adding a row with nothing typed over and one undo taking the value and its row back with typing still landing after it, on a phone an undo with an editor open on a row Enter grew closing the editor, saying what it dropped, and the next value landing, a second tab on the same workbook asking first, with taking over turning the first view-only and no edit lost, dates in Excel's default column width showing as dates, not `###`, at 1280 and 390, a Thai sheet name downloading as a Thai file name, the sample sorted with every row still its own and a risky sort asking first, Delete on a filtered range leaving the hidden rows alone and a paste over them asking first, a percent saved before #53 still reading the same after the migration, opening blank, with a sample an older version saved not coming back (and one edited, staying), New file asking first and Ctrl+Z bringing the work back, type a formula and watch the value move, export `.xlsx` and import it back, a file opened on top of work that asks first (the focused choice keeps the work, and undo takes the file back out) along with `Ctrl+B`, a row typed with Tab ending with Enter under its first column and the cell menu from `Shift+F10`, a column dragged wider that one undo puts back, Enter on a phone going into the next cell's editor, keyboard only, numbers pasted through the real clipboard as Excel copies them (`1,250` `15%` `฿1,234.50`) adding up while codes stay text, undo, editing after undoing a new sheet, a cut across sheets, a formula bar that never writes a stale value, whether a change away from the cursor is announced, the AI assistant with its route stubbed (both a normal answer and a rate limit), and the CSP (served, blocking exfiltration, and not tripping the app up), a refused save that is announced while export still works, an API connected from this browser that fills the sheet and refreshes with nothing about it reaching `/api/*` (and the CSP unchanged, character for character, for anyone who never added a source; a new tab without the header value says it is waiting, not failing), an API without CORS getting a checklist for IT rather than a bare error, no page calling itself a demo in either language, every page in the sitemap declaring its own canonical with the landing page's JSON-LD carrying the nonce and its FAQ matching the page word for word, at 390px whether the way to live data is on screen and named, on a phone a tap during `=` putting the cell into the formula (widened by a drag) rather than saving half of it, and ⌖ picking a range from the grid, a file opened on a phone leaving one message at a time with twelve rows and a working sideways swipe, a phone on its side keeping six rows with a long press opening the cell menu, and cross-sheet values still right on screen after a PDF export, a sort and its undo. Flows are picked by one rule: **would a unit test already catch it?** If yes it does not belong diff --git a/README.en.md b/README.en.md index 2c5ebd5..a09dc71 100644 --- a/README.en.md +++ b/README.en.md @@ -403,7 +403,7 @@ Other available commands: | `npm run check:bundle` | Size budgets, and the cloud client staying in a chunk of its own (needs a build) | | `npm run check:mutants` | Breaks the engine on purpose and checks the suite notices — 32/32 (no build needed) | | `npm run check:a11y` | axe on both pages at 390px and 1280px, plus sideways-scroll checks (needs a build) · `A11Y_WIDTH=390` runs one half, which is how CI runs it | -| `npm run check:e2e` | Drives the real app through 57 flows: opening Ask AI putting what is typed in the question box rather than in the cell it covers, and Escape closing it with focus back on that cell, at 1280 and 390 (#203), on a phone, a second tap on a formula cell opening its editor with the formula whole, what is typed going into that formula and the cell two rows down left alone (#201), and a tap on another cell with nothing typed selecting that cell alone rather than a range (#210), on a phone, typing after Enter into a filled cell replacing its value rather than going on the end (#202), on a phone, a tap after Enter in the formula bar selecting the cell rather than breaking the next cell's formula, and a formula only opened to look at left alone (#201), typing into a dropdown cell saving what was typed in full, text off the list refused and a pick from the list still saving, at 1280 and 390 (#198), a file with a picture and a chart saying what it will lose as it opens, a plain one saying nothing, and range names that could not come in in the same report (#83), a live source that answers after the picker opens never blanking the cell (#126), one tap on a phone only selecting and saying to tap again, with nothing typed lost in silence (#171), Enter or ↓ on the last row adding a row with nothing typed over and one undo taking the value and its row back with typing still landing after it (#170), on a phone an undo with an editor open on a row Enter grew closing the editor, saying what it dropped, and the next value landing (#191), a formula page's try-it button landing the page's own numbers in the sheet, and asking first over work (#149), numbers pasted through the real clipboard as Excel copies them adding up while codes stay text (#52), the AI assistant putting a column's total under it and sending a condition to the SUMIF form (#62–#64), a view-only tab editing by itself, with all the work, once the editing tab closes (#146), a crash bringing up the rescue screen, whose file holds the work and whose Try again comes back (#145), a Buddhist-Era date that counts and Convert to dates from the cell menu (#82), duplicate or invalid sheet names fixed on load, refused when typed, and exported with the right names and formulas (#54), a second tab asking first, and taking over turning the first view-only with no edit lost (#47), dates in Excel's default column width showing as dates rather than `###` (1280 and 390), a Thai sheet name downloading as a Thai file name, the sample sorted in both languages with every row still multiplying its own numbers and a risky sort asking first, a percent saved before #53 reading the same, opening blank with a sample left in the browser not coming back, New file asking first and undoing, formulas, `.xlsx` round trip, an import on top of work that asks first, Tab then Enter and the cell menu, dragging a column's width, Enter on a phone going into the next cell, a range dragged on a phone staying in its column and a tap during `=` saving nothing, tapped cells going into a formula that Done saves with its bracket closed, ⌖ on a phone picking from the grid, a file opened on a phone leaving one message at a time, twelve rows or more and a sideways swipe that works, with "saved in this browser" moved to the save status, a phone on its side folding the bars into two rows with six rows of grid and a long press opening the cell menu, keyboard only, undo, editing after undoing a new sheet, a cut across sheets, a formula bar that never writes a stale value, announcements, the AI assistant, the CSP, an API connected from the browser (nothing reaching `/api/*`), an API without CORS getting the IT checklist, no page calling itself a demo, every page in the sitemap naming its own canonical with the landing page carrying the Search Console tag, the phone tab bar, cross-sheet values on screen after a PDF export, a sort and undo (needs a build · `E2E_ONLY=` runs just the matching flows while editing) | +| `npm run check:e2e` | Drives the real app through 58 flows: `999` and Enter on a live-data cell getting a note under the cell saying why, Enter putting the note away with the cursor and the value where they were, and Delete and a double-click saying so too (#207), opening Ask AI putting what is typed in the question box rather than in the cell it covers, and Escape closing it with focus back on that cell, at 1280 and 390 (#203), on a phone, a second tap on a formula cell opening its editor with the formula whole, what is typed going into that formula and the cell two rows down left alone (#201), and a tap on another cell with nothing typed selecting that cell alone rather than a range (#210), on a phone, typing after Enter into a filled cell replacing its value rather than going on the end (#202), on a phone, a tap after Enter in the formula bar selecting the cell rather than breaking the next cell's formula, and a formula only opened to look at left alone (#201), typing into a dropdown cell saving what was typed in full, text off the list refused and a pick from the list still saving, at 1280 and 390 (#198), a file with a picture and a chart saying what it will lose as it opens, a plain one saying nothing, and range names that could not come in in the same report (#83), a live source that answers after the picker opens never blanking the cell (#126), one tap on a phone only selecting and saying to tap again, with nothing typed lost in silence (#171), Enter or ↓ on the last row adding a row with nothing typed over and one undo taking the value and its row back with typing still landing after it (#170), on a phone an undo with an editor open on a row Enter grew closing the editor, saying what it dropped, and the next value landing (#191), a formula page's try-it button landing the page's own numbers in the sheet, and asking first over work (#149), numbers pasted through the real clipboard as Excel copies them adding up while codes stay text (#52), the AI assistant putting a column's total under it and sending a condition to the SUMIF form (#62–#64), a view-only tab editing by itself, with all the work, once the editing tab closes (#146), a crash bringing up the rescue screen, whose file holds the work and whose Try again comes back (#145), a Buddhist-Era date that counts and Convert to dates from the cell menu (#82), duplicate or invalid sheet names fixed on load, refused when typed, and exported with the right names and formulas (#54), a second tab asking first, and taking over turning the first view-only with no edit lost (#47), dates in Excel's default column width showing as dates rather than `###` (1280 and 390), a Thai sheet name downloading as a Thai file name, the sample sorted in both languages with every row still multiplying its own numbers and a risky sort asking first, a percent saved before #53 reading the same, opening blank with a sample left in the browser not coming back, New file asking first and undoing, formulas, `.xlsx` round trip, an import on top of work that asks first, Tab then Enter and the cell menu, dragging a column's width, Enter on a phone going into the next cell, a range dragged on a phone staying in its column and a tap during `=` saving nothing, tapped cells going into a formula that Done saves with its bracket closed, ⌖ on a phone picking from the grid, a file opened on a phone leaving one message at a time, twelve rows or more and a sideways swipe that works, with "saved in this browser" moved to the save status, a phone on its side folding the bars into two rows with six rows of grid and a long press opening the cell menu, keyboard only, undo, editing after undoing a new sheet, a cut across sheets, a formula bar that never writes a stale value, announcements, the AI assistant, the CSP, an API connected from the browser (nothing reaching `/api/*`), an API without CORS getting the IT checklist, no page calling itself a demo, every page in the sitemap naming its own canonical with the landing page carrying the Search Console tag, the phone tab bar, cross-sheet values on screen after a PDF export, a sort and undo (needs a build · `E2E_ONLY=` runs just the matching flows while editing) | | `npm run check:ai` | Asks the real Claude with your own key and checks the formulas against what this engine can evaluate — not in `verify`, because it needs a key and costs money | | `npm run verify` | Everything, before a push: lint → check:readme → check:screens → check:deps → test → check:mutants → build → check:bundle → check:a11y → check:e2e (~5 min) | | `npm run verify:quick` | The same gates minus `check:mutants`, `check:a11y`, `check:e2e` and `check:deps` — **37 seconds**, for the loop while writing. Not a substitute for `verify` before a push | @@ -933,6 +933,12 @@ Behind the scenes: - Linked cells are tinted green with a border around the block and a bold header row, are read-only, and **refresh themselves on the source's schedule** (polling). Regular formulas (`=A10*2`, `SUM`, `VLOOKUP`) and Excel/PDF export work on live data immediately, because the app writes real values into the cells. +- **Typing over a live cell is answered** (#207): a note under the cell says "B2 is live data and can't + be typed over — press "Remove" first to edit it yourself", and a screen reader hears it once, whether the + cell was typed into, cleared with Delete, double-clicked or tapped twice on a phone. Enter or Esc while + the note is up puts it away and leaves the cursor on the cell, as Excel's protected-cell message does, + because typing `999` and Enter in one go was how the value vanished in the blind test: the note came + with the first key and Enter took the cursor, and the note, away before anyone could read it. - Refreshes **never enter the undo history** (zundo is paused during the write) — one Ctrl+Z undoes the whole placed block, and "Change" (clear the old block + place the new one) counts as a single step too. - **Drag and drop still works** for people who prefer it, it's just no longer the primary path. @@ -2743,7 +2749,10 @@ up again**. **Every route in is guarded**, not just typing: Delete, paste, sorting, and adding or removing rows and columns are all refused *with a reason* — silently doing nothing reads as the app being -broken rather than the template doing its job. +broken rather than the template doing its job. Typing into the structure, a double-click or a second tap +on a phone says so under the cell too, with what to press (#207); it used to be silent, the typed value +gone with only a hover tooltip to explain it. Enter or Esc while the note is up puts it away and leaves +the cursor where it is. **But you're not trapped in it** — "Unlock the sheet" makes every cell editable like an ordinary sheet, and Ctrl+Z brings the template back (the template state lives inside `sheets`, so it sits @@ -4067,7 +4076,7 @@ assistant sent a range including its text header, because the context builder re instead of computed values (both tested) · one new button pushed the language toggle 42px off the screen. ```bash -npm run check:e2e # 57 flows in a real browser (needs a build) +npm run check:e2e # 58 flows in a real browser (needs a build) ``` Flows are picked by one rule: **would a unit test already catch it?** If yes it does not belong there. What @@ -4434,8 +4443,8 @@ What's not done yet, and why — to show this is a known gap, not something forg (2.85:1), and two `