diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 8eee58481..9d30d9a05 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,64 @@ +## 2026-06-15|AwoooP 高可見頁敏感識別與前端 bundle 防洩漏完成 + +**背景**:使用者指出 `/zh-TW/awooop/tenants` 曾在前台表格顯示個人 owner namespace、外部 org namespace、英文 repo / product slug、`blocked_waiting_*` 與 `blockers=` 類內部狀態碼。這不符合 IwoooS 現階段資安要求:公開面不得暴露可反推 owner、repo、內部 gate、內部協作文字或執行邊界的 raw identifier;UI 可視不等於 runtime 授權,且 client bundle 也不能保存敏感對照常數。 + +**完成項目**: +- `apps/web/src/lib/public-security-redaction.ts` 新增並強化 `publicProjectText`、`publicAgentText`、`publicInternalCodeSummary`,AwoooP `runs`、run detail、`approvals`、approval detail、`contracts`、`work-items` 改用公開名稱與已脫敏摘要,不再直出 `project_id`、`agent_id`、trace / trigger raw 值或 blocker join。 +- AwoooP shell 頁首由「專案 / awoooi」改為「治理範圍 / 核心營運平台」,`zh-TW` 與目前鏡像文案同步,避免高可見頁首暴露內部 project id。 +- `/zh-TW/awooop/tenants` 移除會被 Next.js build constant folding 到 client bundle 的內部狀態碼常數;公開文字只允許已知公開名稱或繁中文案 fallback。 +- `scripts/security/security-mirror-progress-guard.py` 補上前台防回歸:要求 AwoooP 高可見頁使用公開 redaction helper,禁止 raw owner namespace、外部 namespace、`blocked_waiting_*`、`blockers=`、內部協作文字、raw project / agent fallback、raw detail value、raw blocker join 與頁首 raw project id 回流。 + +**本地驗證**: +- `python3 -m py_compile scripts/security/security-mirror-progress-guard.py` 通過。 +- `python3 -m json.tool apps/web/messages/zh-TW.json` 與 `python3 -m json.tool apps/web/messages/en.json` 通過。 +- `python3 scripts/security/security-mirror-progress-guard.py --root .` → `SECURITY_MIRROR_PROGRESS_GUARD_OK`。 +- `python3 scripts/security/iwooos-owner-gate-guard.py --root .` → `IWOOOS_OWNER_GATE_GUARD_OK`。 +- `python3 scripts/security/iwooos-config-control-guard.py --root .` → `IWOOOS_CONFIG_CONTROL_GUARD_OK`。 +- `python3 scripts/security/source-control-owner-response-guard.py --root .` → `SOURCE_CONTROL_OWNER_RESPONSE_GUARD_OK`。 +- `python3 scripts/security/package-supply-chain-owner-policy-guard.py --root .` → `PACKAGE_SUPPLY_CHAIN_OWNER_POLICY_GUARD_OK`。 +- `python3 scripts/ops/doc-secrets-sanity-check.py docs .gitea apps/web/messages/zh-TW.json apps/web/messages/en.json apps/web/src/lib/public-security-redaction.ts 'apps/web/src/app/[locale]/awooop'` → `DOC_SECRET_SANITY_OK scanned_files=867`。 +- `rg` 檢查 `apps/web/src/lib/public-security-redaction.ts`、`apps/web/src/app/[locale]/awooop` 與 messages:未命中個人 owner namespace、外部 org namespace、內部阻塞狀態碼與內部協作片語。唯一合法資料欄位 `blockers={item.blockers}` 不作為可見文字輸出。 +- `git diff --check` 通過。 +- 本臨時 worktree 未跑本地 `pnpm --dir apps/web typecheck`:`apps/web/node_modules` / `tsc` 不存在;正式 CD 的 Next.js web image build 已成功通過,作為本輪 build 驗證來源。 + +**Gitea / CD**: +- Code commits: + - `9c4e754d fix(awooop): 遮罩前台專案與代理敏感識別` + - `669f07b2 fix(awooop): 移除前端遮罩敏感常數` + - `106a83e2 fix(awooop): 脫敏頁首專案範圍顯示` + - `94a9c612 fix(awooop): 移除 tenants 前端內部碼常數` +- Deploy markers: + - `8189841a chore(cd): deploy 9c4e754 [skip ci]` + - `d4ffa5d6 chore(cd): deploy 669f07b [skip ci]` + - `fbc17bd3 chore(cd): deploy 106a83e [skip ci]` + - `166497ee chore(cd): deploy 94a9c61 [skip ci]` +- Gitea Actions: + - CD runs:`3011`、`3013`、`3015`、`3017` + - code-review runs:`3012`、`3014`、`3016`、`3018` +- 最終 CD run `3017`:web image build / push 成功;ArgoCD `Synced` / `Healthy`;`awoooi-api`、`awoooi-web`、`awoooi-worker` rollout 成功;API health 通過。成功通知鏡像回報為 non-fatal failed,不影響 deploy 與 runtime health,但需後續觀察通知鏈。 + +**Production 只讀驗證(最終 deploy marker `166497ee`)**: +- `https://awoooi.wooo.work/api/v1/health` HTTP `200`,overall `healthy`;`ollama_gcp_a`、`ollama_gcp_b`、PostgreSQL、Redis、OpenClaw、SignOz 均 up。`ollama_local` 仍為 cooldown / down,保留為 runtime 殘留觀察,未做主機操作。 +- Production JS chunk 掃描: + - `/zh-TW/awooop/tenants` → `page-cd6ada327b99c26d.js`,forbidden `[]`。 + - `/zh-TW/awooop/runs` → `page-e498d712326e4bc1.js`,forbidden `[]`。 + - `/zh-TW/awooop/approvals` → `page-15eff172408e88d1.js`,forbidden `[]`。 + - `/zh-TW/awooop/contracts` → `page-14392a518017dd04.js`,forbidden `[]`。 + - `/zh-TW/awooop/work-items` → `page-e9d62d4c8985f685.js`,forbidden `[]`。 +- In-app browser desktop `1280x720` 驗證:`tenants`、`runs`、`approvals`、`contracts`、`work-items` 均 `forbiddenVisible=[]`、`forbiddenDom=[]`、`headerHasPublicScope=true`、`headerHasRawProject=false`、`horizontalOverflow=false`。 +- In-app browser mobile `390x844` 驗證:上述 5 頁均 `forbiddenVisible=[]`、`forbiddenDom=[]`、`headerHasPublicScope=true`、`headerHasRawProject=false`、`horizontalOverflow=false`。 + +**完成度與邊界**: +- AwoooP 高可見頁 raw project / agent / owner / blocker 防洩漏:`0% -> 100%`。 +- Production bundle sensitive constant scan:`0% -> 100%`(本輪涵蓋 tenants / runs / approvals / contracts / work-items)。 +- Frontend public sensitive redaction defense:`76% -> 86%`;仍需後續擴到全站所有非 AwoooP route 的 bundle-level scan。 +- AwoooP Runs route visibility:維持 `88%`,本輪只處理公開識別遮罩與 bundle 風險。 +- Work Items route action readability:`84% -> 86%`,blocker / required field 顯示已改公開摘要,但完整 UX 精簡仍待做。 +- Frontend design system / visual grammar:維持 `54%`。 +- IwoooS headline 維持 `64%`;active runtime gate 維持 `0`。 +- owner response received / accepted、target decision accepted、refs parity accepted、repository creation、refs sync、workflow modification、secret collection、runtime execution、action button、Nginx reload、host restart、firewall change、active scan 全部維持 `0 / false`。 +- 本輪未 SSH、未改主機、未重啟 Docker / Nginx、未修改 firewall / iptables、未收 secrets 明文、未執行 active scan、未切 GitHub primary、未 force push,也沒有把內部協作內容放上前端頁面。 + ## 2026-06-15|Package / Docker 供應鏈 Owner Policy Gate 完成 **背景**:前一輪已建立 Package / Docker 供應鏈 repo-only baseline,但 baseline 只回答「目前有哪些套件、lockfile、requirements、Dockerfile 與 compose image refs 需要控管」,尚未把 Python lockfile、requirements pinning、Docker digest pinning、compose image digest、CVE / license / SBOM 的 owner policy 欄位拆成可驗收的 gate。若直接從 baseline 進入套件升級、lockfile 重寫、image digest 修改或外部掃描,會違反 IwoooS 初期「只讀證據、低摩擦流程、階段性收攏」原則。