PickTrip建造術:自駕上路第一天——三端學會說壞消息、旅伴拿回反悔權、旅程相機相簿落地
PickTrip 產品建造筆記:從旅行想法到可預訂行程 · Episode #10 · · PT7M6S
Host · Kai
Summary
dogfooding 尾聲、demo 倒數兩天。第九集把行程引擎的自駕旗標打開,這一集的主線是「教這台車對每一種人把話講老實」。對使用者:後端把降級與澄清定義成機器可讀的錯誤契約,網頁與 iOS 同日各自接完——降級與卡點用橫幅老實呈現、引擎反問變成畫面問句、多個降級訊號一次列全、短天數硬塞翻成挑重點的 targeted clarify、指名沒排到的 must-have 進警示(PIC-320/311/312/323)。對協作者:修好 AI 改動的反悔權——restoreLast 跳過系統尾巴、以發布版本為地板、非同步商務補完切版本保住、空目標 revert 不准打在有內容行程上,iOS 補版本讀取+退回第 N 版後備(PIC-310/315)。對即將到來的真實用戶:為 App Store 送審(第 48 版)補上檢舉/封鎖 API+審核佇列+伺服器端封鎖強制、隔離測試副作用(PIC-337)。亮點是旅程相機/相簿/即時動態 PRD 落地:WYSIWYG 相機、依旅程分組、未分類相簿兜底、協作者可見相簿摘要、景點主視覺帶攝影者頭像、對齊 Figma(PIC-263)。順手補城際交通合成 leg 與機場碼黏名修復、附件 AI 匯入併進需求與暫留預訂、live-add 機票飯店卡片錨點與 finalize 前 commit、shopping 意圖誠實路由(PIC-308/313/192/302/338/342/345)。風險清單無畢業生,新火是跨端契約分裂:機票 detail iOS 打 offers、web 讀 inline;DAG 機票被標成 point/segments=0 畫成一般點;list 分頁 0/1-index 打架。demo 剩兩天。
Transcript
歡迎回到 PickTrip 產品建造筆記。 昨天旗標打開,那顆自動駕駛的心臟正式上路,我留了一個問題: 它撐得住 demo 當天、有人盯著看的那一刻嗎?
還留了三張新票。 今天 demo 剩兩天。 先把今天這一句講清楚:如果昨天是「把自駕開上路」,今天團隊做的事, 是教這台車——對每一種人,都把話講清楚、講老實。
Luna: 講老實? 車還會說謊喔?
這個你一定要知道,因為自駕上路最大的風險,從來不是它不會開, 是它出狀況的時候,儀表板上一片黑、或者亮一個你根本看不懂的燈。
先講第一種人:使用者。 過去這半天,後端先把「壞消息」定義成一套契約——哪裡降級了、 飯店沒訂到、機票被跳過、可行性有疑慮,哪裡需要反問你一句、
出發地、日期、城市沒講清楚,全部給一個機器讀得懂的代碼, 而不是硬炸一句 pipeline failed。
Luna: 就是把「當機藍屏」翻成「這一格我需要你補一句話」。
對。 但真正關鍵的是——這套契約,網頁跟 iOS 兩端,今天同一天各自接完了。 以前引擎一降級,前端要嘛裝沒事、要嘛螢幕上一直轉圈圈;
現在兩端都會把「這趟哪裡降級、哪裡卡住」用一條橫幅老實貼出來, 還會把引擎的反問,直接變成畫面上一句看得懂的問句。
連好幾個降級訊號同時發生,都會一次全部列出來,不會只報一個就閉嘴。 還有兩個特別漂亮:以前你三天硬塞十個城市,引擎會直接爆炸, 現在會翻成一句「你這幾天塞太多了,要不要挑重點」;
以前你指名一定要去某個景點、它卻沒排進去,會靜靜地丟掉, 現在這種「指名沒排到」會變成明確的警示。
Luna: 這個我超有感。 使用者最怕的不是它做不到,是它做不到還不講,讓你以為排好了, 到現場才發現那一格是空的。
再往下看一層,第二種人:你的旅伴。 多人一起編一趟行程,AI 又會自己動手改,這裡最容易出人命的兩個字是——反悔。
以前你按「退回上一步」,永遠退不到「AI 動手之前」,因為每次 AI 寫入都跟著一條系統尾巴, 你的 undo 只退到那條尾巴。
今天把系統尾巴跳過,改用「已發布的版本」當地板往回退。 更陰險的是那個非同步補完——它會默默幫你把航班價格、細節補上去, 但這步沒切版本,你一反悔,整包心血被抹掉;
現在版本切割會保住它。 還有一條規矩:空目標的反悔,不准打在一個有內容的行程上, 不讓你手一滑一鍵清空。
iOS 這端也補上了讀取歷史版本、還有「退回到第 N 版」的後備。
Luna: 所以你們是把「Ctrl+Z」這件事,在多人加 AI 一起亂改的情況下, 做到真的敢按下去。
敢按下去。 第三種人更有意思——是還沒出現、但即將出現的真實用戶。 iOS 這兩天在準備送審,第四十八版;
為了上架,補了一塊之前完全沒有的東西:檢舉,跟封鎖。
Luna: 檢舉封鎖? 我們不是還沒開放給外人嗎?
這個你一定要知道——App Store 的規矩是,只要你的 App 有「使用者自己產生的內容」, 哪怕還沒紅、還沒開放,送審就得先證明你有能力處理真人之間的衝突。
所以後端長出了檢舉跟封鎖的接口、一個審核佇列,而且封鎖是伺服器端強制執行的, 不是前端做做樣子。
順手還把自動化測試跟正式環境的副作用隔離開,不讓測試機的動作污染到真資料。 這不是一個功能,是一張入場券。
Luna: 好,你一路誠實誠實地講,我有點喘了,能不能給我一個純粹好玩的?
有,而且正好是你的菜。 旅程相機、旅程相簿、即時動態——這是一份正式的產品需求書, 今天落地了。
iOS 上,相機變成所見即所得:你在景點拍的照片,會直接記下那個景點的名字當成地點快照, 照片排在景點詳情的主視覺最前面,還帶上攝影者的頭像。
相簿按「哪一趟旅行」分組,找不到對應行程的照片會收進一個「未分類相簿」, 不會憑空消失。 後端還吐出一個「協作者看得到的相簿總覽摘要」——等於你的旅伴, 也能看到這趟大家拍了些什麼。
Luna: 這個才像旅行嘛! 排行程是理性,拍照片是感性,兩個現在同一個 App 裡。 這是不是第八集那個「iOS 旅程相機接力」,終於長成完整的東西了?
就是它長成了完整的樣子,連相片格都對齊了設計稿——方形兩欄、 X 返回、標題、地圖切換。 好,收尾之前再順手講三件跟 demo 直接相關的硬活,都還是同一個主題: 讓這台車別再假裝。
第一,行程引擎以前產出的行程「恆缺城際交通」——你從成都到重慶, 中間那段路是空的; 現在會寫出一段合成的交通 leg,還修掉一個把機場代碼黏進目的地名字的 bug。
第二,第九集交的那份「AI 訂位匯入」作業繼續長大:附件裡的線索現在會併進行程需求、 用日期粒度跟退房時間去關聯到對應的行程項目,還能把你已經暫留的預訂併進來。
第三,邊聊邊加訂房或機票時,以前那張卡片品質比生成路徑差一截, 機票浮在最後一天、錨點飄在第一天上方;
現在會放在正確的出發日、自成一天,而且下單前先真的 commit 進購物車——連「這句是問旅遊小知識、 還是要我下單」都會誠實地路由到對的 agent。
Luna: 你看,又回到誠實了。
因為今天整條線就是這一件事。 好,收尾照慣例,先結算大局,再結算風險。 大局這樣看:自駕上路的第一天,最大的成就不是又修好幾隻蟲,
是三端第一次把「同一套錯誤語言」講齊了——後端定義、網頁跟 iOS 同一天接完; 再加上旅程相機相簿整包落地、App Store 送審的安全底線補上, 第四十八版已經在路上。
Luna: 那風險清單呢? 昨天你才換了三張新票進來。
今天沒有畢業生,而且新火是跨端契約燒起來的。 最急的一張:機票的細節,iOS 去打一組接口拿、網頁卻從行程內容直接讀,
兩邊對同一張機票的理解正在分裂,這種分裂在 demo 現場最容易當眾穿幫。 還有一張,引擎產出的機票在資料上被標成「一個普通的點」、
航段是零,網頁就把它畫成一般景點,看起來根本不像機票。 加上分頁那條——列表接口的頁碼,一邊從零算、一邊從一算, 語意在打架,昨天先補了頁數資訊上線,但兩端真的對齊還沒驗完。
Luna: 所以老火剛滅,跨端的新火又起。 這就是 demo 前兩天的日常。
就是這樣。 但今天我心裡是穩的:自駕上路第一天,這台車學會了對使用者、 對旅伴、對即將到來的陌生人,都把話講清楚。
接下來兩天只剩一個問題——那條全綠的鏈路,加上今天補的相機相簿跟送審門票, 能不能在最後這兩天裡,從「我們自己跑得動」,變成「敢放心地給一個陌生人用」?
demo,剩兩天。
明天同一時間,PickTrip 產品建造筆記,每日更新。
Luna: 掰掰!