Skip to content

๐Ÿฒ sip Comprehensive Test Report โ€‹

Test date: 2026-08-11 ๏ฝœ Test subject: sip-win-x64.exe (sip RSS reader v. single-file build) Method: full CLI command coverage + source review + fault injection + stress testing + security penetration


1. Test Overview โ€‹

1.1 Test Environment โ€‹

ItemDescription
ProgramE:\test\sip-win-x64.exe (.NET 10 single-file publish)
Data directoryE:\test\readwithhotsoup\ (SQLite + full-text cache + language files)
AI configEmbedding: baai/bge-m3 @ https://open.cherryin.net/v1; LLM: deepseek-v4-flash
FeedsHot Soup Teahouse (15) / Hugging Face Blog (838) / CGTN World (49) / Life Notes of Collapse (20), 922 articles total
Method51 functional tests + 30+ boundary/exception injections + security penetration + data volume stress + concurrency tests

1.2 Test Method โ€‹

  • Everything goes through the CLI (--ignoresafeannouncement + --json structured output), matching the real usage path of an AI agent
  • Boundary/exception tests constructed real attack payloads: malicious RSS, intranet loopback servers, hanging servers, entity bombs, corrupt databases, 10k-article giant feeds
  • Key findings all backed by source line numbers

2. Test Statistics Overview โ€‹

CategoryTestsPassedDefects found
Core functionality21201
Boundary/exception16133
Security penetration1064
Stress testing1293
Total594811

Defect distribution: Critical 4 ๏ฝœ Medium 5 ๏ฝœ Minor 2


3. Core Functionality Test Results โ€‹

3.1 Feed Management โœ… โ€‹

Test itemCommandResult
List feeds-lโœ… 4 feeds normal, with health status
Add a feed-d <url>โœ… all 4 feeds stored (HF 838 / CGTN 49 / hin.cool 20)
Duplicate feed dedupduplicate -d on existingโœ… recognizes "already exists", skips without duplicating
Update a feed-u <id>โœ… old/new comparison correct, "skip update" when unchanged
Article list-l <id>โœ… dual-format IDs [index/real ID] correct
Delete feed (with data cleanup)-r <id> --yesโœ… Items/vectors/full-text cache all cleaned
Archive/unarchive-a / -unaโœ… title timestamp round-trip correct

3.2 Retrieval โœ… โ€‹

Test itemResult
Full-text search --grep (no AI dependency)โœ… exact hits, outputs "ID + title + hit count + snippet"
Semantic search --search (bge-m3)โœ… hits for both Chinese/English queries, similarity 0.5โ€“0.7
Search relevanceโœ… "NVIDIA voice agent latency" accurately hit the Magpie TTS article (0.663)
Read full text --show <id> --jsonโš ๏ธ only outputs database Content, doesn't merge full-text cache (see issue #6)
Full-text fetch --fulltextโœ… fetch succeeds, file cache, repeat fetch uses cache

3.3 Signature Feature: Version Tracking / Diff โœ… โ€‹

Test itemResult
Version mark โœŽโœ… articles with history correctly marked
--versionsโœ… v2 current + v1 archived, with timestamps
--diffโœ… structured change output ({type, before, after})
Read old versionโœ… --show <old-version-id> --json can read any historical version

3.4 AI Capabilities โ€‹

Test itemResult
Summary generation --summaryโœ… DeepSeek call succeeded, Chinese summary quality good
Summary cache reuseโœ… first 2668ms โ†’ second 499ms, LLM called only once
Semantic search - title vectorโœ… good hits
Semantic search - full-text vector (sidecar)โš ๏ธ threshold trap exists (see issue #8)
--init non-TTYโŒ crashes directly (see issue #5)

3.5 Other Features โœ… โ€‹

Test itemResult
OPML exportโ†’importโ†’re-exportโœ… idempotent, import correctly skips existing feeds
Schedule setting & due calculationโœ… "30 min ยท last X ago ยท next Y later" computed correctly
--sync due updateโœ… updates only due feeds, correctly no-ops when nothing is due
--today daily listโœ… rule-based selection of 5, with reasons and duration
Language switch --lang en-USโœ… UI switches fully
--like / --likesโœ… user like + AI mark (๐Ÿค–) normal
telemetry full flowโœ… enable/status/show/export normal, graceful at 0 events

4. Defect List (by severity) โ€‹

๐Ÿ”ด High โ€‹

#DefectRepro pathRoot cause (source)Impact
1-l <feed> list O(nยฒ) performance landminelist freezes after 2000+ articles in a single feed: 1000 articles 1.2s โ†’ 2000 articles 16.9s โ†’ 5000 articles >30s โ†’ 10000 articles >60sListArticlesFromDb: runs 3 Guid-related subqueries (COUNT/MAX) per article, full-table scan without indexany single feed over ~1500 articles unusable; real large blog feeds trigger it
2Main database corruption no fault tolerancecorrupting rss.db then any command โ†’ Unhandled exception: database disk image is malformed crashrss.db opens without integrity check (telemetry.db has full self-healing, the main DB doesn't)user gets no warning on data corruption, crashes directly
3SSRF: malicious RSS can probe/fetch intranetcrafted RSS with link to http://127.0.0.1:18999/secret โ†’ --fulltext โ†’ server logs confirm the request, intranet data fetched into cacheFetchAndExtract has no protocol/intranet whitelist validation on article linkscan probe local services, intranet hosts, cloud metadata (169.254.169.254)
4Terminal injection: malicious content controls the terminalarticle injects \x1b ESC bytes โ†’ --grep output passes through: ^[[2J (clear screen), ^[]0; (change title), ^[[31m (change color)EscapeMd only escapes \ * # [ ] |, doesn't handle ESC control charsinteractive terminals can be spoofed/screen-cleared-phished; AI/piped scenarios immune

๐ŸŸก Medium โ€‹

#DefectDescription
5--init crashes on non-TTYReadSecretโ†’Console.ReadKey throws InvalidOperationException without a console. API keys can only be entered in a human terminal; AI agents can't complete AI config โ€” conflicts with the "AI friendly" positioning
6--show <id> --json doesn't merge full-text cachethe main path for AI to read full text only outputs database Content; for body-less sources like HF, AI gets empty content and must --fulltext then --export/read via TUI. SKILL.md wording is misleading
7Exit-code contract inconsistent--show 0, --diff 999999, --export 99999, --summary 99999, --frobnicate (unknown command) error but exit code all 0; only --like 99999 correctly returns 3. Part of the README "structured exit codes" promise fails
8Full-text vector threshold trapsidecar full-text vector hits score 0.1โ€“0.2 lower than title vectors (measured 0.44 vs 0.66); default threshold 0.5 tuned on title vectors makes "concepts unique to the body" unsearchable. The doc threshold table doesn't distinguish the two vector types
9Full-text vector generation timing defectfeeds that did --fulltext before --index: already-fetched full text skipped sidecar generation because "feed not indexed"; re-running --fulltext later short-circuits via cache and never backfills, only --purge-fulltext re-fetch

๐ŸŸข Low โ€‹

#DefectDescription
10--grep wildcards not escaped--grep "%" / --grep "_" match all articles yet report "0 occurrences" (SQL LIKE wildcards unescaped)
11--export-opml bad-path crashDirectoryNotFoundException unhandled, throws directly (one of the program's only bare-crash paths)
โ€”ai_config.json endpoint missing protocol headerconfiguring open.cherryin.net/v1 crashes search (fixed manually by user); the program should tolerate and auto-complete
โ€”Consent-phrase piped input encoding mismatchChinese consent phrase compared via piped input (GBK console) fails; agents must use --yes

5. Security Assessment โ€‹

5.1 Well-protected โœ… โ€‹

Attack surfaceTest payloadResult
SQL injection' OR 1=1 -- / '; DROP TABLE Items;--โœ… parameterized queries, all ineffective
XML entity bombBillion Laughs (9-level nesting โ†’ 10โน chars)โœ… intercepted by MaxCharactersFromEntities
XXE external entityfile:///C:/Windows/win.iniโœ… parsed as empty string, local files unreadable
Malformed XMLbinary garbage / empty file / 5MB unclosed tagsโœ… all three error gracefully, zero crashes
API key storagesource reviewโœ… Windows Credential Manager, never on disk
telemetry privacysource audit of all network call pointsโœ… no upload logic, purely local
Local file read-d file:///C:/Windows/win.iniโœ… accidentally blocked by the "protocol completion" logic

5.2 Verified Vulnerabilities โš ๏ธ โ€‹

VulnerabilitySeverityVerified evidence
SSRF (full-text fetch without protocol/intranet validation)๐Ÿ”ด highmalicious RSS link โ†’ intranet /secret requested, TOP SECRET INTERNAL DATA fetched into cache
Terminal injection (ESC control char passthrough)๐Ÿ”ด high--grep output contains real ESC bytes ^[[2J/^[]0;
javascript: link injection๐ŸŸก medium<script>/onerror stripped, but [click me](javascript:alert%281%29) preserved; TUI link navigation opens via Process.Start directly, no protocol whitelist

6. Stress Testing โ€‹

6.1 Performance baseline (922 articles, normal scale) โ€‹

OperationTime
-l list0.48s
--grep full-text search0.49s
10k-article RSS download & parse5.8s

6.2 O(nยฒ) curve (-l <single feed> time vs article count) โ€‹

500 articles   0.8s     โ† normal
1000 articles  1.2s     โ† near the tipping point
2000 articles  16.9s    โ† clear degradation
5000 articles  >30s     โ† timeout
10000 articles >60s     โ† frozen

6.3 Concurrency & resilience โ€‹

TestResult
5 processes concurrent readโœ… all succeed, DB intact
4 feeds concurrent write updateโœ… all succeed, integrity ok
Hanging server (no response 120s)โœ… exact 25.6s timeout + FETCH_FAILED
telemetry.db concurrent corruptionโœ… auto-rebuilt, rss.db intact throughout
Language file deletedโœ… embedded copy auto-restored, doesn't overwrite customizations
100k-char giant titleโœ… fully rendered without truncation (grep output 100KB)

7. Scoring โ€‹

7.1 Dimension scoring (out of 10) โ€‹

DimensionWeightScoreBasis
Functional completeness25%8.5full-featured CLI + JSON output + exit-code design; signature features (version tracking/Diff/OPML/scheduling) solid; only a few roadmap items unimplemented
Stability/robustness20%6.0most boundaries handled gracefully (timeout/malformed XML/concurrency/self-healing), but main-DB corruption bare crash, -l O(nยฒ) freeze, and export-opml bare crash cost heavily
Performance15%7.0extremely fast at normal scale (<0.5s), efficient download/parse; O(nยฒ) landmine + cross-feed search full scan are the weak points
Security20%6.5SQL injection/XXE/entity bomb/privacy all defended (solid base); but three real vulnerabilities (SSRF + terminal injection + javascript: links) unpatched
Documentation quality10%7.5SKILL.md high quality and clearly structured; but doesn't cover the pitfalls found in testing (timing, threshold, non-TTY, wildcards)
AI/Agent friendly10%6.5good JSON + exit-code design philosophy; but --init non-TTY crash, inconsistent exit-code contract, --show not merging full text are real obstacles for agents

7.2 Total score โ€‹

8.5ร—0.25 + 6.0ร—0.20 + 7.0ร—0.15 + 6.5ร—0.20 + 7.5ร—0.10 + 6.5ร—0.10
= 2.13 + 1.20 + 1.05 + 1.30 + 0.75 + 0.65
= 7.08 / 10

7.3 Overall rating โ€‹

RatingDescription
Total: 7.1 / 10 (B+ / Good)A feature-rich, thoughtfully designed RSS reader (excellent concepts: local data, version-as-truth, AI whitelist). As a personal daily tool it's highly complete; but given its positioning as "a data source for AI agents", robustness and security boundaries still have clear debts โ€” not recommended for blind full indexing of huge feeds, nor for full-text fetching of arbitrary RSS sources on untrusted networks

8. Fix Priority Recommendations โ€‹

PriorityItemEffortSolution
P0-l N O(nยฒ)smalladd index on Items.Guid + convert subqueries to JOIN/window functions
P0Terminal injectionper-lineappend \x1b (and \a) filtering to EscapeMd
P1Main-DB corruption tolerancesmallintegrity check on startup/open modeled on telemetry + preserve-scene notice
P1SSRFmediumadd http/https protocol whitelist to FetchAndExtract + optional intranet address interception
P1--init non-TTYsmallmake ReadSecret catch no-console exceptions and degrade to ReadLine
P1Exit-code contractsmallunify SetExit(code) semantics across all error paths
P2--show --json merges full textsmalladd fulltext field to JSON output (when cached)
P2--grep wildcard escapeper-lineescape %/_ in SQL LIKE params
P2javascript: protocol whitelistsmallvalidate http/https before Process.Start

9. Appendix โ€‹

9.1 Positive designs worth noting from testing โ€‹

  1. "Full-text fetch consent phrase" โ€” forces explicit user consent before fetching a source site, respects copyright, rare in the industry
  2. telemetry self-healing โ€” corrupt โ†’ auto-rebuild and never touches the main DB; README promise verified by testing
  3. Version is truth โ€” Guid grouping + diff, full traceability of information evolution (Guid is actually the article URL)
  4. Summary cache reuse โ€” doesn't burn tokens repeatedly, verified by testing
  5. Malformed input handling โ€” binary/empty/overlong/entity bomb all gracefully rejected, above most similar tools

9.2 Test residue notes โ€‹

  • All test data cleaned up (stress feeds/malicious feeds/temp files), DB restored to 922 articles / integrity ok
  • Residue: feed 1 schedule restored to manual; 1 AI-mark record retained in --like
  • During testing "Hot Soup Teahouse" gained 1 article from a real RSS update (merged back after the 922-article count)

Report generated: 2026-08-11 ๏ฝœ All conclusions based on reproduction + source line-number evidence

ๆœ€่ฟ‘ๆ›ดๆ–ฐ

Released under the GNU General Public License v3.0 (GPL-3.0)