SmartTaxer / Good-Aidea・工程交辦

四個交辦包,這一頁看懂

2026-07-08・給 George、Eason。先說結論:四個包不是四份新工作,是同一條線。最重的三件(兩個 P0+三套準則)PM 已經修好、附現成 patch——你們的工作是 review+合併,不是從頭寫。每項任務都照「為什麼要改 → 改什麼 → 怎麼改」講清楚。

01任務清單(照順序做)

每項固定三段:為什麼要改(現在的行為、會出什麼錯)→ 改什麼(目標)→ 怎麼改(做法)。驗收與檔案路徑收在「做完的定義+細節」。標籤:套現成 patch=review+合併;要動手寫=照工單實作;部署/維運=改設定或重部署。

A
現場急件——死線 7/13(一)14:00 台中期中查核
只有這三件有硬時限。建議順序:A-1 → A-2 → A-3。原始工單:7/06 包「08-急件-7月13現場.md」
A-1gcis-proxy 重新部署+查詢修正部署/維運
為什麼要改

公司名稱查詢服務現在是 404——現場輸統編查不到公司,demo 直接穿幫。而且它掛掉時會把「查無登記」寫進快取,之後修好了這些統編還是永遠查無(快取毒化);稅籍庫就算查到,也沒把公司名稱帶回來,分公司、行號只有稅籍庫才有。

改什麼

proxy 部回去;查詢改「經濟部工商庫+財政部稅籍庫」雙庫交叉;快取只記「真的查無」。

怎麼改

重新部署 Cloud Run 的 gcis-proxy;worker 的稅籍 fallback 補回 company_name/location;只有「兩庫都明確查無」才寫入 company_cache,網路錯誤一律不寫。

做完的定義+細節
做完=
  • ?tax_id=88432799 查得回公司資料
  • 分支機構統編不會誤判成「查無」
  • 服務掛掉時不寫入 company_cache
細節:SIIR工程師交辦包-20260706-稽核工單/08-急件-7月13現場.md、規格與 worker fix 在 SIIR工程師交辦包-20260702/03-公司名稱雙庫查詢與worker修正.md
A-2三套會計準則切換——review、合併、部到現場機套現成 patch
為什麼要改

SIIR 送審文件已經宣稱有這個功能(查核點 T200/G-05/G-06),7/13 現場委員會要看——正式版沒有=當場穿幫。George 之前問的「三套準則要怎麼做」就是這項。

改什麼

財報頁加準則選擇器(商業會計法/EAS/IFRS for SMEs)+準則徽章與副標,以及「跨準則差異分錄試算」分頁(現場要能看到折舊差異:商會法/EAS 24,000 vs IFRS 30,000)。

怎麼改

不用從頭寫:patch、完整 diff、規格書都在交付包 03 資料夾(前後端已做過真整合測試)。套 patch → review → 合併 → 部到現場機。demo 主秀「差異試算」分頁(報表切準則只變標示、數字不重算——這是誠實呈現層)。

做完的定義+細節
做完=
  • branch feat/accounting-standard-switch 合併並部署(base:backend 610b940/frontend 181d0dc
  • backend 測試(Unit 9+Feature 12)綠、frontend build 過
  • 現場機切準則能看到折舊差異
注意:折舊耐用年限是示例值,demo 前最好給會計師過目,要改就改 config/accounting_standards.php
細節:SmartTaxer交付包-20260707/03-三套會計準則切換/(交付摘要.md、實作契約-CONTRACT.md)
A-3RPA step7 座標版——Windows 實機跑通 step0–7要動手寫
為什麼要改

7/13 現場要展示 etax-rpa 自動申報全流程;step7(上傳)的座標版沒在現場那台機器驗過,當場點不動就難看。

改什麼

etax-rpa 的 step0 到 step7 在現場那台 Windows(BLR)完整跑通一次。

怎麼改

實機演練+座標校準,照工單 08 的步驟;若跑不通,提前回報 PM 換 demo 方案,不要拖到現場。

做完的定義+細節
做完=現場 Windows 機上 step0–step7 完整跑通一次。
細節:SIIR工程師交辦包-20260706-稽核工單/08-急件-7月13現場.md
B
P0 上線紅線——上線前必修(本週處理)
B-4、B-5 是現成 patch;B-6~B-8 是小工單,工作量不大
B-4P0-A:OCR 個資外洩(IDOR)套現成 patch
為什麼要改

檔案代理拿到 path 就給檔,不驗這個檔是不是你的——任何一個登入者把網址參數換成別人的檔名,就能列舉下載全站發票掃描圖(統編、金額、買賣方,全是 PII),直接踩個資法。

改什麼

檔案存取加「擁有者檢查」,檔名改成猜不到的。

怎麼改

patch 已寫好:用既有 ocr_logs 反查檔案屬於誰+path 白名單+新檔名改 uuid4。套 01 資料夾 patch → review → 合併。⚠️ 部署 gate 不做等於沒修:prod 要開 OCR_IAM_VERIFY_ENABLED=trueOCR_IAM_AUDIENCE(或 Cloud Run --no-allow-unauthenticated),並清掉 uploads/ 既有的舊 timestamp 檔。

做完的定義+細節
套法:backend+ocr-service 各開 branch fix/p0a-ocr-file-idorgit am 套 patch(conflict 就改 git apply --3way)。base:backend 610b940/ocr-service 1739e9e
做完=
  • A 帳號拿 B 帳號的檔案回 404
  • 新上傳檔名是 uuid4
  • backend 9 個+ocr 7 個測試綠
  • 部署 gate 已設定+舊檔已清
細節:SmartTaxer交付包-20260707/01-P0A-OCR個資外洩/00-P0驗收摘要.md
B-5P0-B:三聯式進項稅額雙重計數套現成 patch
為什麼要改

計算層用 OR 分兩桶:bill_type=input invoice_type 開頭 4010 → 進項桶;output 4011 → 銷項桶。上游 OCR 有系統性錯誤會產生「bill_type=input 但 invoice_type=40111」的自相矛盾發票——兩桶都中,同一張同時算銷項又算進項:401 銷項稅虛增、應納稅額錯,還寫進匯出的申報檔。三聯式是最主流進項憑證,幾乎每個真實用戶都踩到。

改什麼

分桶從 OR 改成互斥——一張發票只可能落一桶。

怎麼改

patch 已寫好:新函式 resolveBillDirection() 以 bill_type 為單一準據(與統計卡同口徑),bill_type 缺漏才用 invoice_type 推定;進項桶內誤帶的銷項碼 deterministic 折回 4010x;附 4 個回歸測試。套 02 資料夾 patch → review → 合併。

做完的定義+細節
套法:backend+ocr-service 開 branch fix/p0b-input-tax-double-count,套 02-P0B-三聯式雙重計數/ 的 patch。
做完=
  • 測試帳號 id=978 的發票 EF-11223344 重跑後:銷項稅=0、totalTax=進項稅
  • 統計卡與 401 表數字一致、匯出 xlsx 正確
注意:DB 裡既有誤碼資料有迴歸面,review 時看 00-P0驗收摘要.md
B-6申報 PDF/媒體檔移出 public要動手寫
為什麼要改

申報 PDF 和媒體檔放在 public 路徑——不用登入、直接打網址就能下載別人的申報資料。

改什麼

檔案移出 public,改由帶權限檢查的端點供檔。

怎麼改

檔案搬到 private disk,下載走授權 API(比對檔案擁有者才給),照工單 01 的規格。

做完的定義+細節
做完=直打 /storage/<路徑> 回 403/404;B 的 token 取 A 的檔回 403。
細節:SIIR工程師交辦包-20260706-稽核工單/01-安全-申報PDF移出public.md
B-7OCR 模型換 gemini-2.5-flash要動手寫
為什麼要改

辨識一張要 7.6 秒,用戶拍完照得乾等;現在用的模型還開著 thinking,白花時間。

改什麼

預設模型換 gemini-2.5-flash、關掉 thinking,速度進 2–3 秒。

怎麼改

ai_service.py 改預設模型+thinkingBudget:0(基本上改一行設定),改完抽 10–20 張對比,確認準度不掉。

做完的定義+細節
做完=暖態單張 <4 秒;抽 10–20 張準度持平。
細節:SIIR工程師交辦包-20260706-稽核工單/02-速度-Gemini模型換2.5flash.md
B-8Cloud Run 冷啟+改 gunicorn部署/維運
為什麼要改

沒有常駐實例,冷啟第一張要等 16.7 秒;而且 prod 還在跑 Flask 開發用 server,扛不了併發。

改什麼

服務常駐(不再冷啟)+換正式的 WSGI server。

怎麼改

Cloud Run 設 min-instances=1/cpu 2/memory 1Gi/concurrency 8;Dockerfile 從 Flask dev server 改 gunicorn。

做完的定義+細節
做完=冷啟第一張 <5 秒、5 張併發不塞。
細節:SIIR工程師交辦包-20260706-稽核工單/03-速度-CloudRun冷啟與gunicorn.md
C
金流送審整改——沒有死線,插空檔做
兩個站要申請金流(綠界/藍新/PAYUNi),送審前補齊揭露與政策頁
C-9smarttaxer:套 3 個現成 patch套現成 patch
為什麼要改

金流商審核會看隱私權、服務條款、退費政策和公司揭露——網站缺這些,送審直接退件。

改什麼

三個政策頁(隱私/條款/退費)+footer 公司揭露(含統編)。

怎麼改

3 個 patch 已寫好:frontend repo main(base 181d0dc)開 branch → git am smarttaxer-patches/*.patch → 合回 main(push 即 GitLab CI 自動部署)。改完長什麼樣,包裡有 4 張截圖可對照。半小時內能收工。

做完的定義+細節
做完=隱私/條款/退費三頁渲染正常、npm run build 過。
細節:給工程師-金流送審整改包/README.md
C-10good-aidea:四處整改(文案都寫好了,照貼)要動手寫
為什麼要改

同樣為了金流送審;而且站上法人名稱新舊混用(「offcode 離碼」vs「你的空間有限公司」),審核方會質疑收款主體是誰。

改什麼

① footer 加公司揭露(你的空間有限公司/統編 83772050/地址/電話)② 隱私政策法人名統一 ③ 新增免登入的 /refund 退費頁 ④ 服務條款帶正式法人名。

怎麼改

需求書含可直接貼上的文案(退費政策有全文)。repo 在你們手上;不方便做的話,把 GitLab 帳號 lgscvb 加 collaborator,PM 開 MR 給你們 review。

做完的定義+細節
做完=隱私/條款/退費三頁免登入可達、全站法人名一致、未登入任一頁 footer 看得到公司名+統編+地址+電話。
細節:給工程師-金流送審整改包/good-aidea-整改需求.md
D
P1/P2——A、B 清完再動
先知道有這些就好,動工前跟 PM 對一次優先序
D-11申報精靈 gate(工單 09 後半)要動手寫
為什麼要改

精靈 Step4→5 會卡死;而且沒有完成度檢查——空資料也能一路按到送出申報。

改什麼

每一步加完成度 gate、擋空資料送出,並排查 Step4→5 卡死的原因。

怎麼改

SIIR工程師交辦包-20260706-稽核工單/09-P0-稅額雙重計數與申報精靈gate.md 後半的規格逐步做。

D-12深度稽核 P1 六項(工單 10 的 P1-A~F)要動手寫
為什麼要改

稽核抓到六個上線後會出事的風險:登入零限流(可無限暴力試密碼,實質偏重、別排最後)、/ocr/* 越權、免稅進項幻影 5%(會短漏報稅)、RPA 重複送件、媒體檔沒進 GCS、精靈換期不清狀態。

改什麼

六項逐條修;順手確認 prod 的 APP_DEBUG=false

怎麼改

SIIR工程師交辦包-20260706-稽核工單/10-上線前深度稽核-資安與稅額與送件.md,每條有 file:line 與修法。

D-13發票辨識兩層管線+信任鏈+前端 UX(工單 04/05/06)要動手寫
為什麼要改

現在一張圖丟給 Gemini 一次呼叫同時猜「這是什麼票」+「所有欄位」,所有憑證共用同一份 schema——種類猜錯、欄位跟著全錯;收據、車票這種沒稅額的被套上發票語意,誤標應稅、誤發紅旗。QR code 有解,但只是辨識完的事後覆蓋,不是最上游。前端拍照入口難找、失敗沒引導。

改什麼

辨識拆兩層:第一層只判「這是哪種憑證」,第二層按種類抽欄位;信任鏈翻正成 QR > 確定性規則 > 模型;前端補拍照入口/進度/錯誤引導/稅金鎖定。

怎麼改

QR 解碼層置最上游(有 QR 直接取權威值);無 QR 讓模型做「單選題」分類,信心低丟回給使用者選;第二層按類型各走欄位集與金額語意(三聯式未稅分列、二聯式含稅內含、收據不勾稽不紅旗)。06 是 04/05/07 的共同前提,先做 06。細節:7/06 包工單 04–06。

D-14三份 OCR 後處理規格搬進正式版(7/02 包)要動手寫
為什麼要改

① 進銷項還是模型說了算——統編比對只在模型沒給值時才跑,模型錯就整筆反向(真實案例:停車費收據買方明明是本公司,Gemini 說 output 就被判銷項)。② 金額交叉驗證 ocr-service 端其實已經做了(220 張紅旗從 196 收斂到 3),但紅旗傳到 backend 入庫就被丟掉——DB 不存、前端不顯示,錯帳靜靜流進分錄和 401。③ 公司名稱查詢的 worker 修正要同步進正式版。

改什麼

① 進銷項改「統編優先」:七條決策樹當主判定(賣方統編=客戶→銷項、買方統編=客戶→進項……依序命中即止),模型排最後,每筆修正留軌跡。② 驗證紅旗活著走完全程:存進 DB、確認頁用四符號標示(✓一致/-推算/-不適用/✗不一致),讓人只盯 ✗。③ 雙庫查詢+快取修正進正式版。

怎麼改

照 7/02 包規格 01/02/03 實作。②的 ocr-service 端已完成,只剩 backend 的 PHP normalizer 保留 validation 欄位+前端顯示;③等 A-1 的 gcis-proxy 修好後做。

D-15統編救準+消 Python/PHP 雙寫(工單 07,P2)要動手寫
為什麼要改

統編檢查碼演算法有,但驗不過只丟一句 warning、錯的原值照存不修——熱感紙發票 0 被讀成 8 這種,明明救得回來。而且同一套正規化邏輯 Python(ocr-service)和 PHP(backend)各刻一份,改一邊忘另一邊,兩條路遲早算出不同結果。

改什麼

從「只會挑錯」變「會自動救回」;兩份邏輯收斂成一份。

怎麼改

OCR 易混字(0↔8、1↔7、5↔6…)窮舉候選 → 打登記庫驗證存在 → 唯一解才自動救回,多解/無解保留原值並標註;正規化以 Python 為單一事實源、PHP 只消費結果。(登記庫要用哪個資料源,先跟 PM 確認再動工。)細節:7/06 包工單 07。

02四個包是什麼關係

照時間看就懂:先開問題清單,後面的包把最重的活做成了現成解法。

7/02SIIR工程師交辦包-20260702

最早的交辦:7/13 現場急件第一次提出+三份 OCR 後處理規格。急件部分已被後面兩包細化(看本頁 A 層即可);三份規格還有效=本頁 D-14。

7/06SIIR工程師交辦包-20260706-稽核工單

上線前稽核抓到的問題清單(工單 01–10,分 P0/P1/P2/急件)。本頁 A、B、D 層的原始工單都在這包。

7/07SmartTaxer交付包-20260707 ⭐ 重點包

現成解法:PM 把最重的三件(P0-A 個資外洩、P0-B 算錯稅、三套會計準則)在本地修好並通過獨立驗收,以 git patch 交付、未 push。對應 7/06 包的工單 09、10-A 和急件 8-1——這三項不用從頭寫,套 patch → review → 合併

7/07給工程師-金流送審整改包

獨立支線,跟上面互不相依:兩個站要申請金流,送審前補公司揭露/政策頁。smarttaxer 已附現成 patch;good-aidea 要動手改四處(文案都寫好了)=本頁 C 層。

重點整理:What・Why・How・Where

What要做什麼?
A → B → C → D 四層順序做完上面 15 項任務。最重的三件(兩個 P0+三套準則)已附現成 patch,review+合併就好,不用從頭寫。
Why為什麼要做?
A 層不到位,7/13(一)14:00 台中期中查核現場會穿幫;B 層兩個 P0 是上線紅線(個資外洩踩個資法+稅額算錯人人會踩);C 層做完金流送審才不會被退件;D 層是後續體質改善。
How怎麼做、怎麼回報?
每項先看三個色塊(為什麼要改/改什麼/怎麼改),動工時看「做完的定義+細節」;做完回報 commit hash+實測證據(下面有統一格式)。你和 Eason 兩位分工自己喬,建議一人吃「A 現場急件」、一人吃「B 的 patch review/合併」。
Where東西在哪?
每項任務都標了對應檔案路徑;現成 patch 在「SmartTaxer交付包-20260707」與金流整改包的 *-patches/ 資料夾。

每項做完的回報格式(統一)

  1. 回報 commit hash實測證據(截圖/curl 回應/測試綠燈輸出),口頭「已更新」不算數。
  2. 動工前先 git statusgit pull,確認 branch 沒落後。
  3. 套 patch 遇到 conflict:先試 git apply --3way 配同資料夾的 *-完整diff.txt;再不行直接丟訊息給 PM,不要硬解。