Một token, một mục tiêu
10 level đầu chỉ có sao biển. Không dùng sò làm filler vì làm loãng ý nghĩa cứu hộ.
Shell Tide · Working Design Branch
Mỗi level chỉ thắng khi toàn bộ sao biển đã vào Vùng Nước An Toàn. Các node chạy quanh chu vi vuông; hồ trung tâm kể câu chuyện nguồn nước nhưng không tham gia state solver.
Player promise mới: “Mình đã tự mở Dòng Chảy và đưa tất cả sao biển về vùng nước an toàn.” Mỗi token biến mất khỏi board phải mang ý nghĩa cứu hộ, không phải dọn filler.
10 level đầu chỉ có sao biển. Không dùng sò làm filler vì làm loãng ý nghĩa cứu hộ.
Player được chọn mọi hố và hướng hợp lệ. Preview giải thích outcome nhưng không auto-pick.
Level không kết thúc sớm khi mới cứu một phần. Cụm cuối phải rời board trước màn kết quả.
Trạng thái: thiết kế onboarding đã chốt để triển khai sau; chưa được xem là runtime hoàn chỉnh. Flow này chỉ chạy khi splash xác định isNewPlayer === true. Returning player bỏ qua toàn bộ cinematic và vào thẳng menu sau khi preload hoàn tất.
| State | Visual / chuyển động | Copy và input | Điều kiện chuyển |
|---|---|---|---|
| NEW_PLAYER_CHECK | Đọc rescueFlowPlayerProfileV1 và legacy progress. Nền cát được phép hiện ngay; khung loading thường bị ẩn. |
Không yêu cầu input. Nếu storage bị chặn, tiếp tục bằng profile trong phiên và ghi cờ persistenceAvailable: false. |
Chỉ vào flow dưới đây khi isNewPlayer === true; player cũ chuyển thẳng sang preload menu. |
| HUMMING_INTRO | Tạm ẩn hoàn toàn foreground biển/foam và toàn bộ footprint. Chỉ giữ bãi cát. Lyrics nằm ngay trong dialogue box RPG ở vùng bottom với speaker “Bạn”. Câu hát dùng cùng typography và căn lề như lời thoại thường; một icon nhạc nhỏ đứng cạnh câu để thể hiện Player đang ngân nga. | Karaoke chạy lần lượt: “Chớ âu lo để làm gì” → “Hè về là ta phải đi thôi” → “Tuổi xuân nào đâu có chờ đợi...”. Chữ chưa đến lượt không được hiện mờ. | Icon nhạc và câu cuối hoàn tất chu kỳ mở đầu khoảng 10 giây. |
| PLAYER_MONOLOGUE | Lyrics rút khỏi màn hình. Mở dialogue box RPG ở đáy màn hình, có speaker label của player, typewriter nhanh và affordance tiếp tục. | Player: “Ôi mấy nay trời nóng quá, phải đi tắm biển thôi...” Player bấm/click hoặc nhấn Space/Enter để tiếp tục. | Player xác nhận hội thoại; không tự bỏ qua câu đầu nếu chưa có input. |
| TIDE_REVEAL | Foreground biển/foam chuyển từ alpha 0 → 1 bằng fade mềm khoảng 1,2–1,6 giây. Không slide nguyên layer và không flash trắng. | Sau câu “phải đi tắm biển thôi”, dialogue box ẩn hoàn toàn trong khoảng 8 giây để Player quan sát footprint đi dạo trên bãi biển. Hết khoảng nghỉ mới hiện dialogue bottom: Player: “Nước biển mát quá! Tắm biển thật tuyệt vời.” | Foreground đạt alpha 1 và asset đã decode. |
| BEACH_WALK | Footprint trái/phải dùng lại route chéo cũ dọc theo mép biển, xuất hiện so le với khoảng bước ổn định. Mỗi dấu vẫn có random offset/rotate nhỏ; dấu cũ fade trước khi loop reset. Route giữ một hướng đi rõ ràng và không cắt vào vùng nước. | Dialogue bottom có thể chạy 1–2 câu ngắn như “Cát ấm thật, nhưng sát mép nước thì dễ chịu hơn nhiều.” Không chặn flow quá lâu. | Sau một vòng đi ngắn hoặc khi player advance dialogue. |
| DOLPHIN_ENTRANCE | Dùng visual Cá Heo từ prototype Agent Cá Heo. Avatar đi từ ngoài border phía trên xuống rìa bãi biển, opacity tăng dần 0 → 1 và dừng trên phần cát sát foam. Trong onboarding phải ẩn nút mở chat panel và nút realtime speech; mic cũng tiếp tục hidden. Không cho kéo avatar trong cinematic. | Bubble Cá Heo xuất hiện sau khi avatar đã đọc được rõ, không xuất hiện trước nhân vật. | Avatar đến anchor shoreline và entrance animation kết thúc. |
| RESCUE_REQUEST | Giữ Cá Heo ở rìa bãi biển; dialogue box RPG lớn phía dưới luân phiên speaker “Cá Heo” và “Bạn”. Tạm ẩn speech bubble nhỏ trên đầu Dolphin để tránh hiển thị hai khung thoại cùng lúc. Có nút xác nhận rõ, không dùng chat tự do ở bước này. | Cá Heo: “Bạn ơi, giúp mình với! Mấy bạn sao biển ham chơi nên chưa kịp về trước khi thủy triều rút. Nếu không đưa các bạn ấy về nước ngay, nắng nóng sẽ làm các bạn ấy kiệt sức mất!” Player choice: “Được, mình sẽ giúp!” Disabled choice: “Mình không rảnh” chỉ hiển thị làm lựa chọn phụ, luôn mờ và không thể bấm trong onboarding. |
Player bấm nút đồng ý. Không tự đồng ý thay player. |
| PROFILE_SETUP | Mở popup profile trên nền scene hiện tại; khóa input phía sau nhưng vẫn giữ Cá Heo và bãi biển như context. | Cá Heo hỏi thông tin cơ bản. Form gồm Nam/Nữ, nickname và ngôn ngữ. CTA chính: “Bắt đầu cứu hộ”. | Form hợp lệ; profile được lưu và đồng thời upsert vào global shared memory. Nếu storage bị chặn, chấp nhận fallback trong phiên. |
| WELCOME_COMPLETE | Đóng popup, giữ Cá Heo làm coach mặc định và chuyển thẳng vào Level 1 tại game/play/shell-tide-playable.html, bỏ qua menu ở lần đầu. |
Không phát lại cinematic ở lần mở sau. | Set welcomeStatus: "completed" và welcomeCompletedAt. |
Lyrics và lời thoại dùng chung dialogue box RPG ở bottom. Khi ngân nga, box vẫn hiển thị speaker “Bạn” và text như lời thoại thường, chỉ thêm một icon nhạc nhỏ; từng câu được thay nguyên dòng theo nhịp thay vì chạy màu karaoke. Khi trò chuyện, cùng box dùng typewriter ngắn và indicator tiếp tục. Chat tự do/realtime speech không xuất hiện trong onboarding vì làm loãng nhịp kể chuyện và xin thông tin quá sớm.
Click/tap, Space hoặc Enter chỉ advance khi câu hiện tại đã render xong; input đầu tiên khi typewriter đang chạy chỉ hoàn tất câu, input tiếp theo mới chuyển câu.
Nguy cơ nắng nóng phải rõ để tạo động lực cứu hộ, nhưng production copy ưu tiên “kiệt sức” thay cho mô tả quá graphic. Cá Heo lo cho bạn bè, không trách mắng sao biển.
Bản đầu tiên không hiện nút skip trước khi player hiểu lý do cứu sao biển. Sau khi profile đã lưu, mọi lần mở tiếp theo bypass toàn bộ sequence.
| Field | UI / validation | Storage contract |
|---|---|---|
| Giới tính | Hai lựa chọn Nam/Nữ, một lựa chọn tại một thời điểm. | gender: "male" | "female" |
| Nickname | Trim khoảng trắng; 2–16 ký tự; báo lỗi inline; không dùng nickname làm định danh kỹ thuật. | nickname; player identity vẫn dùng playerId. |
| Ngôn ngữ | Mặc định theo locale browser nếu hỗ trợ, fallback tiếng Việt. Cho player đổi trước khi submit. | locale: "vi" | "en" ở scope profile/settings. |
| Shared memory | Nickname, giới tính và ngôn ngữ là thông tin do Player xác nhận, hữu ích cho mọi Tide Coach. Đánh dấu chính sách Important + Durable + Safe + Shared và mức ưu tiên sản phẩm very-important. | Upsert player.nickname, player.gender, player.locale và player.profile_importance = "very-important" vào shellTide.globalSharedMemory.v1. |
| Onboarding | Chỉ complete sau khi form hợp lệ và CTA được bấm. | welcomeStatus: "completed", welcomeCompletedAt. |
| Nhịp | Chủ đề | Copy ngắn của Cá Heo |
|---|---|---|
| 1/4 | Mục tiêu | Đưa tất cả sao biển về Vùng Nước An Toàn trước khi hết lượt. |
| 2/4 | Core rule | Chọn hố có sao, xem trước hai hướng, rải từng ô; vị trí sao cuối dừng lại là STOP. |
| 3/4 | Dòng Chảy | Dòng Chảy là đường sáng mà sao sẽ đi; canh STOP để phía trước có một ô trống rồi tới cụm sao. |
| 4/4 | Sóng Cứu Hộ | Khi Dòng Chảy gặp đúng ô trống và cụm sao, Sóng Cứu Hộ đưa cả cụm về vùng an toàn. |
HUMMING_INTRO.level_start do preload không được tính là đã chơi. Briefing khóa input board trong bốn câu ngắn và kết thúc bằng CTA “Bắt đầu Level 1”.Cùng một thuật ngữ phải có một nghĩa duy nhất giữa GDD, preview, runtime và solver. Tên hướng mô tả logic graph; không được suy diễn chỉ từ vị trí hình học trên màn hình.
| Thuật ngữ | Player-facing | Định nghĩa runtime / solver |
|---|---|---|
| Node | Một vị trí trên vòng Dòng Chảy. | Một phần tử có index, type, số sao khởi tạo, vị trí layout và hai cạnh logic trái/phải. |
| Hồ trung tâm · Center Lake | Nguồn nước thị giác cấp nước ra bốn phía để khai thông FLOW quanh board. | layout.centerLake, không phải node: không có index, không chứa sao, không thể chọn, không nằm trong edges, nodeCount, objective hoặc state solver. Phiên bản này không có water meter. |
| Hố cát · Sand node | Hố player có thể chọn để bắt đầu rải sao. | Node type: "sand". Chỉ sand node có ít nhất một sao mới là nguồn của legal move. |
| Sao khởi tạo · Init starfish | Số sao nằm sẵn trong hố khi level bắt đầu. | node.starfish được set cứng trong level pack. Tổng init starfish là objective Full Rescue của level. |
| Wet pit | Cửa nước cứu hộ nâng cao nằm trên FLOW; sao đi vào đây được đưa ngay về Vùng Nước An Toàn. | Không xuất hiện trong L1–L4; được giới thiệu lần đầu ở L5 sau khi player đã hiểu Xoáy. Node type: "wet_pit" luôn rỗng và không thể chọn. Wet pit không phải ô quan/ô trời và không bắt buộc có hai cái. |
| Topology | Trật tự các node mà Dòng Chảy có thể đi qua. | Graph xác định quan hệ giữa node, độc lập với ảnh nền hoặc tọa độ CSS. |
| Topology left/right | Hai hướng FLOW player được chọn. | edges.left[index] và edges.right[index] trả về node kế tiếp. Hai cạnh phải reversible. “Trái/phải” là hướng logic quanh graph, không luôn đồng nghĩa đi sang trái/phải trên màn hình. |
| FLOW · Dòng Chảy | Đường các sao sẽ đi sau khi player chọn hố và hướng. | Chuỗi node được traversal qua topology; mỗi sao trong hố nguồn được xử lý tuần tự. |
| Route | Đường preview cụ thể của một nước. | Danh sách có thứ tự { index, order, direction, currentTurn } được simulation trả về. |
| STOP | Node nơi sao cuối cùng của tay rải kết thúc hành trình. | Cursor sau khi xử lý toàn bộ số sao trong hố nguồn. Capture bắt đầu kiểm tra từ node kế tiếp sau STOP theo hướng cuối cùng. |
| Current Arrow | Hố rải một chiều: nếu cầm sao từ hố này, player chỉ được rải theo hướng mũi tên. | currentDirection: -1 | 1 giới hạn legal move khi node Current là nguồn. FLOW đi ngang qua từ node khác không đổi hướng. Preview tại hố Current chỉ hiển thị một route hợp lệ. |
| Thuật ngữ | Player-facing | Định nghĩa runtime / solver |
|---|---|---|
| Rescue | Một hoặc nhiều sao rời board và vào Vùng Nước An Toàn. | Xảy ra khi sao đi vào wet pit, một cụm bị capture hoặc Final Tide Sweep kích hoạt. |
| Ô trống hợp lệ | Điểm có thể hình thành Xoáy Cứu Hộ. | Node có 0 sao, nằm ngay trước một sand node đang có sao theo hướng FLOW sau STOP. |
| Cụm giàu sao · Rich cluster | Cụm sao ngay sau một ô trống hợp lệ. | Toàn bộ số sao ở rich sand node được capture cùng lúc; không tách một phần cụm. |
| Xoáy Cứu Hộ · Capture | Xoáy tại ô trống hút cụm sao kế tiếp khỏi cát. | Rule ô trống → rich sand node. Capture làm rich node về 0 và tăng rescue count bằng kích thước cụm. |
| Chuỗi Xoáy · Capture chain | Nhiều Xoáy nối tiếp trong cùng một turn. | Sau một capture, solver tiếp tục kiểm tra pattern ô trống → cụm giàu sao kế tiếp theo cùng hướng. |
| Final Tide Sweep | Đợt nước cuối cuốn cụm sao còn lại về vùng an toàn. | Tắt ở L1–L3 để player học Xoáy thuần túy; bắt đầu giới thiệu ở L4. Khi được bật, chỉ chạy nếu turn vừa tạo ít nhất một rescue hợp lệ và board còn đúng một sand node có sao. |
| Full Rescue | Toàn bộ sao biển của level đã được cứu. | remainingStarfish === 0. Đây là điều kiện thắng bắt buộc; đạt điểm hoặc dùng hết route không thể thay thế. |
| Thuật ngữ | Định nghĩa | Không tính là turn |
|---|---|---|
| Turn · Lượt | Một legal move đã commit: chọn sand node có sao, chọn hướng và thực thi sow/capture. Mỗi commit tăng turnsUsed đúng 1. | Xem preview, đổi hố đang chọn, mở Hint, bật âm thanh, thao tác invalid hoặc restart. |
| turnsUsed | Số turn player thực tế đã commit trong attempt hiện tại. | Không phải số lần click hoặc số đoạn route. |
| optimalTurns · O | Số turn Full Rescue nhỏ nhất được exact BFS chứng minh cho board khởi tạo. | Không phải target designer tự đặt. |
| recoverySlack · R | Khoảng lượt bổ sung cho phép player phục hồi sau nước chưa tối ưu; lấy từ emotion seed và P75 plausible completion paths, thường clamp 2–4. | Không được tăng chỉ để che một board thiếu clarity. |
| maxTurns | Giới hạn commit của một attempt: O + R. Nếu đã dùng hết giới hạn mà còn sao, level game over. | Không phải timer thời gian thực. |
| Rating stars | 3★ nếu dùng đúng optimal; 2★ trong nửa đầu slack; 1★ nếu Full Rescue trong maxTurns; 0★ nếu chưa Full Rescue. | Không phải số sao biển đã cứu. |
| Plausible path | Đường chơi gồm các nước có ý nghĩa nhìn thấy được: rescue, setup ô trống, đi qua wet pit hoặc còn đường phục hồi hợp lý. | Không gồm chuỗi click ngẫu nhiên chỉ để kéo dài attempt. |
| Dead move | Nước hợp lệ về input nhưng không rescue, không tạo setup hữu ích và làm giảm rõ khả năng full-clear. | Dead move không được dùng để nới maxTurns. |
| Near-miss · Missing a piece | Attempt thất bại khi player đã cứu phần lớn sao và chỉ còn một rescue target rõ, thường có thể full-clear nếu được thêm đúng một lượt. | Không phải fail khi board còn nhiều cụm rời rạc hoặc player không hiểu mình thiếu gì. |
| Exact BFS solver | Duyệt state graph theo chiều rộng; lần đầu gặp Full Rescue là minimum-turn proof. State key hiện là phân bố số sao trên các node. | Không mô phỏng xác suất lựa chọn hoặc cảm xúc của player thật. |
| Hệ thống | Contract player-facing | Luật runtime dự kiến | Trạng thái |
|---|---|---|---|
| Sao biển | Mọi sao trên board đều cần được cứu. | remainingStarfish === 0 là điều kiện thắng bắt buộc. | Đã khóa |
| Hố cát | Node có thể chọn để bắt đầu rải. | Board dùng đủ chu vi: 8 node ở grid 3×3 hoặc 12 node ở grid 4×4; một số node có thể là Wet pit. | Đã khóa |
| Hồ trung tâm | Nguồn nước nối tới hố bắt đầu khi player commit turn. | Chỉ là layout/VFX; không phải node, không giữ sao, không có tài nguyên nước và không thay đổi luật solver. | Đã khóa |
| Wet pit | Modifier nâng cao xuất hiện từ L5. | L1–L4 không có Wet pit. Từ L5, sao đi vào đây được cứu trực tiếp; Wet pit không bắt buộc có hai cái. | Đã khóa |
| Xoáy Cứu Hộ | Ô trống hợp lệ hút cụm sao kế tiếp. | Giữ rule capture trống → cụm giàu item và biểu diễn bằng Vortex. | Đã khóa |
| Final Tide Sweep | Sau rescue cuối, dòng nước cuốn cụm sao còn lại vào vùng an toàn. | Tắt ở L1–L3, giới thiệu có chủ đích tại L4; từ đó chỉ kích hoạt sau một rescue hợp lệ và khi board còn đúng một cụm sao. | Đã khóa |
| Game over | Hết Tide Turns mà vẫn còn sao. | turnsUsed >= maxTurns && remainingStarfish > 0. | Đã khóa |
Gameplay vẫn là graph vòng hai chiều, nhưng graph được map lên chu vi grid vuông. Hồ ở giữa chỉ giải thích nguồn nước và cung cấp điểm xuất phát VFX; thay đổi layout không làm thay đổi optimal path hoặc state solver.
Dùng toàn bộ 8 slot chu vi và dành đúng ô 1×1 ở giữa cho hồ. L1–L7 và L9 dùng template này.
Dùng toàn bộ 12 slot chu vi và vùng 2×2 ở giữa cho hồ. L8 và L10 dùng template này.
Mỗi level lưu nodes[], edges.left/right, layout.slots[] và layout.centerLake. Hồ không được thêm vào state key.
Canvas/VFX vẽ bốn kênh từ hồ tới chu vi; khi commit, nhánh tới hố nguồn sáng lên rồi FLOW chạy theo cạnh trái hoặc phải.
Chỉ thêm node khi player đã đọc được FLOW, STOP và Xoáy ở board trước.
Từ mid-game, mỗi state quan trọng cần ít nhất hai route hợp lệ: safe và mastery.
Layout phải giữ sao biển cùng kích thước, route arrow rõ và hit target không bị sprite tràn che.
Rating chỉ được tính sau Full Rescue. Hint, coach hoặc booster không trực tiếp trừ sao; chúng chỉ có thể làm player dùng nhiều lượt hơn. Điều này giữ rating công bằng và dễ giải thích.
maxTurns từ khả năng phục hồi, không cộng lượt cảm tínhmaxTurns phải đủ rộng để một nước chưa tối ưu vẫn cứu được, nhưng đủ chặt để sai thêm một bước tạo near-miss “thiếu đúng một mảnh”. Solver cần duyệt các đường chơi hợp lý: nước vẫn tạo FLOW, rescue, setup hoặc tiến triển nhìn thấy được; không đưa dead move hay click ngẫu nhiên vào mẫu balance.
Chỉ lấy mẫu các nước tạo rescue, tạo ô trống chiến lược, đi qua wet pit hoặc cải thiện khoảng cách tới full-clear. Dead move được đo riêng, không dùng để nới maxTurns.
Percentile 75 giữ khoảng 70–80% đường chơi hợp lý trong vùng có thể thắng, nhưng không biến level thành chuỗi lượt dư không áp lực.
Level rất ngắn vẫn cần khoảng thở và đủ band 3★, 2★, 1★. Ví dụ O=1 nên bắt đầu thử với max=3.
Nếu cần hơn bốn lượt phục hồi, ưu tiên sửa board, giảm node hoặc tăng clarity thay vì tiếp tục bơm lượt.
Khoảng +2 đến +4 là seed tuning, không phải luật cứng. Chỉ giữ khi distribution state cuối đạt đúng cảm xúc mong muốn.
| Nhóm level | Recovery slack khởi điểm | Ý đồ |
|---|---|---|
| L1–L2 · Xoáy core | R = 2 | Thắng sớm bằng Capture thuần túy; L2 cho phép sửa một setup turn chưa tối ưu. |
| L3 · Capture chain | R = 2 | Đủ chỗ đọc chuỗi Xoáy mà chưa trộn Sweep hoặc Wet pit. |
| L4 · Sweep payoff | R = 3 | Giới thiệu Final Tide Sweep sau ba level đã khóa mental model Xoáy. |
| L5 · Wet modifier | R = 3 | Cho player thử cửa cứu trực tiếp nhưng optimal path vẫn kết hợp với Capture. |
| L6 · Relief | R = 3–4 | Nhiều wet pit/route thắng và tỷ lệ pass cao sau tension. |
| L7–L8 · Mastery | R = 2–3 | Rating phân hóa rõ giữa safe route và đường 3 sao. |
| L9 · Reward | R = 3 | Full-clear ngắn, rộng tay và có cảm giác nhận thưởng. |
| L10 · Finale | R = 3–4 | Cho phép phục hồi một lỗi đọc route nhưng vẫn giữ climax. |
maxTurns.Chứng minh mastery và tạo động lực replay mà không bắt buộc cho progression.
Cho phép một phần slack để player thử nghiệm nhưng vẫn cảm thấy hiệu quả.
Player đã cứu hết trong giới hạn và luôn được tiến sang level kế tiếp.
Node, wet pit, tổng sao và lượt dưới đây lấy trực tiếp từ level pack/proof độc lập. optimal là minimum depth exact BFS; max bằng optimal cộng recovery slack đã clamp trong khoảng 2–4.
| Level | Nhịp cảm xúc | Node / Wet pit | Sao phải cứu | Trọng tâm duy nhất | O / P75 / Max |
|---|---|---|---|---|---|
| L1 | Wow · mình tạo được Xoáy | 8 / 0 | 5 | Ô trống → cụm sao → Xoáy; không Sweep | 1 / 7 / 5 |
| L2 | “À, mình hiểu rồi” | 8 / 0 | 5 | Một turn setup → một turn tạo Xoáy | 2 / 7 / 6 |
| L3 | Combo dopamine | 8 / 0 | 6 | Nhiều Capture nối tiếp; không Sweep | 3 / 7 / 7 |
| L4 | Payoff · nhẹ nhõm | 8 / 0 | 8 | Giới thiệu Final Tide Sweep | 3 / 5 / 6 |
| L5 | Khám phá modifier | 8 / 1 | 10 | Wet pit xuất hiện lần đầu | 3 / 5 / 6 |
| L6 | Relief | 8 / 2 | 6 | Hai cửa cứu, nhiều route thắng | 2 / 4 / 6 |
| L7 | Mastery | 8 / 1 | 12 | Safe route và route 3 sao | 3 / 5 / 6 |
| L8 | Challenge có kiểm soát | 12 / 1 | 13 | Current Arrow khóa hướng rải tại hố nguồn | 3 / 6 / 6 |
| L9 | Reward · thở ra | 8 / 2 | 7 | Ripple Preview, full-clear ngắn | 2 / 4 / 5 |
| L10 | Grand finale | 12 / 2 | 16 | Đại Xoáy tổng hợp FLOW + Current | 4 / 6 / 8 |
Canvas dưới đây tái hiện đúng state khởi tạo và từng transition trong optimalPath của exact solver. Đây là công cụ đọc map cho designer, không phải mockup art direction hoặc playable chính thức.
Cách đọc: hồ aqua ở giữa là nguồn nước visual-only; đường aqua nối hồ với hố bắt đầu; đường coral là route vừa rải quanh chu vi vuông; viền đỏ là hố được chọn; viền vàng là STOP. Dùng Prev/Next để đối chiếu state.
Solver phải chạy đúng simulation runtime, không dùng luật rút gọn khác gameplay. Một level chỉ được chuyển từ draft sang playable khi có bằng chứng tái lập được.
BFS/graph search trả về đường full-clear ngắn nhất, board fingerprint, số state đã duyệt và exact move path.
Kiểm tra safe route, mastery route, dead-move rate, khả năng hồi phục sau một nước chưa tối ưu và near-miss còn cứu được.
Level pack v2 · Solver proof v2 · Solver module. Chạy lại bằng npm run test:full-rescue; tái sinh board bằng node scripts/design-shell-tide-full-rescue.mjs --write-levels; ghi proof bằng node scripts/solve-shell-tide-full-rescue.mjs --write-proof.
State key là phân bố sao trên graph. Mỗi transition mô phỏng sow, wet-pit rescue, giới hạn hướng rải của Current Arrow, capture chain và Final Tide Sweep.
L1–L3 không có Wet pit hoặc Sweep; L4 giới thiệu Sweep; L5 mới mở Wet pit. Optimal tăng từ 1 lên 4 lượt và L10 duyệt 16.124 state để chứng minh minimum 4 lượt.
maxTurns.optimalTurns bằng minimum depth solver tìm được, không phải số designer mong muốn.completionTurns của plausible paths, percentile 75 và recoverySlack đề xuất.maxTurns phải tái lập được từ optimalTurns + recoverySlack; mọi override cần ghi rõ lý do cảm xúc hoặc fairness.wetPitRescue: false; L1–L3 đồng thời đặt finalTideSweep: false. L4 mới bật Sweep và L5 mới có Wet pit.Working draft này kế thừa North Star FLOW/Xoáy, rubric, emotion curve và retention direction; chỉ thay objective, topology board và hệ rating lượt.