Add the Chinese documentation center, refresh the English documentation index, and update README navigation links.
Polish the README contact sections across Chinese, Traditional Chinese, and English docs by splitting long email details, aligning contact rows, and adding the Xiaohongshu QR image.
Validation:
- git diff --check
- GitHub CI passed: ai-governance, backend-gate, docker-build
- PR Review passed: security check, static check, AI review, review report
* fix: update report title from 'A股智能分析报告' to '股票智能分析报告'
* feat: add support for Hong Kong market in market review and analysis features
* fix: update daily_analysis workflow name and adjust region check in market analyzer
* fix: enhance market region handling in run_market_review and compute_effective_region functions
* test: add Hong Kong market support in MarketReviewLocalizationTestCase
* fix: update market review region handling to include Hong Kong support in documentation and logic
* fix: update daily_analysis workflow name to Chinese and adjust Hong Kong index symbols in yfinance_fetcher
* fix: refactor market review execution to use run_market_review for improved handling
* fix: implement trading day filtering in MarketCommand to skip reviews on market holidays
* fix: update changelog and README to reflect market command enhancements and support for multiple regions
* fix: update YfinanceFetcher to include HK index symbol mappings for improved data retrieval
Co-authored-by: Jonty <jonty.wang@hk.com.sg>
Co-authored-by: mumu <42829555+ZhuLinsen@users.noreply.github.com>
* Fix multi-agent AGENT_MAX_STEPS not respecting user override and skill agent failure handling
- Fix AGENT_MAX_STEPS ceiling-only logic: when user raises value above default
(10), all sub-agents now adopt the global value instead of being capped at
their per-agent defaults (fixes#1026)
- Fix skill agent failure aborting entire pipeline: specialist/skill agents now
degrade gracefully like intel/risk stages
- Improve max-steps-exceeded error message with AGENT_MAX_STEPS guidance
- Sync config descriptions in README, .env.example, and config_registry
* fix: use per-agent max_steps as ceiling instead of override
_prepare_agent() previously replaced every agent's max_steps with the
orchestrator-level value (AGENT_MAX_STEPS, default 10). This inflated
specialised agents far beyond their designed limits:
- TechnicalAgent: 6 -> 10
- IntelAgent: 4 -> 10
- DecisionAgent: 3 -> 10
In standard mode this allowed up to 30 LLM calls instead of the intended
13, which is the primary cause of quota exhaustion and timeouts in
multi-agent pipelines.
Now max_steps = min(agent.max_steps, orchestrator.max_steps), so the
global setting acts as a ceiling that never inflates per-agent defaults.
* feat(autocomplete): refactor index generator to support Tushare and multi-market
* docs: update changelog and README for multi-market autocomplete
- Add Unreleased entries for Tushare stock list fetcher, multi-market
index generation scripts, and updated index data
- Update README to reflect A-share/HK/US coverage instead of
A-share-only first phase
- Add examples for HK and US stock autocomplete (tencent, aapl)
- Reference TUSHARE_STOCK_LIST_GUIDE.md for index update workflow
* fix: deduplicate US autocomplete symbols
* feat: add Slack as a first-class notification channel
* fix: guard Slack image delivery with _should_use_image_for_channel()
* fix: require SLACK_CHANNEL_ID in workflow config check
* docs: add Slack channel entry to CHANGELOG and fix README_CHT nav link
* fix: use Slack new file upload API for image delivery
* fix: update Slack image test for new upload API, add slack to md2img example
* fix: send raw bytes to Slack upload URL and unify bot/webhook precedence
* docs: unify Slack Bot > Webhook precedence across all docs
* docs: add Slack config entries and setup guide to full-guide (zh/en)
Add SLACK_BOT_TOKEN, SLACK_CHANNEL_ID, SLACK_WEBHOOK_URL rows to both
config tables (GitHub Actions + local run) and a dedicated Slack setup
section with Bot-first precedence, mirroring the existing Discord
section structure. Applied to both full-guide.md and full-guide_EN.md.
* feat: register Slack config fields in config_registry for Web settings
Add SLACK_BOT_TOKEN, SLACK_CHANNEL_ID, SLACK_WEBHOOK_URL to
_FIELD_DEFINITIONS (display_order 36-38, between Discord and Pushover)
so /api/v1/system/config/schema and the Web settings page can expose
them. Add SLACK to _infer_category() notification prefix list.
New test file test_config_registry.py (6 cases) verifies field
registration, sensitivity flags, display ordering, and schema response
inclusion — prevents future channels from shipping without UI exposure.
* fix: use password control for SLACK_WEBHOOK_URL to prevent plaintext leak
SLACK_WEBHOOK_URL was marked is_sensitive=True but ui_control was text,
inconsistent with DISCORD_WEBHOOK_URL and other sensitive Webhook fields.
The Web settings page would display the URL in plaintext.
Also added a registry-wide regression test: any is_sensitive field must
use ui_control=password, preventing future channels from repeating this.
* feat: add configurable report language
* Fix review follow-ups for history and fallback localization
* fix: prefer .env report language at startup
* fix: address report language review feedback
* fix: address latest report language review feedback
* fix#692: decouple agent and analysis primary model selection
* fix#692: preserve yaml alias for agent primary model
* docs #692: sync agent primary model in EN/CHT readmes
* Improve analysis API async contracts and startup helpers
* Fix rebased analysis API contract regressions
* fix: align frontend report type union with full responses
* feat: add agent strategy chat across API, bot, and web UI #minor
- add /api/v1/agent endpoints for strategies and streaming chat
- route pipeline to agent mode when specific skills are configured
- persist multi-turn conversation history in database
- add web chat page, bot /ask command, built-in strategies, and tests
* fix(agent): improve session handling, progress messaging, and chat type safety #patch
Generate UUID session IDs for stream chat requests and use running loop API.
Persist user messages even on failed runs, and store assistant error notes for context continuity.
Add contextual thinking messages after tool calls in agent executor.
Fix strategy display name lookup in bot ask command.
Refine ChatPage TypeScript types and error handling for SSE parsing.
Use SQLAlchemy select+execute for conversation history query.
* docs: add Agent strategy chat to README and CHANGELOG #skip
* fix(tests): update strategy count assertions 6->11; clean up CHANGELOG [Unreleased] section #patch
* chore: update readme and fix unitest
* feat: optimize tools
* fix: Fix hard-coded test values and resolve nested mapping in Dashboard
* update changelog
* refactor(agent): extract shared factory, cache ToolRegistry/SkillManager, fix Gemini model name
* - CRITICAL: fix 4 wrong tool names in AGENT_SYSTEM_PROMPT and
CHAT_SYSTEM_PROMPT (get_k_history→get_daily_history,
get_technical_analysis→analyze_trend, get_chip_analysis→
get_chip_distribution, search_news→search_stock_news)
- fix _THINKING_TOOL_LABELS: update 7 stale keys, add calculate_ma
and get_analysis_context (13 tools now fully mapped)
- add isinstance(dict) guard in _parse_dashboard to reject non-dict
JSON (arrays, scalars) that would crash downstream dict access
- use getattr() for config.agent_skills in pipeline.py (AttributeError safety)
- move to top-level, remove unused imports (get_config,
Callable, Any/Dict/Optional)
- add phased workflow directives to both system prompts to enforce
sequential tool calling across analysis stages
- expand .env.example AGENT_SKILLS with all 11 built-in strategies
and usage examples
- fix factory.py docstring referencing non-existent comprehensive_analysis
* fix: report signal accuracy, data source reliability, and market review quality #patch
- Fix signal emoji mismatch for compound advice and *ST markdown escaping
- Inject structured data (indices/stats/sectors) into market review
- Fix tushare return type and API endpoint; auto-inject realtime priority
- Add search cache (500-cap FIFO), limit supplement requests to 1
- Fix analysis API report=None and ReportStrategy type inconsistency
- Update CHANGELOG for v3.0.1 ~ v3.0.5
* fix: F821 undefined name 'UnifiedRealtimeQuote'
Add a complete backtest/evaluation system that measures the accuracy of
AI-generated stock analysis recommendations against actual market outcomes.
Backend:
- Backtest engine (src/core/backtest_engine.py) with direction inference,
stop-loss/take-profit simulation, and outcome classification (win/loss/neutral)
- Repository layer (src/repositories/backtest_repo.py) with SQLite persistence
for backtest_results and backtest_summaries tables
- Service layer (src/services/backtest_service.py) orchestrating evaluation runs
with configurable window days, neutral band, and min-age filters
- REST API endpoints: POST /run, GET /results, GET /performance, GET /performance/{code}
- Pydantic schemas for request/response validation
Frontend (apps/dsa-web):
- New Backtest page with performance dashboard sidebar showing direction
accuracy, win rate, simulated returns, SL/TP trigger rates, and W/L/N counts
- Paginated results table with outcome badges, direction indicators, and
color-coded return percentages
- Stock code filter and one-click "Run Backtest" trigger
- Full TypeScript types and API client matching backend schemas
Direction mapping fix:
- "Wait/observe" (观望) advice now maps to direction_expected="down" instead
of "flat", correctly reflecting that "wait" means "stay out due to downside
risk" rather than predicting a flat market
Tests:
- 21 unit tests covering engine logic, service orchestration, and summary
aggregation (all passing)
Docs:
- Updated README, full-guide, and translations with backtest feature docs
* feat!: replace legacy WebUI with unified FastAPI architecture #major
- Remove legacy WebUI (web/ package based on ThreadingHTTPServer)
- Unify CLI commands: --webui now seamlessly launches the new FastAPI service
- Migrate task service from web/services.py to src/services/task_service.py
- Update documentation to reflect the new simplified usage
* refactor(service): support parameterized query source in TaskService