initial: blog-app snapshot
This commit is contained in:
43
.review-tmp/review-verdict.md
Normal file
43
.review-tmp/review-verdict.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# REVIEW VERDICT — "AI Agent 升级迭代日报" feature
|
||||
|
||||
**Reviewer:** independent review agent (did NOT build the feature)
|
||||
**Date:** 2026-08-16 17:27–18:10 CST
|
||||
**Evidence:** see `./.review-tmp/review-evidence.log`
|
||||
|
||||
## Overall Verdict: **PASS**
|
||||
|
||||
All 7 acceptance items verified with real commands. No blocking defects found.
|
||||
|
||||
---
|
||||
|
||||
## Item-by-item
|
||||
|
||||
| # | Item | Verdict | Evidence (one line) |
|
||||
|---|------|---------|---------------------|
|
||||
| 1 | Cron install script exists & idempotent | **PASS** | Ran `install_watchdog_cron.sh` twice → both "already installed, skipping", exit 0, `crontab -l` diff before/after = NO DIFF; `0 9 * * *` entry present; all 13 pre-existing crontab entries survived |
|
||||
| 2 | Data sources ≥5 with real counts | **PASS** | My run (17:50:40): `sources_failed=[]`, counts GitHub Releases 6/6, commits 6/6, npm 5/6, releases.atom 6/6, Exa 6/6. (Live report after POST-triggered run: atom 0/6 from github.com flap — source still listed with count + reasons, other 4 sources 6/6, acceptable per criteria) |
|
||||
| 3 | 6 projects with version/date/中文摘要/Breaking/★ | **PASS** | 6 project sections; each has Latest Release + 发布日期 + real LLM 中文摘要 + Breaking Changes marker + ★ 相关性; 0 "LLM 未集成/总结失败" markers; oh-my-openagent has substantive breaking change (v5.0.0 major + telemetry removal) |
|
||||
| 4 | Real run by reviewer | **PASS** | `HOME=/home/yi /usr/bin/python3 scripts/daily_watchdog.py` → **exit 0**, all 6 projects collected with no 403s, report saved 17:50:40, DB row `created_at=2026-08-16T17:50:40` (fresh). Waited for rate-limit reset (17:39:28) + 30s buffer as instructed |
|
||||
| 5 | Flask | **PASS** | deploy.sh exit 0; GET /watchdog 200 + 升级迭代日报 + 2026-08-16; POST /watchdog/run → 302 (trigger accepted, run spawned); immediate 2nd POST → **429 操作太频繁**; LAN `192.168.2.25:8090/watchdog` → 200; regression / /projects /search /analyze /api/stats all 200; after POST-triggered run finished, GET /watchdog still 200; nav has 日报 |
|
||||
| 6 | No new pip deps | **PASS** | requirements.txt = `flask>=3.0`, `requests>=2.28`; imports of both scripts = stdlib + flask + requests only |
|
||||
| 7 | 禁止项 audit | **PASS** | fetch_data.py mtime 08:35:50 (unchanged since 08:35); projects.db mtime 08:36:08 (untouched); no litellm config edits; app.py changes additive (all existing routes 200) |
|
||||
|
||||
---
|
||||
|
||||
## Residual risks (non-blocking)
|
||||
|
||||
1. **github.com releases.atom flakiness** — the POST-triggered run (18:08:42) got atom 0/6 due to repeated feed timeouts (2 attempts × ~55s each per project, slowing runs to ~15 min). Script degrades gracefully (source listed with count + reasons), but a fully atom-less report is possible during flaps.
|
||||
2. **Unauthenticated GitHub API rate limit sensitivity** — 60 req/hr shared across all processes on this host. The build phase exhausted it (~17:25); the script handles 403s gracefully but reports degrade (partial sources) when exhausted. No token/retry-with-backoff for the API path.
|
||||
3. **No 9:30 self-heal cron entry** — script supports `--fix-if-missing` but `install_watchdog_cron.sh` only installs the 9:00 entry; a failed 9:00 run won't self-heal at 9:30.
|
||||
4. **app.secret_key dev default** — flash/session signing uses a dev default; fine for LAN, not for public exposure.
|
||||
5. **Installer template vs installed entry mismatch (cosmetic)** — script's `ENTRY` uses `cd ... && python3 scripts/daily_watchdog.py >> daily-agent-watchdog.log`; the installed entry uses absolute path + `daily-watchdog-cron.log`. Functionally equivalent; the `grep -F "daily_watchdog.py"` idempotency check matches both.
|
||||
6. **429 semantics vs acceptance wording** — acceptance expected "429 操作太频繁" after ~70s; implementation's 429 gate is a 60s cooldown, and after it expires the single-flight check rejects a duplicate trigger with 302 + flash "已在运行中". Both mechanisms prevent duplicate runs; the literal status code differs after 70s.
|
||||
|
||||
---
|
||||
|
||||
## Verification highlights
|
||||
|
||||
- Rate limit: **0 remaining** at start (reset 17:39:28) → waited → **24 remaining** at end.
|
||||
- My real run: **exit 0**, report + DB row fresh at **17:50:40**, `sources_failed=[]`.
|
||||
- Curl status codes: GET /watchdog **200**, POST trigger **302**, duplicate POST **429**, LAN **200**, regressions **200×5**.
|
||||
- No code modified during review; temp artifacts only in `./.review-tmp/` and `/tmp/opencode/`.
|
||||
Reference in New Issue
Block a user