๐ฒ sip Second-Round Test Report โ
Coverage period: 2026-08-11 ~ 2026-08-12 Tested versions: v1.0 โ v1.1 โ v1.1.4 (incl. cluster refactor) Method: automated CLI + manual TUI + fault injection + stress testing + security penetration Note: this report consolidates all test processes and re-verification data since the second round โ read it straight through, no need to consult the intermediate files
Table of Contents โ
- Test Overview & Timeline
- First Round Review (v1.0, 7.1 pts)
- v1.1 New-Feature Testing (dedup/policy/insights/onboarding/telemetry)
- Security Re-test (7 vulnerabilities โ 6 fixed)
- Tavern Jokes (creative edge-case mining)
- Stress Testing (dedup/policy/telemetry/Sumenia)
- Supplementary Tier (progress/health/WAL/OPML/export)
- Second Round Score (7.6 pts)
- v1.1.4 Re-test (discovering the cap & bidirectional pairing)
- Cluster Refactor Verification (root-curing the output explosion)
- grep Wildcard Problem & Fix
- Large-Change Regression (+696 lines, zero regression)
- Final Issue List
- Final Score
- Appendix: Test Sites & Data
1. Test Overview & Timeline โ
| Phase | Time | Version | Core Output |
|---|---|---|---|
| First round, full features | 08-11 | v1.0 | 51 tests, score 7.1 |
| v1.1 new features | 08-12 AM | v1.1 | 28 tests, 23 pass / 5 fail |
| Security re-test | 08-12 | v1.2 | 7 vulns, 6 fixed |
| Tavern jokes | 08-12 | v1.2 | 30 items, 4 defects unearthed |
| Stress test | 08-12 | v1.2 | performance curves + concurrency |
| Sumenia stress | 08-12 | v1.2 | 463 events / concurrency |
| v1.1.4 re-test | 08-12 | v1.1.4 | cap-2000 discovered |
| Cluster refactor | 08-12 | v1.1.4 | output explosion root-cured |
| Large-change regression | 08-12 | v1.1.4 (18:52) | +696 lines, zero regression |
Cumulative tests: ~230+ items | Defects found: ~25 | Fixed & verified: 22
2. First Round Review (v1.0) โ
51 functional tests, score 7.1/10.
| Dimension | Score |
|---|---|
| Feature completeness | 8.5 |
| Stability | 6.0 (bare main-DB crash, O(nยฒ)) |
| Performance | 7.0 |
| Security | 6.5 |
| Documentation | 7.5 |
| AI friendliness | 6.5 |
Main defects: -l N O(nยฒ) hang, rss.db corruption bare crash, SSRF, terminal injection, exit-code contract chaos, --init crash on non-TTY.
3. v1.1 New-Feature Testing โ
3.1 Cross-source dedup --dedup (pair form, at the time) โ
- Detection boundary: constructed 100% / 80% / 71% / 61% four similarity tiers and measured them โ only paragraph-level overlap โฅ 80% is reported
- Detection:
--dedup scan12 groups (11 ร 100% + 1 ร 80%) - Hide/undo: hide/list/undo basically normal
- โ ๏ธ Failures:
- Anti-resurrection failed (delete + re-fetch + re-import)
-l Nlist did not filter dedup- scan candidates did not shrink after hiding
3.2 Source Policy --policy โ
all passed โ
5 actions (tag/keep/lower_frequency/archive/unsubscribe) + remove + boundary exit codes; createdBy is always user.
3.3 Insights โ all passed โ
status+reasons refactor; no health/action/basis, no value judgments.
3.4 Onboarding โ
- CLI โ (list/category/add/skip)
- TUI command line โ not wired (fixed later)
3.5 Telemetry โ all passed โ
consent_change / feed_change / search (incl. full query terms) / dedup events all present.
4. Security Re-test (7 vulnerabilities โ 6 fixed) โ
| # | Vulnerability | Re-test result | Key evidence |
|---|---|---|---|
| 1 | SSRF (full-text fetch reaching intranet) | โ Fixed | loopback/private/CGNAT/cloud-metadata all blocked; server logs show zero intranet requests |
| 2 | Terminal injection (ESC control chars) | โ Fixed | cat -v confirms ESC fully stripped |
| 3 | javascript:/file: links | โ ๏ธ Partial | TUI open is blocked; exported .md still keeps the text |
| 4 | rss.db corruption bare crash | โ Fixed | scene preserved as .corrupt + auto-rebuild |
| 5 | --init non-TTY crash | โ Fixed | ReadKey exception degrades to ReadLine |
| 6 | Exit-code contract | โ Fixed | 6 commands all comply (0/1/3) |
| 7 | grep wildcards | โ Not fixed (fixed later) | see Section 11 |
Security score: 6.5 โ 8.5
5. Tavern Jokes (30 edge-case stunts) โ
Grand prize: dedup self-hug family pack
hide 924 924 โ hidden 924 (keeping 924) โ hiding itself
hide 924 925 + hide 925 924 โ ring hide โ canonical is itself hiddenRunner-up: hide breaks semantics
hide 931(Rust article) 1(hot-soup AI article) โ hidden 931 (keeping 1) โ unrelated articles acceptedBronze: policy says one thing, does another
lower_frequency 3x/day โ invalid schedule but still written to policyLine comedy: exit-code hopping, -L==-l, -d "not a url" auto-completed to https://not a url, etc.
4 real defects distilled: hide without validation, invalid schedule residue, -l not filtering dedup, self-hug stacking.
6. Stress Testing โ
6.1 dedup scan complexity (pair era) โ
| Data volume | Time | Conclusion |
|---|---|---|
| 1500 articles | 1.2s | fast |
| 6500 articles | 14.3s | O(nยฒ) obvious |
| 4945 real duplicates | 9.7s + 503k pairs + 105MB | output explosion |
6.2 Batch operations โ
- hide ร100: 48s (0.48s each, dominated by startup overhead)
- undo ร20: 10.3s
- policy ร15: instant
-l27 feeds: 541ms
6.3 Concurrency โ
- 5 concurrent reads / 4 concurrent writes / 8-process mix: all succeeded, DB intact
- WAL crash recovery: DB intact after kill -9
6.4 Sumenia stress (telemetry) โ
- 463 events: show 0.5s / export 0.6s / insights 0.6s
- Event mix: search 304 / dedup 132 / feed_change 19 / consent_change 1
- 4~8 concurrent reads/writes all safe
7. Supplementary Tier โ
| Test item | Result |
|---|---|
| Reading-progress tolerance (invalid/negative/out-of-range/400KB) | โ no crashes |
| Feed health (failure accumulation โ success reset) | โ FailCount 4โ0 |
| SQLite WAL crash recovery | โ intact after kill |
| sidecar timing defect | โ confirmed fixed |
| OPML round-trip idempotence | โ |
--likes --json / --lang variants | โ |
| Large-feed export 839 articles | โ 0.88s |
8. Second Round Score โ
7.6/10 (A-), +0.5 over round one.
| Dimension | v1.0 | v1.2 | Change |
|---|---|---|---|
| Features | 8.5 | 8.0 | -0.5 |
| Stability | 6.0 | 7.5 | +1.5 |
| Performance | 7.0 | 6.5 | -0.5 |
| Security | 6.5 | 8.5 | +2.0 |
| Documentation | 7.5 | 7.5 | flat |
| AI friendliness | 6.5 | 7.0 | +0.5 |
9. v1.1.4 Re-test (key turning point) โ
9.1 Eight-defect re-test โ
| # | Defect | Result |
|---|---|---|
| 1 | Anti-resurrection | โ Fixed (interception + controlled experiment) |
| 2 | -l N filters dedup | โ Fixed |
| 3 | scan performance/explosion | โ ๏ธ Partial (see below) |
| 4 | hide semantic validation | โ Fixed (self-hug / unrelated both blocked) |
| 5 | lower_frequency invalid schedule | โ Fixed |
| 6 | grep wildcards | โ (fixed later, see 11) |
| 7 | TUI telemetry empty command | โ Fixed |
| 8 | orphan rules after feed removal | โ Fixed |
9.2 Major discovery: cap 2000 + bidirectional-pairing bug โ
Decisive experiment (2 feeds ร 30 fully identical articles):
| Metric | Theory | Actual |
|---|---|---|
| Unique duplicate pairs | 900 | 1800 (doubled) |
| Symmetric reverse pairs | 0 | 1800 (all of them) |
Conclusion:
FindNearDuplicateshas a silentMaxCandidates = 2000truncation (preventing output explosion)- Under the hood every cross-feed pair was computed twice (bidirectional traversal) โ half the cap budget wasted on symmetric duplicates
- GitHub main-branch source is one-way
i<j, the local exe is bidirectional โ exe and source out of sync (wrong version copied)
10. Cluster Refactor Verification (root-cause fix) โ
Pair detection was changed to cluster detection:
Found 1 duplicate cluster (paragraph overlap โฅ 80%):
Cluster 60 articles ยท overlap โฅ 100% ยท representative [18818]
members: 18819, 18820, ...
keep the representative, hide the rest: sip --dedup hide-cluster 1881810.1 Effect comparison โ
| Scenario | Old (pair) | New (cluster) |
|---|---|---|
| 30ร30 fully identical | 900 pairs (1800 with bidirectional bug) | 1 cluster (60 articles) |
| 101 fully identical | output explosion (tens of thousands of pairs) | 1 cluster ยท 357 bytes ยท 765ms |
| Output cap | 2000 pairs silently truncated | no truncation |
| Hide operation | hide pair by pair | hide-cluster hides the whole cluster in one shot |
10.2 Full-chain verification โ
- scan cluster form โ (10 pairs โ 5 clusters)
- hide-cluster โ (3-article cluster โ hide 2, keep 1)
- boundaries โ (repeat hide / non-representative / nonexistent โ all correctly rejected)
- list/undo โ (every member has an independent undo key)
- anti-resurrection โ (still intercepted in cluster mode)
--todayinteraction โ ("N groups possibly the same article" works)
10.3 JSON structure
{ "clusters": [{ "size": 60, "representativeId": 18818,
"title": "...", "source": "...", "minOverlap": 100,
"members": [18818, 18819, ...] }] }11. grep Wildcard Problem & Fix โ
11.1 Symptom โ
--grep "%" โ [1] article (0 occurrences) โ hit but count 0
--grep "_" โ [14] article (0 occurrences) โ same11.2 Root cause (% and _ share the same problem) โ
- SQL matching: the keyword is escaped to a literal; LIKE matches the whole Content original (incl. HTML attributes)
- Snippet counting:
ExtractGrepSnippetsuses the raw keyword and doesIndexOfover the visible text afterStripHtml - Mismatch:
%/_all live in HTML attributes (URL-encoded, bilibili links); after tag stripping, visible text is 0
Measured data:
| Article | Char | Content total | In attributes | Visible text |
|---|---|---|---|---|
| article 1 | % | 36 | yes | 0 |
| article 14 | _ | 2 | yes | 0 |
| article 49 | _ | 1 | no (huggingface_hub) | 1 โ |
11.3 Fix (Plan A) โ
When there's a hit but visible count is 0, hint:
[1] article (0 occurrences) (only matched links/attributes, not counted in visible text)Measured: %/_ hints correct; normal hits (huggingface_hub 1ร) unaffected.
12. Large-Change Regression (+696 lines) โ
After RssReader.cs +696 lines (cluster refactor + grep hint + all defect fixes + --version build time), systematic regression:
| Category | Result |
|---|---|
| Base regression script, 19 items | โ all pass |
| dedup cluster full chain + boundaries | โ |
| exit-code contract, 6 items | โ |
| Security (ESC/SSRF/init) | โ zero regression |
| Core features (export/versions/diff/update/like/schedule/OPML) | โ |
| Version tracking (simulated v2) | โ |
| Large export 936 articles | โ 1s |
Conclusion: +696 lines, zero regression.
13. Final Issue List โ
๐ข Low severity (2) โ
| # | Issue | Note |
|---|---|---|
| 1 | --export keeps malicious protocol link text | TUI opening is blocked; javascript: etc. still in exported .md (only triggers in external renderers) |
| 2 | dedup.json occasional loss | not reproduced since the cluster refactor; suspected legacy leftover, watching |
๐จ UX details (3) โ
| # | Issue | Note |
|---|---|---|
| 3 | i view (hidden list) has no x | only undo, no delete |
| 4 | home content still centered | left-align fix didn't cover the start screen |
| 5 | s and Enter panel redundancy | overlapping design entries |
โ Clarified โ
- File-in-use = user's manual operation, not a program issue (struck out)
- The remaining 22 defects all fixed and verified
14. Final Score โ
| Dimension | v1.0 | v1.2 | v1.1.4 (final) | Note |
|---|---|---|---|---|
| Feature completeness | 8.5 | 8.0 | 8.8 | cluster detection live, features complete |
| Stability | 6.0 | 7.5 | 8.5 | output explosion root-cured, anti-resurrection fixed |
| Performance | 7.0 | 6.5 | 8.0 | no O(nยฒ) output problem after clustering |
| Security | 6.5 | 8.5 | 8.5 | stable |
| Documentation | 7.5 | 7.5 | 8.0 | README/Wiki polished |
| AI friendliness | 6.5 | 7.0 | 8.0 | init usable, exit codes all correct, TUI completed |
Total: 8.4 / 10 (A-, excellent)
8.8ร0.25 + 8.5ร0.20 + 8.0ร0.15 + 8.5ร0.20 + 8.0ร0.10 + 8.0ร0.10
= 2.20 + 1.70 + 1.20 + 1.70 + 0.80 + 0.80
= 8.40Score evolution โ
v1.0 7.1 (good features, security/stability debt)
v1.2 7.6 (6 security vulns fixed, entered the trustable zone)
v1.1.4 8.4 (cluster refactor root-cures the output explosion, +696 lines zero regression)In one sentence: from "usable" (7.1) to "trustable" (8.4), three iterations closed all three short boards โ security, stability, performance โ leaving only low-severity UX details.
15. Appendix: Test Sites & Data โ
Current environment โ
- 4 real feeds (hot-soup teahouse/HF/World/hin.cool), 923 articles,
integrity ok - All test feeds/temp files/dedup rules cleaned up
- Pending commit:
RssReader.cs +696,Tui.cs +17, 3 language files, READMEร2, sip.csproj, --version
Test data notes โ
- Plagiarism test feeds: 5 (dup_a~h.xml, 100%/80%/71%/61% similarity gradient)
- Stress constructions: up to 7445 articles / 27 feeds
- Security tests: SSRF server, entity bombs, XXE, terminal-injection payloads
- All tests left the environment clean
Reference files โ
sip-regression.sh(19-item quick regression script, anyone can run)- sip Comprehensive Test Report (2026-08-11) (first round, 51 functional tests)
sip-v1.1-ๆต่ฏๆฅๅ-2026-08-12.md(v1.1 new features)sip-ๅฎๅ จๅคๆตๆฅๅ-2026-08-12.md(security)sip-็ฌฌไบ่ฝฎๆๆๆฑๆปไธ่ฏๅ-2026-08-12.md(second round)
Report generated: 2026-08-12 | all conclusions based on reproduced measurements + source-line evidence | version sip v1.1.4 (built 2026-08-12 18:52)