docs: inventory current application architecture

This commit is contained in:
leefer
2026-07-29 16:57:01 +08:00
parent 323c734bae
commit 110d4b3421
3 changed files with 554 additions and 0 deletions
+317
View File
@@ -0,0 +1,317 @@
{
"schema_version": 1,
"captured_from": "323c734",
"runtime": {
"http_server": "http.server.ThreadingHTTPServer",
"application_processes": 1,
"database": "SQLite WAL",
"frontend": "build-free HTML/CSS/JavaScript",
"container_port": 8765
},
"counts": {
"primary_pages": 16,
"api_exact_paths": 53,
"api_prefixes": 0,
"api_patterns": 11,
"database_tables": 34
},
"pages": [
{
"id": "sentimentCycleView",
"title": "情绪周期"
},
{
"id": "limitPool",
"title": "涨停池"
},
{
"id": "brokenView",
"title": "炸板池"
},
{
"id": "downView",
"title": "跌停板"
},
{
"id": "yesterdayView",
"title": "昨日涨停"
},
{
"id": "performanceView",
"title": "涨停表现"
},
{
"id": "ladderView",
"title": "市场天梯"
},
{
"id": "rotationView",
"title": "板块轮动"
},
{
"id": "auctionView",
"title": "集合竞价"
},
{
"id": "themeLibraryView",
"title": "题材库"
},
{
"id": "popularityView",
"title": "人气热榜"
},
{
"id": "dragonView",
"title": "龙虎榜"
},
{
"id": "screenerView",
"title": "智能选股"
},
{
"id": "mentorView",
"title": "问师"
},
{
"id": "heavenView",
"title": "问天"
},
{
"id": "reviewWorkspaceView",
"title": "我的复盘"
}
],
"api": {
"exact": [
"/api/account/birth-profile",
"/api/account/password",
"/api/account/status",
"/api/admin/membership",
"/api/admin/refresh",
"/api/admin/settings",
"/api/admin/settings/test",
"/api/alerts",
"/api/alerts/read-all",
"/api/assistant/chat",
"/api/assistant/messages",
"/api/auction",
"/api/auth/login",
"/api/auth/logout",
"/api/auth/me",
"/api/auth/register",
"/api/backfill",
"/api/chart/intraday",
"/api/dashboard",
"/api/dragon-tiger",
"/api/dragon-tiger/profiles",
"/api/health",
"/api/heaven/hexagram",
"/api/heaven/interpret",
"/api/heaven/personal",
"/api/heaven/readings",
"/api/heaven/sector-phases",
"/api/heaven/setup",
"/api/mentors/chat",
"/api/mentors/messages",
"/api/mentors/preferences",
"/api/mentors/setup",
"/api/notes",
"/api/popularity",
"/api/realtime-aggregate/health",
"/api/reasons",
"/api/rotation/history",
"/api/rotation/members",
"/api/screener/compile",
"/api/screener/run",
"/api/screener/setup",
"/api/screener/strategies",
"/api/screener/sync",
"/api/screener/tracking",
"/api/screener/tracking/refresh",
"/api/search",
"/api/search/detail",
"/api/seat-aliases",
"/api/sentiment/history",
"/api/themes",
"/api/themes/detail",
"/api/trades",
"/api/watchlist"
],
"prefixes": [],
"patterns": [
"/api/alerts/(\\d+)",
"/api/alerts/(\\d+)/read",
"/api/heaven/readings/(\\d+)",
"/api/heaven/sector-phases/(.+)",
"/api/notes/(\\d+)",
"/api/screener/strategies/(\\d+)",
"/api/screener/tracking/(\\d+)",
"/api/stock/(\\d{6})",
"/api/stock/(\\d{6})/preview",
"/api/trades/(\\d+)",
"/api/watchlist/(\\d{6})"
]
},
"database_tables": [
"users",
"user_sessions",
"user_credentials",
"user_birth_profiles",
"system_settings",
"llm_usage",
"dashboard_snapshots",
"sync_runs",
"data_snapshots",
"watchlist",
"review_notes",
"reason_overrides",
"seat_aliases",
"sector_phase_overrides",
"stock_master",
"daily_bars",
"benchmark_bars",
"daily_indicators",
"fundamental_indicators",
"moneyflow_daily",
"auction_factors",
"earnings_events",
"popularity_factors",
"lhb_institution_daily",
"screener_strategies",
"screener_runs",
"mentor_messages",
"mentor_preferences",
"wencai_saved_queries",
"strategy_tracks",
"alerts",
"trade_entries",
"assistant_messages",
"heaven_readings"
],
"background_job_methods": [
"_background_refresh_loop",
"_run_background_sync",
"_schedule_automatic_screeners",
"_schedule_ifind_event_enrichment",
"run_automatic_screeners"
],
"external_data_adapters": [
{
"provider": "tushare",
"path": "tushare_client.py",
"runtime_role": "primary deterministic market data"
},
{
"provider": "ifind",
"path": "ifind_client.py",
"runtime_role": "realtime, charts, snapshots, enrichment"
},
{
"provider": "eastmoney",
"path": "chart_data_provider.py",
"runtime_role": "display chart fallback"
},
{
"provider": "eastmoney",
"path": "realtime_aggregator.py",
"runtime_role": "isolated realtime observation"
},
{
"provider": "tencent",
"path": "realtime_aggregator.py",
"runtime_role": "index observation fallback"
}
],
"llm_entrypoints": [
{
"function": "stream_with_mentor",
"path": "mentor_agent.py"
},
{
"function": "interpret_heaven",
"path": "heaven_agent.py"
},
{
"function": "stream_review_assistant",
"path": "assistant_agent.py"
},
{
"function": "compile_strategy_with_llm",
"path": "llm_strategy.py"
},
{
"function": "test_llm_connection",
"path": "llm_strategy.py"
}
],
"css_layers": [
"/styles.css",
"/renovation.css?v=20260725-5",
"/redesign-v2.css?v=20260728-1",
"/design-system.css?v=20260728-4",
"/theme.css?v=20260728-2",
"/wentian-v2.css?v=20260728-7"
],
"code_hotspots": [
{
"path": "static/app.js",
"bytes": 449457,
"lines": 9447
},
{
"path": "static/styles.css",
"bytes": 364385,
"lines": 15549
},
{
"path": "server.py",
"bytes": 269167,
"lines": 5965
},
{
"path": "static/redesign-v2.css",
"bytes": 264960,
"lines": 8616
},
{
"path": "static/index.html",
"bytes": 133569,
"lines": 1871
},
{
"path": "database.py",
"bytes": 121468,
"lines": 2839
},
{
"path": "screener.py",
"bytes": 108535,
"lines": 2213
},
{
"path": "tushare_client.py",
"bytes": 94312,
"lines": 2175
},
{
"path": "static/renovation.css",
"bytes": 86245,
"lines": 1636
},
{
"path": "static/wentian-v2.css",
"bytes": 73222,
"lines": 1084
},
{
"path": "market_insights.py",
"bytes": 58066,
"lines": 1312
},
{
"path": "static/theme.css",
"bytes": 41279,
"lines": 1407
}
]
}
+72
View File
@@ -0,0 +1,72 @@
# Stage 02: Architecture Inventory
Date: 2026-07-29
The machine-readable inventory is `architecture-inventory.json`. Regenerate it with:
```shell
python tools/build_architecture_inventory.py
python tools/build_architecture_inventory.py --check
```
## Current Shape
- The product is a single-container modular monolith with one Python process and SQLite WAL.
- The browser is a build-free single-page application served by the same process.
- The primary navigation exposes 16 workspaces.
- The current database bootstrap defines 34 tables.
- HTTP routing and service orchestration are concentrated in `server.py`.
- Schema creation, inline migrations, and all persistence methods are concentrated in
`database.py`.
- The frontend loads six ordered CSS layers and one global application script.
- Background refresh and automatic screener work execute as daemon threads in the HTTP
process.
## Ownership Inventory
### Shared market and system data
Dashboard snapshots, synchronization runs, stock master data, daily bars, benchmark bars,
daily indicators, fundamental indicators, money flow, auction factors, earnings events,
popularity factors, institutional list data, public screener strategies, reason overrides,
seat aliases, sector phase overrides, and encrypted system settings are shared.
### User-owned data
Sessions, personal credentials, birth profiles, watchlists, review notes, custom strategies,
private screener runs, mentor messages and preferences, saved queries, tracking entries,
alerts, trades, assistant messages, and heaven readings are user-scoped. Every repository
extracted in later stages must preserve this boundary explicitly.
## Runtime Entrypoints
- HTTP and application bootstrap: `server.py`
- Persistence and migrations: `database.py`
- Access policy: `api_access.py`
- Market providers: `tushare_client.py`, `ifind_client.py`, `chart_data_provider.py`,
`realtime_aggregator.py`
- Deterministic computation: `sentiment_engine.py`, `screener.py`, `advanced_strategies.py`,
`market_insights.py`, `heaven_engine.py`
- LLM calls: `mentor_agent.py`, `heaven_agent.py`, `assistant_agent.py`, `llm_strategy.py`
- Browser shell and pages: `static/index.html`, `static/app.js`, and the ordered CSS files
## Primary Structural Risks
1. Request routing, use cases, scheduling, provider selection, serialization, and account
context coexist in one service module.
2. Database migrations cannot be reviewed independently from repository behavior.
3. Several business paths instantiate provider clients directly, so source policy is not
centrally enforceable.
4. LLM authorization, quota accounting, model selection, streaming, and error handling are
distributed across multiple adapters.
5. Global DOM state and page behavior share one JavaScript file, increasing cross-page
regression risk.
6. CSS correctness depends on load order and late overrides rather than explicit layer
ownership.
7. In-process daemon jobs have no durable queue and some failure paths are not observable.
## Inventory Limits
The JSON inventory records source-level declarations and references. It does not claim that
every declared endpoint is exercised or every table is populated. Runtime coverage and data
quality are separate contracts introduced in later governance stages.