หน้ารวม
📄 หน้านี้สร้างจาก docs/spec.md อัตโนมัติ — ถ้าจะแก้เนื้อหา ให้แก้ที่ไฟล์ .md แล้วสร้างใหม่

dailyMu — Specification / PRD

ระบบวอลเปเปอร์มงคล — 2 ส่วน: เดลี่มู (ฟรี) + Personal Wallpaper (AI) เอกสารนี้ใช้ส่งต่อ dev · คู่กับ docs/user-flow.html (ผังฉบับล่าสุด) และ prototype/index.html

สถานะ Draft 2 — ปรับตามสถาปัตยกรรม 2 ส่วน
อัปเดต 13 สิงหาคม 2569
ขอบเขตงานชุดนี้ workflow และ UX เท่านั้น — ไม่รวมหลังบ้าน (เฟสถัดไป) ไม่รวมการวิเคราะห์ต้นทุน
ยังไม่เคาะ ตัวเลขแพลน · ราคาเครดิต · รายการสไตล์สุดท้าย (ดูข้อ 15)

⚠️ ถ้าข้อความในเอกสารนี้ขัดกับ docs/user-flow.html ให้ยึด user-flow.html ผังคือแหล่งความจริงล่าสุด เอกสารนี้ขยายรายละเอียดของผัง


1. ภาพรวมผลิตภัณฑ์

ฟีเจอร์วอลเปเปอร์มงคล เป็น ส่วนหนึ่งของโปรเจกต์ dailyMu ไม่ใช่ทั้งแอป

ทางเข้าทางเดียว แล้วให้ลูกค้าเลือกประเภท:

ส่วนที่ 1 — 🌸 วอลเปเปอร์เดลี่มู ส่วนที่ 2 — 🎨 Personal Wallpaper
ราคา ฟรี แพลน + เครดิต
ที่มาของภาพ คลังที่แอดมินอัปไว้หลังบ้าน AI สร้างเฉพาะชั้นฉาก + ประกอบชั้นอื่นด้วยโค้ด
ลูกค้าเลือกอะไร ด้านที่อยากเสริม 1–2 ด้าน (ขั้นตอนเดียว) ด้าน · สี · องค์เทพ · สไตล์ · prompt (5 ขั้นตอน)
ภาพซ้ำกับคนอื่นได้ไหม ได้ — แต่ เลขมงคลต่างกันตามดวงแต่ละคน ไม่ซ้ำ
ต้นทุนต่อครั้ง ~0 ค่า token
โควตา 1 ครั้ง/วัน · รีเซ็ตเที่ยงคืน · ขอเปลี่ยนใหม่ได้สัปดาห์ละ 1 ตามแพลน แล้วหักเครดิต
ประวัติ ปฏิทินของฉัน (เก็บ id) คลังภาพ (เก็บไฟล์จริง)
ลายน้ำ ไม่มี ไม่มี

ส่วนฟรีไม่ใช่ตัวอย่างของส่วนเสียเงิน แต่เป็นสินค้าคนละชิ้นที่สมบูรณ์ในตัวเอง ส่วนฟรีสร้างนิสัยกลับมาทุกวันตามชื่อแอป แล้วใช้หน้าผลลัพธ์เป็นจุดชวนไปส่วน AI ถ้าทำส่วนฟรีให้ด้อยลงเพื่อบีบให้จ่าย จะเสียทั้งนิสัยการกลับมาและโอกาสขายไปพร้อมกัน

สิ่งที่ทำให้ต่างจากการแจกวอลเปเปอร์ทั่วไป: สีและเลขไม่ได้มาจากความชอบหรือการสุ่ม แต่คำนวณจาก วันเกิดของลูกค้า × ด้านที่อยากเสริม ตามระบบทักษาปกรณ์ และทั้งสองอย่างมาจาก ดาวดวงเดียวกัน เสมอ จึงสอดคล้องกันโดยธรรมชาติ ไม่ใช่ของสองอย่างที่จับมาแปะรวมกัน ระบบจึงอธิบายได้ทุกครั้งว่าทำไมต้องเป็นสีนี้ และบอกได้ด้วยว่าสีไหนที่ควรเลี่ยง (สีกาลกิณี)

กลุ่มเป้าหมาย: ผู้ใช้ชาวไทยที่สนใจเรื่องมงคล/สายมู อายุ 20–45 ใช้มือถือเป็นหลัก

Disclaimer ที่ต้องแสดงในแอป:

เนื้อหาในแอปอ้างอิงความเชื่อและตำราโหราศาสตร์ไทย จัดทำขึ้นเพื่อเป็นงานศิลปะและกำลังใจ ไม่ได้รับประกันผลลัพธ์ใด ๆ


2. ตรรกะหลัก — ทักษาปกรณ์

ข้อนี้ไม่เปลี่ยนตามสถาปัตยกรรมใหม่ — ใช้เหมือนกันทั้งสองส่วน

2.1 ข้อมูลดาว

num คือ เลขประจำดาว ใช้เป็นเลขมงคล — ระบบเดียวกับสี ต่างแค่อ่านคนละคอลัมน์

const PLANETS = {
  sun : {name:'อาทิตย์',   num:1, colors:['แดงสด'],                                       hex:'#D93A3A', deep:'#7E1A1A', light:false},
  mon : {name:'จันทร์',    num:2, colors:['ขาว','ครีม','เหลืองอ่อน'],                      hex:'#FDF6E3', deep:'#E3CF9C', light:true },
  tue : {name:'อังคาร',    num:3, colors:['ชมพู','แดงแก่'],                               hex:'#E85D8A', deep:'#9C1F49', light:false},
  wed : {name:'พุธ',       num:4, colors:['เขียว'],                                       hex:'#2E7D4F', deep:'#123A25', light:false},
  sat : {name:'เสาร์',     num:7, colors:['ดำ','ม่วงเข้ม'],                               hex:'#26232E', deep:'#000000', light:false},
  thu : {name:'พฤหัสบดี',  num:5, colors:['ส้ม','กรัก','เหลืองแก่'],                       hex:'#E8862B', deep:'#7E4109', light:false},
  rahu: {name:'ราหู',      num:8, colors:['ม่วงเม็ดมะปราง','ทองสัมฤทธิ์','เทาควันบุหรี่'],  hex:'#6B3FA0', deep:'#2F1A50', light:false},
  fri : {name:'ศุกร์',     num:6, colors:['ฟ้า','น้ำเงิน'],                               hex:'#2A6FD6', deep:'#0F3572', light:false},
};

light: true หมายถึงพื้นหลังสีอ่อน ต้องสลับสีตัวอักษรเป็นสีเข้ม — มีแค่ดาวจันทร์

2.2 สูตร

const CYCLE = ['sun','mon','tue','wed','sat','thu','rahu','fri'];   // ลำดับดาวของทักษา
const POSITIONS = ['boriwan','ayu','det','si','mula','utsaha','montri','kalakini'];

function colorAt(birthKey, posKey){
  const birthIdx = CYCLE.indexOf(planetOf(birthKey));
  return CYCLE[(birthIdx + POSITIONS.indexOf(posKey)) % 8];
}

planetOf() แปลงวันเกิดเป็นดาว โดย พุธกลางคืน → ราหู (จุดที่พลาดกันบ่อย)

2.3 ความหมายของ 8 ตำแหน่ง

key ชื่อ ความหมาย
boriwan บริวาร คนรอบข้าง ครอบครัว ลูกน้อง ผู้ติดตาม
ayu อายุ สุขภาพ ร่างกาย ความเป็นอยู่
det เดช อำนาจ บารมี ชื่อเสียง หน้าที่การงาน
si ศรี เสน่ห์ ความรัก สิริมงคล
mula มูละ ทรัพย์สิน เงินทอง ต้นทุน
utsaha อุตสาหะ ความพยายาม การเรียน ความสำเร็จ
montri มนตรี ผู้ใหญ่อุปถัมภ์ การเจรจา ผู้สนับสนุน
kalakini กาลกิณี สิ่งที่ควรหลีกเลี่ยง — ห้ามใช้เป็นสีหลัก

2.4 ตารางสำเร็จรูป (pre-computed) — ใช้ตรวจงาน

สร้างจากสูตรข้างบน ช่องขวาสุดตัวหนาคือสีกาลกิณี

วันเกิด บริวาร อายุ เดช ศรี มูละ อุตสาหะ มนตรี กาลกิณี
อาทิตย์ แดงสด ขาว/ครีม ชมพู/แดงแก่ เขียว ดำ/ม่วงเข้ม ส้ม/กรัก ม่วง/ทอง/เทา ฟ้า/น้ำเงิน
จันทร์ ขาว/ครีม ชมพู/แดงแก่ เขียว ดำ/ม่วงเข้ม ส้ม/กรัก ม่วง/ทอง/เทา ฟ้า/น้ำเงิน แดงสด
อังคาร ชมพู/แดงแก่ เขียว ดำ/ม่วงเข้ม ส้ม/กรัก ม่วง/ทอง/เทา ฟ้า/น้ำเงิน แดงสด ขาว/ครีม
พุธ (กลางวัน) เขียว ดำ/ม่วงเข้ม ส้ม/กรัก ม่วง/ทอง/เทา ฟ้า/น้ำเงิน แดงสด ขาว/ครีม ชมพู/แดงแก่
พุธ (กลางคืน) ม่วง/ทอง/เทา ฟ้า/น้ำเงิน แดงสด ขาว/ครีม ชมพู/แดงแก่ เขียว ดำ/ม่วงเข้ม ส้ม/กรัก
พฤหัสบดี ส้ม/กรัก ม่วง/ทอง/เทา ฟ้า/น้ำเงิน แดงสด ขาว/ครีม ชมพู/แดงแก่ เขียว ดำ/ม่วงเข้ม
ศุกร์ ฟ้า/น้ำเงิน แดงสด ขาว/ครีม ชมพู/แดงแก่ เขียว ดำ/ม่วงเข้ม ส้ม/กรัก ม่วง/ทอง/เทา
เสาร์ ดำ/ม่วงเข้ม ส้ม/กรัก ม่วง/ทอง/เทา ฟ้า/น้ำเงิน แดงสด ขาว/ครีม ชมพู/แดงแก่ เขียว

คอลัมน์กาลกิณีตรงกับตำราที่อ้างอิงครบทั้ง 8 วัน (ดูแหล่งอ้างอิงท้ายเอกสาร)

2.5 เลขมงคล — ใช้ทักษาปกรณ์ตัวเดียวกับสี

นี่คือจุดที่ประหยัดงานที่สุดของทั้งระบบ: ตำราเลขมงคลไทยใช้ทักษาปกรณ์ชุดเดียวกับสีเป๊ะ ๆ แค่อ่านค่า เลขประจำดาว แทน สีประจำดาวไม่ต้องเพิ่มขั้นตอน ไม่ต้องถามอะไรเพิ่ม ไม่ต้องเขียน logic ใหม่

อาทิตย์ 1 · จันทร์ 2 · อังคาร 3 · พุธ 4 · พฤหัสบดี 5 · ศุกร์ 6 · เสาร์ 7 · ราหู 8
function luckyNumberOf(birthKey, posKey){
  return PLANETS[ CYCLE[(CYCLE.indexOf(planetOf(birthKey)) + POSITIONS.indexOf(posKey)) % 8] ].num;
}

ตารางสำเร็จรูป — ช่องขวาสุดตัวหนาคือ เลขกาลกิณี ที่ต้องเลี่ยง

วันเกิด บริวาร อายุ เดช ศรี มูละ อุตสาหะ มนตรี กาลกิณี
อาทิตย์ 1 2 3 4 7 5 8 6
จันทร์ 2 3 4 7 5 8 6 1
อังคาร 3 4 7 5 8 6 1 2
พุธ (กลางวัน) 4 7 5 8 6 1 2 3
พุธ (กลางคืน) 8 6 1 2 3 4 7 5
พฤหัสบดี 5 8 6 1 2 3 4 7
ศุกร์ 6 1 2 3 4 7 5 8
เสาร์ 7 5 8 6 1 2 3 4

แถววันอาทิตย์ตรงกับตัวอย่างในตำราที่อ้างอิงครบทั้ง 8 ตำแหน่ง (1 2 3 4 7 5 8 6)

กฎสำคัญ 3 ข้อ

  1. ผู้ใช้เลือกเลขเองไม่ได้ — เลขมาจากการคำนวณเท่านั้น ถ้าให้เลือกได้มันจะกลายเป็นของตกแต่ง ไม่ใช่ของมงคล และเสียจุดขายทั้งหมด
  2. เลขต้องยึด "ตำแหน่งทักษาของด้าน" เสมอ ไม่ผูกกับสีที่ผู้ใช้เลือกเอง ถ้าผูกเลขกับสี ผู้ที่ฝืนเลือกสีกาลกิณี (ซึ่งระบบอนุญาตในส่วนที่ 2) จะได้ เลขกาลกิณี ติดไปบนวอลเปเปอร์ด้วย ซึ่งเป็นโทษโดยตรง
  3. ปิดการแสดงเลขได้ — toggle ในหน้าผลลัพธ์ ทั้งสองส่วน ไม่ใช่ขั้นตอนเพิ่ม เลขอยู่คนละชั้นกับภาพ → เปิด-ปิดได้โดยไม่ต้องเจนใหม่ ไม่เสียเครดิตซ้ำ

⚠️ ข้อควรระวังเรื่องเลข 4

คนไทยเชื้อสายจีนเลี่ยงเลข 4 (สี่ = ตาย) แต่ในทักษาไทย 4 = ดาวพุธ = ปัญญา การสื่อสาร การค้า เลข 4 ปรากฏเป็นเลขมงคลในเกือบทุกวันเกิด (ยกเว้นวันเสาร์ที่ 4 เป็นกาลกิณีอยู่แล้ว จึงไม่ถูกแสดง)

ต้องมีคำอธิบายกำกับเลขเสมอ เช่น "เลข 4 คือเลขศรีของคุณ — ดาวพุธ" ห้ามแสดงตัวเลขลอย ๆ ไม่งั้นลูกค้าเห็นแล้วรู้สึกแย่ทันทีทั้งที่ระบบคำนวณถูก

สิ่งที่ห้ามทำ

อย่าสร้างเลข 2 หลักขึ้นเอง — เลขศาสตร์ 2 หลัก (24, 45, 56 ฯลฯ) มาจากผลรวมค่าตัวอักษรใน ชื่อ-นามสกุล เป็นคนละระบบกับทักษา ถ้าจะทำต้องขอชื่อผู้ใช้เพิ่ม ไม่ใช่ปั้นขึ้นจากวันเกิด ถ้าปั้นเองแล้วมีคนรู้ทัน จะเสียความน่าเชื่อถือของทั้งแอป

ต่อยอดได้ในอนาคต


3. Mapping: ด้านที่เสริม → ตำแหน่งทักษา

การ์ด 8 ใบ ใช้ เหมือนกันทั้งสองส่วน ผูกกับตำแหน่งทักษาตามนี้

id หัวข้อที่ลูกค้าเห็น ตำแหน่ง หมายเหตุ
money เงินทอง ไหลมาเทมา mula
love ความรัก มีเสน่ห์ si
work การงาน รุ่งเรือง det
health สุขภาพ แข็งแรง ayu
study การเรียน สอบผ่าน utsaha
support ผู้ใหญ่เอ็นดู montri
family คนรอบข้าง ลูกทีม boriwan
protect ปกป้อง แก้ดวงตก det ใช้สีเดชร่วมกับ work เพราะไม่มีตำแหน่งทักษาเฉพาะ แต่ชุดองค์เทพต่างกัน

เหตุผลที่ protect ใช้ det: ทักษามี 7 ตำแหน่งที่ใช้ได้ (ตัดกาลกิณี) แต่ "ปกป้อง/แก้ดวงตก" เป็นความต้องการที่ลูกค้าสายมูถามหาบ่อยมากและไม่มีตำแหน่งตรงตัว จึงยืมสีเดช (อำนาจบารมีคุ้มครอง) แล้วสร้างความต่างที่ชุดองค์เทพ (ท้าวเวสสุวรรณ / พระราหู / พระแม่กาลี) แทน — ถ้าไม่อยากยืม ให้ตัดการ์ดนี้ออกและเหลือ 7 ใบได้

กฎ: เลือกได้สูงสุด 2 ด้าน · สีและเลขคำนวณจากด้านแรก ที่เลือก · ด้านที่สองใช้ขยายชุดองค์เทพ (ส่วนที่ 2) และขยายเงื่อนไขจับคู่ภาพ (ส่วนที่ 1)

3.1 รายการด้านตั้งค่าได้จากหลังบ้าน

ตารางข้างบนเป็นค่าเริ่มต้น — แอดมินเพิ่ม/แก้/ลบ/ปิด/เรียงลำดับได้ (ดู AspectDef ข้อ 6.2)

กฎ ค่า เหตุผล
จำนวนสูงสุด 8 ด้าน เกินนี้หน้าจอลูกค้าจะแน่นและตัดสินใจยาก
ทุกด้านต้องผูกตำแหน่งทักษา บังคับ ตำแหน่งคือตัวกำหนดสี · ไม่ผูก = จับคู่รูปไม่ได้
ตำแหน่งที่เลือกได้ 7 ตำแหน่ง กาลกิณีห้ามใช้ — เป็นสิ่งที่ต้องเลี่ยง ไม่ใช่สิ่งที่เสริม
ใช้ตำแหน่งซ้ำกันได้ เพราะมี 7 ตำแหน่งแต่ให้ได้ถึง 8 ด้าน · ตอนนี้ การงาน กับ ปกป้อง ใช้ เดช ร่วมกัน
ปิดด้าน รูปที่แท็กไว้ยังอยู่ เปิดกลับมาใช้ต่อได้ ไม่ต้องแท็กใหม่
ลบด้าน ถอดแท็กออกจากรูปที่ใช้ด้านนั้น ต้องเตือนว่ามีรูปกี่ใบที่ได้รับผลกระทบ

ด้านที่ใช้ตำแหน่งเดียวกันจะได้สีเดียวกันเสมอ ต่างกันแค่ชื่อที่ลูกค้าเห็น — ตั้งใจแบบนี้ได้ ไม่ใช่ข้อผิดพลาด

ห้ามคัดการ์ดออกจากหน้าจอ — แสดงครบทั้ง 8 ใบเสมอ แล้วจำกัดที่ จำนวนที่เลือกได้ ไม่ใช่ที่ จำนวนที่เห็น


4. Mapping: ด้าน → องค์เทพ

ใช้ใน ส่วนที่ 2 (STEP 3) — เลือกหรือไม่เลือกก็ได้

id ชื่อ ดูแลด้าน (for)
lakshmi พระแม่ลักษมี money, love
wessuwan ท้าวเวสสุวรรณ money, protect
caishen ไฉ่ซิงเอี้ย money
sivali พระสีวลี money, work
ganesha พระพิฆเนศ work, study
trimurti พระตรีมูรติ love
uma พระแม่อุมาเทวี love, family
brahma ท้าวมหาพรหม work, support, family
narai พระนารายณ์ work, protect
guanyin พระแม่กวนอิม health, support, family
buddha พระพุทธรูปประจำวันเกิด health, family, protect
saraswati พระแม่สรัสวตี study
guanyu เทพเจ้ากวนอู work, money, protect
rahu พระราหู protect
kali พระแม่กาลี protect

แต่ละองค์มี tag (สั้น), note (คำอธิบาย 1–2 บรรทัด), mantra (คาถาบูชา) คาถาต้องให้ผู้รู้ตรวจทานก่อนขึ้นระบบจริง — ข้อมูลใน prototype เป็นรูปแบบที่พบทั่วไปเท่านั้น

ตัวเลือก "ไม่เลือกองค์เทพ" กลับมาแล้ว — ในโครงเดิมถูกถอดออกเพราะขัดกับระบบธีม พอธีมกลายเป็น "สไตล์" (ข้อ 5) ความขัดแย้งหายไป องค์เทพจึงเป็น ตัวเลือกเสริม ได้ตามปกติ คนที่ไม่สะดวกใจข้ามขั้นตอนนี้ได้เลย แล้วได้ภาพที่มีแต่ฉาก + ลายมงคล


5. สไตล์ — ใช้เฉพาะส่วนที่ 2

🔄 แทนที่ระบบ "ธีม" เดิม — ธีมเดลี่มู/ธีมองค์เทพ ไม่ใช่จุดแยกทางของ flow อีกต่อไป เพราะองค์เทพเป็นตัวเลือกอิสระแล้ว สไตล์จึงเป็นแค่ อารมณ์ของภาพ ไม่บังคับว่าจะมีองค์เทพหรือไม่

STEP 4 ให้เลือก 1 สไตล์ ยังไม่เคาะรายการสุดท้าย — ที่เสนอไว้ 6 แบบ:

id ชื่อ อารมณ์ หมายเหตุ
dailymu โทนเดลี่มู พาสเทลนุ่มตา ผสมสีมงคลกับขาว IP ของเราเอง · ควรเป็นใบแรกและเป็นค่าเริ่มต้น
thai ลายไทย / ยันต์ ลายกนก ยันต์ ทองบนพื้นสีมงคล
animal สัตว์นำโชค มังกร ปลาคาร์ฟ ช้าง กบคายเงิน ต้องคุมไม่ให้สัตว์ผิดสัดส่วน
chinese จีนมงคล แดง-ทอง โคมไฟ เหรียญจีน
cozy cozy ห้องอุ่น ๆ แสงเทียน ต้นไม้ สไตล์ที่ปลอดภัยที่สุดสำหรับ AI
cosmic จักรวาล ดาว หมอก แสงออร่า

ข้อกำหนด


6. Data model

type BirthDayKey = 'sun'|'mon'|'tue'|'wed'|'wedNight'|'thu'|'fri'|'sat';
type PlanetKey   = 'sun'|'mon'|'tue'|'wed'|'sat'|'thu'|'rahu'|'fri';
type PositionKey = 'boriwan'|'ayu'|'det'|'si'|'mula'|'utsaha'|'montri'|'kalakini';
type AspectId    = 'money'|'love'|'work'|'health'|'study'|'support'|'family'|'protect';
type StyleId     = 'dailymu'|'thai'|'animal'|'chinese'|'cozy'|'cosmic';
type Source      = 'free' | 'ai';

6.1 ผู้ใช้และสิทธิ์

interface UserProfile {
  id: string;
  name: string;
  birthDayOfWeek: BirthDayKey | null;   // มาจากระบบหลัก · null = ต้องถาม
  birthDate?: string;                   // ถ้ามีวันที่ ให้คำนวณ birthDayOfWeek เอง
  planId: string;                       // มาจากระบบแพลนของ dailyMu (นอกสโคปงานชุดนี้)
  creditBalance: number;                // ยอดเครดิตคงเหลือ · ตัวเลขนี้เป็นของระบบหลัก
}

// สิทธิ์รายวันของส่วนฟรี — 1 แถวต่อ user ต่อวัน
interface DailyEntitlement {
  userId: string;
  date: string;                 // YYYY-MM-DD ตามเวลาไทย · เส้นแบ่งวัน = เที่ยงคืน
  usedAt: string | null;        // ใช้สิทธิ์ประจำวันแล้วหรือยัง
  rerollWeek: string;           // ISO week เช่น '2569-W33'
  rerollUsedAt: string | null;  // ใช้สิทธิ์ "ขอเปลี่ยนใหม่" ของสัปดาห์นี้แล้วหรือยัง
}

date ต้องคิดจาก timezone เดียวกับที่ปฏิทินใช้แสดงผล ไม่งั้นคนที่กดตอนใกล้เที่ยงคืนจะได้ 2 ครั้งในวันเดียว

6.2 ส่วนที่ 1 — คลังของแอดมิน + ปฏิทิน

// ภาพที่แอดมินอัปไว้หลังบ้าน (เฟสถัดไป ทีมทำเอง)
// ชุดงาน — แอดมินต้องสร้างชุดก่อน แล้วอัปรูปเข้าชุด · ลูกค้าไม่เห็นสิ่งนี้
interface Collection {
  id: string;
  name: string;             // เช่น "ชุดตรุษจีน 2569"
  active: boolean;          // ปิดชุด = รูปทั้งชุดหยุดถูกหยิบ แต่ยังอยู่ในคลัง
}

interface CuratedWallpaper {
  id: string;
  fileUrl: string;
  collectionId: string;     // **บังคับ** — รูปทุกใบต้องอยู่ในชุด
  planets: PlanetKey[];     // แท็ก: รูปนี้โทนสีอะไร · **1–3 สี**
  aspects: AspectId[];      // แท็ก: ใช้กับด้านไหนได้บ้าง · **1–3 ด้าน**
  style: StyleId;           // แท็ก: อารมณ์ของภาพ
  active: boolean;          // ปิดรายใบได้ แยกจากการปิดทั้งชุด
}

// ด้านที่ให้ลูกค้าเลือก — แอดมินเพิ่ม/แก้/ลบได้ **สูงสุด 8**
interface AspectDef {
  id: string;
  name: string;             // ชื่อที่ลูกค้าเห็น เช่น "เงินทอง"
  glyph: string;
  position: PositionKey;    // **บังคับ** — ตัวกำหนดว่าคนวันไหนได้สีอะไร
  active: boolean;
  order: number;
}

// สิ่งที่ลูกค้าได้รับในแต่ละวัน — เก็บแค่ตัวชี้ ไม่เก็บไฟล์
interface CalendarEntry {
  id: string;
  userId: string;
  date: string;             // YYYY-MM-DD · หนึ่งวันมีได้แค่แถวเดียว
  wallpaperId: string;      // → CuratedWallpaper.id
  aspects: AspectId[];      // 1–2 ด้านที่เลือกวันนั้น
  showNumber: boolean;
  favourite: boolean;       // ♡
  rerolled: boolean;        // ใช้สิทธิ์ขอเปลี่ยนใหม่กับวันนี้หรือเปล่า
  deletedAt: string | null; // ลบแล้ว → ช่องปฏิทินว่าง**ถาวร**
}

~40 ไบต์ต่อรายการ เพราะไม่เก็บไฟล์ — ภาพอยู่ในคลังกลาง ใช้ร่วมกันได้ทุกคน

กฎของแท็กและคอลเลคชั่น

กฎ เหตุผล
แท็ก สีและด้านเป็นของรายรูป ไม่ใช่ของทั้งชุด รูปในชุดเดียวกันโทนต่างกันได้ · ถ้าแท็กรวมทั้งชุดจะจับคู่ผิด
สี 1–3 · ด้าน 1–3 ต่อรูป ติ๊กมากกว่านี้รูปจะดูไม่เฉพาะเจาะจง
บันทึกไม่ได้ถ้ารูปใดยังไม่มีทั้งสีและด้าน รูปไม่มีแท็ก = รูปตายในคลัง ไม่มีวันถูกหยิบ
collectionId บังคับ เข้าหน้าอัปได้จากในชุดเท่านั้น จึงไม่มีทางเกิดรูปไร้ชุด
ปิดชุด ≠ ปิดรูป — แยกกัน เปิดชุดกลับมา รูปที่เคยปิดรายใบต้องยังปิดอยู่
ลบชุด = ลบรูปในชุดด้วย ต้องมี warning บอกจำนวนรูปและจำนวนคู่ที่จะไม่เหลือรูป

planets เป็น "คำอธิบายรูป" ไม่ใช่ "ตัวเลือกของลูกค้า" — ลูกค้าไม่เคยเลือกสี ระบบคำนวณสีจาก วันเกิด × ด้าน แล้วเอาไปหารูปที่ติดป้ายสีนั้นไว้ ถ้าไม่มีป้ายนี้ ระบบจะแยกไม่ออกว่ารูปไหนโทนอะไร แล้วจะแจกมั่วทั้งหมด

6.3 ส่วนที่ 2 — ภาพที่ AI สร้าง

type GenStatus = 'queued' | 'generating' | 'failed' | 'ready';

interface PersonalWallpaper {
  id: string;
  userId: string;

  // สูตร — ใช้ทำปุ่ม "✨ สร้างแบบนี้อีก"
  aspects: AspectId[];          // 1–2 · index 0 กำหนดทั้งสีและเลข
  colorPlanet: PlanetKey;
  colorAuto: boolean;           // false = ลูกค้าเลือกสีเอง
  kalakiniAcknowledged: boolean;// true = ยืนยันแล้วว่าจะใช้สีกาลกิณี
  deityId: DeityId | null;      // null = ไม่เลือกองค์เทพ
  styleId: StyleId;
  promptRaw: string;            // ข้อความดิบที่ลูกค้าพิมพ์ (~100 ตัวอักษร)
  promptSanitized: string;      // หลังผ่านตัวกรองขาเข้า — ตัวนี้เท่านั้นที่ส่งเข้าโมเดล
  seed: number;

  // ผลลัพธ์
  status: GenStatus;
  attempts: number;             // นับรอบที่ไม่ผ่านด่านคุณภาพ
  fileUrl: string | null;       // **ไฟล์จริง** — บังคับเก็บ เพราะ AI สร้างซ้ำไม่ได้
  showNumber: boolean;
  favourite: boolean;           // ♡
  creditCost: number;           // 0 = ใช้โควตาของแพลน
  createdAt: string;
  deletedAt: string | null;
}

// บันทึกการเคลื่อนไหวของเครดิต — ต้องตรวจย้อนหลังได้เมื่อลูกค้าร้องเรียน
interface CreditLedgerEntry {
  id: string;
  userId: string;
  delta: number;                // ติดลบ = หัก
  reason: 'generate' | 'topup' | 'plan_grant' | 'adjust';
  refId: string | null;         // → PersonalWallpaper.id
  balanceAfter: number;
  createdAt: string;
}

6.4 หมายเหตุที่มีผลกับการเขียนโค้ด


7. Screen-by-screen — ส่วนกลาง

7.0 หน้าแรก

7.1 หน้าเลือกประเภท — ทางเข้าเดียว

การ์ด 2 ใบ:

ต้องแสดงอะไรบ้าง
🌸 วอลเปเปอร์เดลี่มู "ฟรี" · "1 ครั้ง/วัน" · สถานะสิทธิ์วันนี้ (เหลือ/ใช้แล้ว)
🎨 Personal Wallpaper "AI สร้างเฉพาะคุณ" · โควตา/เครดิตคงเหลือ · ราคาต่อครั้ง

7.9 หน้าถามวันเกิด (edge case)


8. Screen-by-screen — ส่วนที่ 1 (ฟรี)

8.1 ขั้นตอนเดียว — เลือกด้านที่อยากเสริม

8.2 ระบบเลือกวอลเปเปอร์ให้

ไม่ใช่หน้าจอ แต่เป็นตรรกะที่ต้องเขียนให้ตรง:

want = colorAt(birth, positionOf(aspects[0]))        // สีที่คำนวณได้

candidates = CuratedWallpaper
  .filter(w => w.active)                            // รูปเปิดอยู่
  .filter(w => collectionOf(w).active)              // และคอลเลคชั่นเปิดอยู่
  .filter(w => w.aspects ∩ userAspects ≠ ∅)
  .filter(w => w.planets.includes(want))            // โทนสีตรงกับที่คำนวณได้
  .filter(w => ยังไม่เคยได้รับภายใน 30 วัน)

คอลเลคชั่นมีผลจุดเดียวคือบรรทัดที่ 2 — นอกนั้นระบบไม่รู้จักคอลเลคชั่นเลย ลูกค้าไม่เห็นชื่อชุด และรูปถูกสุ่มข้ามทุกชุดที่เปิดอยู่

เงื่อนไข ต้องทำอะไร
มีผู้สมัครหลายภาพ สุ่ม 1 ภาพ
ไม่เหลือภาพเพราะกันซ้ำ 30 วัน ผ่อนเงื่อนไขกันซ้ำก่อน (ลดเหลือ 14 วัน → 7 วัน → ไม่กัน)
ไม่เหลือภาพเพราะคอลเลคชั่นถูกปิด ไม่ผ่อน — ถือว่าตั้งใจปิด · ไปขั้นถัดไปเลย
ไม่เหลือภาพเพราะสีไม่ตรง ผ่อนเป็นดาวคู่มิตร แล้วค่อยผ่อนเป็นด้านอย่างเดียว
ยังไม่เหลืออีก ใช้ ภาพกลาง ที่เตรียมไว้ล่วงหน้า
ห้ามขึ้น error เด็ดขาด ลูกค้าต้องได้ภาพเสมอ

8.3 ผลลัพธ์ (ส่วนฟรี)

8.4 ปฏิทินของฉัน

กฎ ค่า
ขึ้นเฉพาะวันที่เข้ามารับจริง วันที่ไม่ได้เข้ามาต้องว่าง
เติมย้อนหลัง ❌ ไม่ได้เด็ดขาด
รับแล้วไม่ได้โหลด ✅ ก็ยังขึ้น (บันทึกการรับ ไม่ใช่การโหลด)
ลบแล้วกดใหม่ ❌ ว่างถาวร
หน้าตาช่องว่าง เงียบ ๆ ไม่ตำหนิ — นับสิ่งที่เขาทำ อย่านับสิ่งที่ไม่ได้ทำ

ห้ามใส่ streak counter หรือข้อความทวงถามในช่องว่าง — ผิดกับอารมณ์ของผลิตภัณฑ์


9. Screen-by-screen — ส่วนที่ 2 (AI)

9.0 ด่านโควตา

9.1 STEP 1 — ด้านที่อยากเสริม

เหมือนข้อ 8.1 ทุกประการ (การ์ด 8 ใบ · 1–2 ด้าน · ด้านแรกกำหนดสีและเลข)

9.2 STEP 2 — สีมงคล + เลขมงคล

หน้าที่สำคัญที่สุดของทั้งแอป ต้องแสดง 4 อย่างครบ:

  1. การ์ดสี — ชื่อสี, ป้ายบอกตำแหน่งทักษา + ดาว, ค่า hex, สีรองถ้ามี · พื้นหลังเป็น gradient ของสีนั้น · ต้องสลับสีตัวอักษรเป็นเข้มเมื่อ light: true
  2. เหรียญเลขมงคล บนการ์ดสี — ตัวเลขในวงกลม พร้อมป้าย "เลขมงคล"
  3. บรรทัดเหตุผล"คุณเกิดวัน{X} อยากเสริม{Y} ซึ่งตรงกับตำแหน่ง{Z} → สี{Z}ของคุณคือสี{C} และเลขมงคล {N} (ดาว{P})"
  4. การ์ดที่ควรเลี่ยง — บอก ทั้งสีและเลขกาลกิณี คู่กัน พร้อมอธิบายว่าเป็นของดาวอะไร

9.3 STEP 3 — องค์เทพ (ข้ามได้)

9.4 STEP 4 — สไตล์

9.5 STEP 5 — prompt อิสระ

9.6 ปุ่มสร้าง

9.7 เมื่อเจนไม่สำเร็จ

9.8 ผลลัพธ์ (ส่วน AI)


10. คลังของฉัน + ปุ่มหัวใจ

คลังเดียวรวมของทั้งสองส่วน แยกด้วยแท็บและตัวกรอง ไม่ใช่แยกเป็นคนละคลัง

♡ เป็นปุ่มคัด ไม่ใช่ปุ่มเก็บ เพราะทุกชิ้นถูกเก็บอัตโนมัติอยู่แล้ว · สลับได้ตลอด ไม่กระทบไฟล์

เปิดดูชิ้นงานแล้วทำอะไรได้บ้าง:

ปุ่ม กฎ
⬇ โหลดซ้ำ ฟรีเสมอ ไม่หักเครดิต ไม่ว่าจะมาจากส่วนไหน — ของส่วน AI จ่ายไปแล้วตอนเจน เก็บอีกรอบ = เก็บเงินสองรอบกับของชิ้นเดียว
♡ ชอบ/เลิกชอบ สลับได้ตลอด
✨ สร้างแบบนี้อีก โหลดสูตรเดิมไปส่วน AI · เสียเครดิต ต้องบอกราคาก่อนกด
🗑 ลบ ต้องยืนยัน · ของส่วนฟรี → ช่องปฏิทินว่างถาวร

ปุ่ม "✨ สร้างแบบนี้อีก" คือจุดขายที่ถูกมองข้ามบ่อย — คนที่กลับมาดูของเก่าคือคนที่ชอบผลงานนั้น ให้เขาต่อยอดจากสูตรเดิมได้เลย เป็น conversion ที่ต้นทุนต่ำที่สุด

ที่เก็บ: ผูกกับบัญชีผู้ใช้ ไม่ใช่เครื่อง · ไม่มีวันหมดอายุ · ไม่จำกัดจำนวน (เพดานกันบอท ~500) ลดแพลน / แพลนหมด → ห้ามลบของเก่า แพลนคุมแค่การเจนใหม่


11. Asset spec + Rendering pipeline

11.1 การแบ่งชั้น — หัวใจของทั้งระบบ

🔄 เปลี่ยนจากข้อสรุปเดิม — เดิมเขียนว่า "ไม่ใช้ AI generate เลย" ตอนนี้ ใช้ AI เฉพาะชั้นฉาก ตามข้อสรุประดับโปรเจกต์ · องค์เทพยังมาจากคลังเหมือนเดิม

ชั้น ใครทำ เหตุผล
1. ฉาก / พื้นหลัง AI ตรงนี้คือคุณค่าที่ลูกค้าจ่าย — ภาพไม่ซ้ำใคร
2. องค์เทพ คลังภาพที่ตรวจแล้ว AI วาดสรีระเทพเพี้ยน (แขนเกิน มือบิด พระพักตร์ผิดรูป) = ความไม่เคารพและเสี่ยงดราม่าหนักในตลาดสายมู
3. ลายมงคล / ยันต์ SVG parametric ระบายด้วยสีที่ derive จากสีมงคล · เปลี่ยนตาม seed ได้โดยไม่ต้องเพิ่ม asset
4. ตัวหนังสือไทย + คาถา โค้ดวาด AI เขียนภาษาไทยออกมาเป็นตัวมั่วเกือบ 100%
5. เลขมงคล โค้ดวาด ต้องคำนวณจากทักษา และต้องเปิด-ปิดได้โดยไม่เจนใหม่

ส่วนที่ 1 (ฟรี) ใช้ชั้น 1 จากคลังของแอดมินแทน AI — ชั้น 4–5 ยังวาดทับเหมือนกัน

11.2 Pipeline

คำขอ: { birthDayOfWeek, aspects, colorPlanet, deityId, styleId, promptSanitized, showNumber, seed, source }
   │
   ├─ 1. resolve สี+เลข   → PLANETS[colorPlanet] · luckyNumberOf(birth, positionOf(aspects[0]))
   ├─ 2. ได้ชั้นฉาก        → source='ai': เรียกโมเดล · source='free': ดึงจาก CuratedWallpaper
   ├─ 3. ด่านคุณภาพ        → ไม่ผ่าน → วนข้อ 2 (สูงสุด 2 ครั้ง) · ผ่าน → **หักเครดิตตรงนี้เท่านั้น**
   ├─ 4. วางลายมงคล        → SVG parametric ตาม seed
   ├─ 5. วางองค์เทพ        → PNG โปร่งจากคลัง + halo (ข้ามถ้า deityId = null)
   ├─ 6. วางข้อความ        → ชื่อองค์เทพ/ด้าน + คาถา
   ├─ 7. วางเลขมงคล        → ถ้า showNumber — **ชั้นแยก ปิดได้โดยไม่ต้องทำข้อ 2 ใหม่**
   ├─ 8. เว้น safe area    → บนสุด 20% ต้องไม่มี subject/ข้อความ (นาฬิกาล็อกสกรีนทับ)
   └─ 9. export           → 1170 × 2532 (@3x) · PNG · **ไม่มีลายน้ำ**

ข้อกำหนดที่ต้องบังคับใน pipeline

11.3 Asset spec — คลังภาพองค์เทพ

ใช้ทั้งสองส่วน — ส่วนฟรีก็ประกอบองค์เทพจากคลังเดียวกัน

หัวข้อ ข้อกำหนด
จำนวน 15 องค์ตามตารางข้อ 4
ไฟล์ PNG พื้นหลังโปร่งใส · ด้านสั้นไม่น้อยกว่า 2000px · แนวตั้ง
สไตล์ ต้องเป็นชุดเดียวกันทั้ง 15 องค์ (เส้น สัดส่วน แสงเงา โทน) ไม่ใช่เก็บจากหลายที่
สี วาดในโทนกลาง/ทอง ให้ประกอบเข้ากับพื้นหลัง 8 สี ได้ทุกสี — ทดสอบกับดาวจันทร์ (พื้นอ่อน) และดาวเสาร์ (พื้นดำ) เป็นเคสยากสองขั้ว
ความเหมาะสม สรีระและเครื่องทรงต้องถูกตามคติของแต่ละองค์ (จำนวนกร สิ่งที่ถือ พาหนะ) · ห้ามครอปตัดพระเศียรหรือพระกร · ห้ามใช้ท่าที่ดูไม่เคารพ
ลิขสิทธิ์ buyout เชิงพาณิชย์ ระบุสิทธิ์ใช้ในแอปและสื่อโฆษณา แก้ไข/ย่อขยาย/ประกอบภาพได้
ตรวจรับ ให้ผู้รู้หรือที่ปรึกษาด้านความเชื่อตรวจก่อนขึ้นระบบ พร้อมกับการตรวจคาถา

ห้ามใช้: ภาพจาก Google Images, Pinterest, สื่อโซเชียล หรือภาพถ่ายเทวรูปจากวัด/ศาลที่ไม่ได้ขออนุญาต — ใช้เชิงพาณิชย์ไม่ได้

ลายมงคลไม่ต้องจ้างวาด — เป็น SVG parametric ที่ระบบวาดเองจากสีของลูกค้า (ลายกลีบดอก · วงออร่า · ยันต์สี่เหลี่ยม · ประกาย · ตรามงคล) ถ้าอยากได้ลายพิเศษเพิ่ม ให้สั่งเป็น SVG ที่รับพารามิเตอร์สีได้


12. กัน AI เจนออกมาแล้วพัง — 8 ชั้น

# ชั้น รายละเอียด
1 แยกชั้นภาพ สำคัญที่สุด แก้ได้ ~80% — AI ทำเฉพาะฉาก · องค์เทพจากคลัง · ตัวหนังสือ/เลขให้โค้ดวาด (ข้อ 11.1)
2 ไม่ส่ง prompt ดิบ [โครงที่เราคุม] + [สไตล์] + [สีมงคล] + «ข้อความลูกค้า» + [negative] · ตัดคำสั่งที่พยายามคุมระบบ (prompt injection)
3 Negative prompt ทุกครั้ง text, thai script, watermark, deformed, extra limbs, distorted face, nsfw, blurry
4 กรอง 2 ทาง ขาเข้า: คำหยาบ/ศาสนา/การเมือง/ชื่อบุคคลจริง · ขาออก: NSFW + คุณภาพ ก่อนโชว์
5 ด่านคุณภาพก่อนหักเครดิต ไม่ผ่าน → เจนใหม่ไม่หัก · พลาด 2 ครั้ง → แจ้งให้ลองใหม่ (ไม่ต้องคืนเครดิต)
6 คุมองค์ประกอบ เจน 9:19.5 แต่แรก ไม่ครอปเอา · บนสุด 20% โล่ง กันนาฬิกาทับ
7 ล็อกพารามิเตอร์ต่อสไตล์ ให้ภาพเป็นตระกูลเดียวกัน ไม่ใช่ 10 คนได้ 10 อารมณ์
8 คนสุ่มตรวจช่วงเปิดตัว ดูผลจริงทุกวัน โดยเฉพาะภาพที่มีองค์เทพ

13. ประวัติ — เก็บ 2 แบบ คนละเหตุผล

🔄 ข้อสรุปนี้เปลี่ยนจากรอบแรก — เดิมสรุปว่าไม่ต้องทำ history เพราะสร้างซ้ำได้ฟรีจากสูตร แต่พอส่วนที่ 2 ใช้ AI แล้ว ภาพสร้างซ้ำให้เหมือนเดิมไม่ได้ และลูกค้าจ่ายเงินไปแล้ว ถ้าไม่เก็บไฟล์ = ของที่ซื้อไปหายถาวร

ส่วนที่ 1 — ปฏิทินของฉัน ส่วนที่ 2 — คลังภาพ
เก็บอะไร วันที่ · id ภาพ · ด้าน · เปิด/ปิดเลข ไฟล์ภาพจริง + สูตร + เครดิตที่หัก
ทำไม ไดอารี่ สร้างนิสัยกลับมา จ่ายเงินแล้ว + AI สร้างซ้ำไม่ได้
เก็บอัตโนมัติ
ความจำเป็น มีก็ดี บังคับ
ขนาด ~40 ไบต์/รายการ ~400–500 KB/ภาพ → 10,000 ภาพ ≈ 5 GB

14. PDPA

การเก็บว่าลูกค้าบูชาองค์เทพองค์ไหน และกังวลเรื่องอะไร = ข้อมูลส่วนบุคคลอ่อนไหวตามมาตรา 26 (ความเชื่อทางศาสนา และในกรณีการ์ด health คือข้อมูลสุขภาพ)

ต้องมี รายละเอียด
ขอความยินยอมแยก ไม่รวมกับ consent ทั่วไปของแอป
ลบทีละชิ้น ปุ่ม 🗑 ในคลัง (ข้อ 10)
ลบทั้งหมด ปุ่มในหน้าตั้งค่า ลบทั้งปฏิทิน คลัง และ prompt ที่เคยพิมพ์
ลบจริง ลบไฟล์ออกจาก storage ด้วย ไม่ใช่แค่ซ่อนแถว
ไม่ส่งต่อ ห้ามส่งข้อมูลองค์เทพ/ด้านให้ระบบโฆษณาหรือ analytics บุคคลที่สาม
prompt ที่ลูกค้าพิมพ์ ถือเป็นข้อมูลส่วนบุคคลด้วย — ต้องลบได้และห้ามเอาไป fine-tune โดยไม่ขอ

15. ยังไม่ได้ตัดสินใจ

  1. แพลนไหนเจนได้กี่ครั้ง · ราคาเครดิต · ราคาแพ็กเติม — ตัวเลขทั้งหมดของข้อ 9.0
  2. รายการสไตล์สุดท้าย — เสนอไว้ 6 (ข้อ 5) เลือก 5–6 พอ
  3. เลือก 2 ด้านแล้วโชว์เลขมงคลของด้านไหน — ตอนนี้ใช้ด้านแรก จะโชว์ 2 เลขไหม
  4. คลังภาพองค์เทพ ~15 องค์ — งบและวิธีได้มา
  5. สิทธิ์รายวันของส่วนฟรีถูกใช้ตอนไหน — ตอนกดเลือกด้าน หรือตอนกดโหลด (มีผลมากกับความรู้สึกลูกค้า)
  6. เพดานการลองใหม่เมื่อเจนไม่สำเร็จ — ต้องมี ไม่งั้น prompt ที่ไม่ผ่านตลอดจะกินค่า token ไม่จำกัด
  7. คาถาบูชา — ใครเป็นผู้ตรวจทาน? ต้องได้คนที่กลุ่มเป้าหมายยอมรับ
  8. protect ยืมสีเดช — รับได้ หรืออยากตัดการ์ดนี้ออกให้เหลือ 7 ด้านตรงตามทักษาเป๊ะ ๆ
  9. พระพุทธรูปประจำวันเกิด — ต้องวาด 7–8 ปางแยกตามวันเกิด หรือใช้ปางเดียวรวม
  10. สีรองในชุดเดียวกัน — ดาวราหูมี 3 สี (ม่วง/ทอง/เทา) ให้ลูกค้าเลือกสีรองในชุดได้ไหม
  11. กำลังดาว — จะเพิ่ม "ท่องคาถา N จบ" ใต้คาถาไหม (ข้อมูลพร้อมแล้วในข้อ 2.5)

16. สิ่งที่ยกเลิก / เปลี่ยนจากที่เคยตกลง

⚠️ ตารางนี้กันไม่ให้ย้อนกลับไปทำของที่ตัดทิ้งไปแล้ว ข้อสรุปเปลี่ยนหลายรอบระหว่างทาง

เคยตกลงว่า ตอนนี้ เพราะ
ไม่ต้องทำ history ทำ (2 แบบ) AI สร้างซ้ำไม่ได้ + ลูกค้าจ่ายเงินแล้ว
ใส่ลายน้ำกันแคปหน้าจอ ไม่ใส่ทั้งสองส่วน ของฟรีไม่ต้องกัน · ลายน้ำในของฟรีจะทำลาย hook รายวัน · ของที่จ่ายแล้วต้องสะอาด
ปุ่มสุ่ม [‹][🎲][›] ไม่มีปุ่มสุ่ม ส่วนฟรีให้สิทธิ์วันละ 1 ครั้ง · ส่วน AI แต่ละครั้งเสียเครดิตอยู่แล้ว
เสี่ยงทาย / ไพ่คว่ำ 3 ใบ ยกเลิก ไม่มีกลไกนี้ เป็นสิ่งที่คิดเพิ่มเกินจากที่ตกลง — ส่วนฟรีมีขั้นตอนเดียวคือเลือกด้าน
ปุ่ม "เก็บไว้ก่อน" 🔄 ♡ ที่ชอบ เก็บอัตโนมัติหมดแล้ว ♡ จึงเป็นปุ่มคัด
โชว์ตัวเลือก 4–6 อันให้เลือก ยกเลิก ปล่อยให้ไล่ดูคลังหมดภายในไม่กี่วัน
รีเซ็ตโควตา 06:00 🔄 เที่ยงคืน ใช้เส้นแบ่งวันเดียวกับปฏิทิน
flow 4 ขั้นตอนเดิม 🔄 ย้ายไปเป็นส่วนที่ 2 (5 ขั้นตอน) ส่วนฟรีเหลือขั้นตอนเดียว หลังบ้านคัดภาพไว้ให้แล้ว
ธีมเดลี่มู / ธีมองค์เทพ 🔄 กลายเป็น "สไตล์" ในส่วนที่ 2 องค์เทพเป็นตัวเลือกอิสระแล้ว ไม่ใช่จุดแยกทางของ flow
ถอดตัวเลือก "ไม่ระบุองค์เทพ" 🔄 กลับมาแล้ว ความขัดแย้งกับระบบธีมหายไปพร้อมกับธีม
ไม่ใช้ AI เลย 🔄 ใช้เฉพาะชั้นฉาก ข้อสรุประดับโปรเจกต์ · องค์เทพยังมาจากคลัง
เซฟไม่จำกัด ไม่มี paywall 🔄 มีโควตาทั้งสองส่วน ส่วนฟรี 1 ครั้ง/วัน · ส่วน AI แพลน+เครดิต
ดักที่การเซฟ/โหลด 🔄 ดักที่การเจน ต้นทุนอยู่ที่ค่า token ไม่ใช่ที่การโหลดไฟล์ · โหลดซ้ำต้องฟรีเสมอ

ของที่ทำไปแล้วไม่เสียเปล่า — เครื่องคำนวณทักษาปกรณ์ · ตารางสีและเลขมงคล · การ์ดเลือกด้าน 8 ใบ · ตาราง mapping องค์เทพ ใช้ต่อได้ทั้งสองส่วน


17. การตรวจสอบ (QA)

17.1 ตรวจตรรกะสีและเลข

วันเกิด ด้าน (ตำแหน่ง) สีที่ต้องได้ เลขที่ต้องได้ กาลกิณี (สี / เลข)
เสาร์ เงินทอง (มูละ) แดงสด 1 เขียว / 4
ศุกร์ ความรัก (ศรี) ชมพู/แดงแก่ 3 ม่วง/ทอง/เทา / 8
พฤหัสบดี การงาน (เดช) ฟ้า/น้ำเงิน 6 ดำ/ม่วงเข้ม / 7

จุดที่พลาดง่าย: ศรีของวันศุกร์คือดาวอังคาร (ชมพู) ไม่ใช่ดาวอาทิตย์ (แดงสด) — ต้องเดินตามสูตร ห้ามเดา

17.2 เคสที่ต้องทดสอบทุกครั้งที่แก้ flow

ตรรกะร่วม

  1. วันเกิด × สไตล์ — วาดได้ครบทั้ง 8 สี × ทุกสไตล์ โดยไม่พัง
  2. พื้นอ่อน (ดาวจันทร์) — ตัวอักษรต้องสลับเป็นสีเข้ม และลายมงคลต้องยังมองเห็น
  3. หน้าถามวันเกิด — กดเลือกวันแล้วการเลือกต้องติดและปุ่มบันทึกต้องเปิด
  4. เลือกสีกาลกิณีเอง — เลขมงคลบนวอลเปเปอร์ต้อง ไม่ กลายเป็นเลขกาลกิณี

ส่วนที่ 1 5. ใช้สิทธิ์แล้วเข้ามาใหม่ — ต้องเห็นของวันนี้ ไม่ใช่เริ่มใหม่ 6. ขอเปลี่ยนใหม่ 2 ครั้งในสัปดาห์เดียว — ครั้งที่ 2 ต้องถูกปฏิเสธพร้อมบอกเหตุผล 7. คลังไม่มีภาพตรงเงื่อนไข — ต้องผ่อนเงื่อนไขตามลำดับข้อ 8.2 และได้ภาพเสมอ ห้าม error 8. กดตอน 23:59 แล้วกดอีกตอน 00:01 — ต้องได้ 2 วันแยกกัน ไม่ใช่ถูกบล็อก 9. วันที่ไม่ได้เข้ามา — ปฏิทินต้องว่าง และเติมย้อนหลังไม่ได้ 10. ลบรายการปฏิทินแล้วกดรับใหม่วันเดิม — ต้องยังว่าง

ส่วนที่ 2 11. เจนไม่ผ่าน 2 ครั้ง — ต้องไม่มีแถวใน CreditLedgerEntry และหน้าจอต้องมีปุ่มลองใหม่ 12. เจนผ่าน — ต้องมีแถวหักเครดิต 1 แถวเท่านั้น ต่อ 1 ภาพ 13. เปิด-ปิดเลขมงคลหลังเจนเสร็จ — ต้องไม่เรียกโมเดลซ้ำและไม่หักเครดิต 14. prompt ที่พยายามสั่งให้วาดตัวหนังสือ/องค์เทพ — ต้องถูกตัดที่ชั้นที่ 2 15. เปลี่ยนด้านหลังเลือกเทพ — เทพที่ไม่ตรงด้านใหม่ต้องถูกล้าง 16. โหลดซ้ำของเก่า — ต้องฟรี ไม่หักเครดิต 17. แพลนหมดอายุ — ของเก่าในคลังต้องยังอยู่ครบ


แหล่งอ้างอิงเนื้อหา