Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@


# ───── 1. 共享基础(所有 Python service 都读) ──────────────
# Postgres 连接串;services/data 与 services/paper 使用
# Postgres 连接串;本地默认值与 infra/.env.example 一致。修改连接信息时须同步两处。
DATABASE_URL=postgresql+psycopg://quant:devpass@localhost:5433/inalpha

# JWT 跨 service 共享密钥(≥32 字节强随机)
Expand Down Expand Up @@ -46,10 +46,20 @@ EVOLVER_SERVICE_PORT=8005
EVOLVER_ENABLED=true

# Evolver E1 单 worker / 单副本;每个 run 只跑一代候选。
EVOLVER_POOL_SIZE=5
EVOLVER_MAX_RUNNING_RUNS=1
EVOLVER_ACCOUNT_ACTIVE_LIMIT=2
EVOLVER_QUEUE_TIMEOUT_S=86400
EVOLVER_JOB_TIMEOUT_S=300
EVOLVER_RUN_TIMEOUT_S=1200
EVOLVER_JOB_MEM_GB=2
EVOLVER_LLM_TIMEOUT_S=120
# Evolver 仅用该地址按 owner/config_id 解析既有加密凭据;不会持久化明文 key。
DASHBOARD_SERVICE_URL=http://localhost:3001
# Ed25519 DER 的 base64:私钥仅给 orchestration,公钥给 Dashboard 验证逐操作 grant。
# 生成方式见 services/evolver/README.md;生产 compose 会显式从 Evolver 环境移除私钥。
EVOLUTION_CREDENTIAL_PRIVATE_KEY_B64=
EVOLUTION_CREDENTIAL_PUBLIC_KEY_B64=

# factor 服务可选项(ADR-0043):qlib Alpha158 风格因子纯 pandas 本地算,默认开;
# 设 false 可整源关闭。snapshot top-N 去相关阈值默认 0.85(1.0 = 关闭去相关)
Expand Down
46 changes: 32 additions & 14 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ Inalpha = AI agent 编排 + 多 Python kernel 的**量化实验框架**:agent
## 3. 协作硬约束(任何 AI 工具必须遵守)

- **品牌名**:始终大写 **Inalpha**(不写 inalpha / InAlpha / inAlpha) <!-- check-consistency: skip -->(元用法)
- **市场约束**:仅 crypto,**不**涉及 A 股 / 美股盘前盘后逻辑
- **市场覆盖**:crypto + 美股 + A股 + 港股 + 全球单股 / 指数 + FRED 宏观;
orchestration 按市场类型路由 venue,交易时段由市场日历处理
- **命名约定**:
- Python 包:`inalpha_<service>`(snake_case) <!-- check-consistency: skip -->(占位符不匹配白名单)
- tools:`<service>.<verb>` 或 `mcp__<server>__<verb>`
Expand All @@ -39,32 +40,40 @@ Inalpha = AI agent 编排 + 多 Python kernel 的**量化实验框架**:agent
## 4. 起步(clone 之后)

```bash
pnpm i # Node 包(packages/orchestration)
uv sync # Python 包(services/*)
cd packages/orchestration && pnpm i && cd ../..
for service in data paper research factor evolver; do
(cd "services/$service" && uv sync)
done

# 配置统一 .env(所有 service 共享根目录一份 .env)
cp .env.example .env # 在 .env 里填 LLM_PROVIDER + 对应 *_API_KEY
# 详见 README.md §Quick Start 的 provider/model 表
# 运行 Evolver 还需生成 Ed25519 grant 公私钥
# 见 services/evolver/README.md §配置与启动

# DB schema 升到最新(dev.sh 不会自动跑;漏跑会导致 paper 服务 500:表不存在)
cd infra/migrations && uv run alembic upgrade head && cd ../..
# 启动开发 DB 并把 schema 升到最新(dev.sh 不会自动做这两步)
cp infra/.env.example infra/.env # 与根 .env.example 的 DB 默认值一致
(cd infra && docker compose up -d)
(cd infra/migrations && uv sync && uv run alembic upgrade head)

# 一键起所有 service(推荐)
bash scripts/dev.sh # data:8001 + paper:8002 + research:8003 + mastra:4111
bash scripts/dev.sh # data:8001 + paper:8002 + research:8003 + factor:8004 + evolver:8005 + mastra:4111
bash scripts/dev.sh logs # 跟随日志
bash scripts/dev.sh stop # 停止全部

# 手动起(如果想要 4 个独立 terminal)
# 手动起(如果想让各进程占用独立 terminal)
cd services/data && uv run uvicorn inalpha_data.main:app --port 8001 --reload
cd services/paper && uv run uvicorn inalpha_paper.main:app --port 8002 --reload
cd services/research && uv run uvicorn inalpha_research.main:app --port 8003 --reload
cd services/factor && uv run uvicorn inalpha_factor.main:app --port 8004 --reload
cd services/evolver && uv run uvicorn inalpha_evolver.main:app --port 8005 --reload
cd packages/orchestration && pnpm dev

# 操作者控制台(apps/dashboard)—— 推荐的功能主入口,只读运行时看板
# 组合 / Live Runner / Agent 活动 / 策略实验室 / 因子库 / 风控;黑白双主题 + en/中
# 操作者控制台(apps/dashboard)—— 推荐的功能主入口(认证 + BFF + 运行时看板)
# 对话 / 组合 / Live Runner / 演化 / Agent 活动 / 策略实验室 / 因子库 / 风控
# 直接读根 .env(service URL + JWT_SECRET 继承),后端起着即可连
cd apps/dashboard && pnpm i && pnpm dev # → http://localhost:3001
# 设计语言见 apps/dashboard/design.md;agent 对话功能后续也会并入控制台
# 设计语言见 apps/dashboard/design.md

# 跨文件一致性检验(提交前跑一次)
bash scripts/check-consistency.sh
Expand Down Expand Up @@ -95,13 +104,17 @@ pnpm scheduler:trigger daily_btc_deep_dive # 手动触发一次

## 6. 当前 Phase 状态

Phase **D-11**(多市场模拟盘)已落地:单 orchestrator + plan/exec 三件套
Phase **D-12 + E1 生产闭环**已落地:单 orchestrator + plan/exec 三件套
(create_plan / approve_plan / execute_plan)+ hooks + permissions deny +
approval_token 状态机(D-8/D-9)→ LLM 自创策略沙盒 + 风控引擎 + 多市场数据
(D-9/D-10)→ 跨币种 cash + **live runner**(promoted 候选按行情自动跑,机器审批
走护栏内 plan/exec)。D-11.1 收口了 live runner 的信任边界与健壮性
(candidate 归属校验 / per-account run 上限 / 错误可重试分类);D-11.2 收口运维(PnL 净口径扣手续费 / 运行时长 TTL auto-stop / build 退避 + 错误分类)。factor 库(services/factor:8004,pandas-ta/Alpha101/qlib + IC 有效性)已落地、策略族扩到 6。
下一里程碑:research-hub 嵌套 supervisor(issue #6)/ E2 多代演化(issue #7)。
(candidate 归属校验 / per-account run 上限 / 错误可重试分类);D-11.2 收口运维;
D-12 完成 factor 血缘、衰减巡检与因子发现。research-hub 三方辩论已收口。
E1 已拆出 `services/evolver:8005`:真实 frozen bars、单代 unified-diff 变异、异步
owner-scoped 状态、显式逐次审批与可复现实验元数据;演化链路不会自动 promote、启动策略或下单。
当前收口项是冻结 LLM/定价快照、owner key 即时获取与 token/cost 审计;下一里程碑为
E2 best-parent 多代选择与 early stopping(issue #7),MAP-Elites / Island Model 后置。
详见 [`docs/04-current-state.md`](docs/04-current-state.md) / `CLAUDE.md` §3 /
仓库根 `README.md`。

Expand All @@ -112,6 +125,8 @@ approval_token 状态机(D-8/D-9)→ LLM 自创策略沙盒 + 风控引擎 +
| 想做的事 | 去哪里 |
|---|---|
| 加新策略 | `services/paper/src/inalpha_paper/strategies/` |
| 调整策略演化 | `services/evolver/src/inalpha_evolver/` |
| 调整因子库 | `services/factor/src/inalpha_factor/` |
| 加新 tool | `packages/orchestration/src/tools/` |
| 调整内核 | `services/_shared/` 之外的 services 模块 |
| 不确定 | 先开 issue 讨论,再动 |
Expand All @@ -123,7 +138,10 @@ approval_token 状态机(D-8/D-9)→ LLM 自创策略沙盒 + 风控引擎 +
- ❌ 不在 `services/_shared/` 加项目特有逻辑(破坏复用)
- ❌ 不写跳过测试 / 跳过 hook 的 commit(`--no-verify` 等)——遇阻先 ask user
- ❌ 不在不公开源码的前提下把 Inalpha(或其修改版)当作网络服务对外提供(LICENSE: AGPL-3.0;需闭源 / 托管 SaaS 请提 issue 谈双重许可)
- ❌ 多租户上线前不给每用户发各自 JWT:promote 审批的 askCache 已按**已认证 sub** 隔离(mastra identity middleware 从 Bearer 注入 → `with-hooks` 读),但 dashboard 现给所有人发同一个 `CONSOLE_SUBJECT` 常量 token;要真隔离须让 dashboard 按登录用户发各自 JWT,否则所有人共享一个 sub scope(A 的审批被 B 复用)。详 #91 / `mastra/index.ts` identityMiddleware
- ❌ 不绕过逐用户 JWT、owner scope 或 `LLM_CONFIG_ENCRYPTION_KEY`:Evolver 只能转交由
orchestration 签发、绑定 owner / operation / `config_id` / digest 的短时 Ed25519 grant,
由 Dashboard 公钥验签并兑换当前 owner 的模型密钥;首次响应丢失时只允许两分钟内补偿
重试一次。严禁把明文 API key 写入运行记录或日志

---

Expand Down
17 changes: 11 additions & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
- **不是**开箱即用策略平台 / LangChain / AutoGen 包装
- **三层**:Next.js + CopilotKit → Mastra(TS)→ Python services。详 `docs/01-architecture-overview.md`

## 2. 文档入口 & 当前 Phase(D-12)
## 2. 文档入口 & 当前 Phase(D-12 + E1

- `README.md` / `README.zh-CN.md` 首页;`AGENTS.md` 多工具入口;`docs/00-context.md` 背景 / `01-architecture-overview.md` 架构 / `03-kernel-design.md` services / `04-current-state.md` 进度
- 内部 ADR 在 `docs/miro/`(gitignored,公开文档勿引用)
- D-8~D-9 闭环(Plan/Exec + LLM 自创策略 + 风控);D-10 多市场数据(web/基本面);D-11 多市场模拟盘(跨币种 cash + live runner);D-12 因子库闭环(血缘+衰减巡检+monthly 宏观+因子发现 L1);下一 E2 演化 #7
- D-8~D-12 已完成 Plan/Exec、策略创作、风控、多市场模拟盘与因子闭环;research-hub 已收口;E1 独立 Evolver 已落地真实 frozen bars、显式审批、owner 隔离与可复现实验元数据。当前收口冻结 LLM/定价快照与费用审计;下一 E2 best-parent 多代演化 #7

## 3. 协作硬约束

Expand Down Expand Up @@ -43,21 +43,26 @@ Inalpha 是**金融 agent**——任何"看起来很新但其实 stale"的输出

## 4. CI 红线(push 前本地必跑,缺一不可)

- `pnpm typecheck && pnpm vitest run`(orchestration)+ `uv run ruff check .`(data/paper/research)+ `bash scripts/check-consistency.sh`
- `(cd packages/orchestration && pnpm typecheck && pnpm vitest run)` + 各 Python service 目录执行 `uv run ruff check .` + paper/evolver 目录执行 `uv run pytest` + `bash scripts/check-consistency.sh`
- **加 import 必同步 `git add`**——`grid-size-cap.ts` / `scheduler/` / `_base.py` 漏 add 反复让 CI 挂;commit 前 `git status` 看 untracked
- 公开文档(README / AGENTS / `docs/00-04`)禁引用 `docs/miro/` 私有路径
- 模块顶层 eager 调 `getSettings()` 的入口,测试靠 vitest `setupFiles`(`tests/setup.ts`)注入默认 env

## 5. 起步 + Active TODO

```bash
pnpm i && uv sync && bash scripts/dev.sh # data:8001 + paper:8002 + mastra:4111
cd packages/orchestration && pnpm i && cd ../..
for s in data paper research factor evolver; do (cd "services/$s" && uv sync); done
cp .env.example .env && cp infra/.env.example infra/.env
(cd infra && docker compose up -d)
(cd infra/migrations && uv sync && uv run alembic upgrade head)
bash scripts/dev.sh # data:8001…evolver:8005 + mastra:4111
```

D-9/D-9.1a 收口 + D-10 多市场数据(web/基本面)+ D-11 多市场模拟盘
(跨币种 cash + live runner #1)+ D-12 因子库闭环(血缘 + 衰减巡检 +
monthly 宏观 + 因子发现 L1 + 三方研究辩论)已落地。
下一:E2 演化 #7
monthly 宏观 + 因子发现 L1 + 三方研究辩论)和 E1 独立 Evolver 已落地。
当前:冻结 LLM/定价快照、owner key 即时获取、token/cost 审计;下一:E2 best-parent 多代演化 #7

---

Expand Down
32 changes: 21 additions & 11 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Contributing to Inalpha / 贡献指南

> Inalpha is an experimental research framework in **alpha**. Phase D-11 has landed (multi-market paper trading: cross-currency cash + live runner); next up are research-hub (#6) and E2 strategy evolution (#7).
> Inalpha is an experimental research framework in **alpha**. Phase D-12 and the E1 production evolution loop have landed; the next milestone is E2 best-parent multi-generation evolution (#7).
> Before writing code, we strongly recommend reading: [`AGENTS.md`](AGENTS.md) · [`docs/00-context.md`](docs/00-context.md) · [`docs/01-architecture-overview.md`](docs/01-architecture-overview.md) · [`docs/04-current-state.md`](docs/04-current-state.md)
>
> Inalpha 是实验性研究框架,处于 **alpha** 阶段。Phase D-11 已落地(多市场模拟盘:跨币种 cash + live runner);下一步是 research-hub(#6)与 E2 策略演化(#7)。
> Inalpha 是实验性研究框架,处于 **alpha** 阶段。Phase D-12 与 E1 策略演化生产闭环已落地;下一里程碑是 E2 best-parent 多代演化(#7)。
> 动手之前,强烈建议先读上述四份文档。

## 1. Before you start / 开始之前
Expand All @@ -30,16 +30,26 @@
## 3. Local setup / 本地起步

```bash
pnpm i && uv sync
bash scripts/dev.sh # data:8001 + paper:8002 + mastra:4111
cd packages/orchestration && pnpm i && cd ../..
for service in data paper research factor evolver; do
(cd "services/$service" && uv sync)
done
cp .env.example .env && cp infra/.env.example infra/.env
(cd infra && docker compose up -d)
(cd infra/migrations && uv sync && uv run alembic upgrade head)
bash scripts/dev.sh # data:8001 … evolver:8005 + mastra:4111
bash scripts/check-consistency.sh # must pass before committing / 提交前必须 pass
```

CI red lines — run locally before every push / CI 红线,push 前本地必跑(缺一不可):

```bash
pnpm typecheck && pnpm vitest run # packages/orchestration
uv run ruff check . # services/data | paper | research
(cd packages/orchestration && pnpm typecheck && pnpm vitest run)
for service in data paper research factor evolver; do
(cd "services/$service" && uv run ruff check .)
done
(cd services/paper && uv run pytest)
(cd services/evolver && uv run pytest)
bash scripts/check-consistency.sh
```

Expand All @@ -57,8 +67,8 @@ Use short kebab-case names / 任务分支建议短命名 + kebab-case:`feature

**Must go through staging (high-risk)** / **必经 staging(高风险)**:

- New strategy family, or large changes to `services/research/` / `services/paper/` / `packages/orchestration/`
新策略族,或上述三个核心模块的大改
- New strategy family, or large changes to `services/research/` / `services/paper/` / `services/evolver/` / `packages/orchestration/`
新策略族,或上述核心模块的大改
- New connector / venue / broker
新 connector / 新 venue / 新 broker
- Large orchestrator schema or agent prompt changes
Expand Down Expand Up @@ -94,7 +104,7 @@ feature/* → PR → main

Every PR automatically triggers / 每个 PR 自动触发:

1. **CI** — 6 required status checks / 6 个必填 status check(详 [`.github/workflows/ci.yml`](.github/workflows/ci.yml))
1. **CI** — required checks defined by branch protection / 分支保护配置的必填检查(详 [`.github/workflows/ci.yml`](.github/workflows/ci.yml))
2. **Claude PR Review** — non-blocking auto review / 非阻塞自动审查(详 [`.github/workflows/claude-review.yml`](.github/workflows/claude-review.yml))
3. **Cloudflare Pages preview deploy** — a unique URL per PR, posted in a comment / 每 PR 独立 URL,评论里贴出

Expand All @@ -105,7 +115,7 @@ Mentioning `@claude` in a PR / issue / review comment starts a conversation with

`main` and `staging` are configured identically / `main` 与 `staging` 配置一致:

- **6 required CI status checks** / **必填 6 个 CI status check**:`orchestration · typecheck + test` / `web · typecheck + build` / `Cross-file consistency check / 跨文件一致性检验` / `python services · ruff + mypy (data|paper|research)`
- **Required CI checks** / **必填 CI 检查**:跨文件一致性、自托管 smoke、orchestration typecheck/test + agent eval、web/dashboard build、Python service lint/typecheck,以及 paper/evolver E1 pytest。具体 context 以仓库 branch protection 为准。
- PR required, but `required_approving_review_count: 0` — solo project, avoids self-approval deadlock.
必走 PR,但**不**强制 approval(单人项目,避免自批死锁)。
- `allow_force_pushes: false` · `allow_deletions: false`
Expand All @@ -121,7 +131,7 @@ CI workflow 改 job 名时必须同步更新 protection 的 `contexts`,否则
- **Commit message**: Chinese, `<type>(<scope>): <desc>`; one logical change per commit — don't mix unrelated modules in one commit.
**Commit message**:中文 + `<type>(<scope>): <desc>`;一次 commit 只做一件事,不要把不相关模块揉进同一个 commit。
- **type**: `feat` / `fix` / `refactor` / `docs` / `test` / `chore` / `style` / `perf` / `ci`
- **scope**: `data` / `paper` / `research` / `orchestration` / `web` / `docs` / `infra`, or a concrete module name / 或具体模块名
- **scope**: `data` / `paper` / `research` / `factor` / `evolver` / `orchestration` / `dashboard` / `web` / `docs` / `infra`, or a concrete module name / 或具体模块名
- A Phase tag is welcome / 可标 Phase D-N(例:`feat(paper): 跨币种 cash 账本 (D-11)`)
- Check untracked files before committing — a missing `git add` for a newly imported file breaks CI.
commit 前 `git status` 检查 untracked——新 import 的实现文件漏 add 会让 CI 挂。
Expand Down
Loading
Loading