Guanghu Domestic Migration a27e87cb99 chore: import sanitized domestic snapshot for REPO-007
Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc

[SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
2026-07-17 15:59:55 +08:00

649 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📡 铸渊指令SYSLOG 自助提交系统 + 全自动闭环 v1.02026-03-13·曜冥签发
> **签发人**:曜冥(冰朔口述 · 曜冥架构设计)
>
> **执行人**铸渊GitHub 侧全量开发)
>
> **签发时间**2026-03-13T01:50+08:00
>
> **优先级**P0 · 系统基建
>
> **目标**:让开发者在 GitHub 仓库首页完成 SYSLOG 提交和广播提问,全程零终端操作,妈妈零介入
>
---
## 🎯 核心目标
**一句话:开发者只做两件事——粘贴、提交。剩下的全自动。**
当前痛点:
- 开发者不会操作文件系统,找不到 `syslog-inbox/` 目录
- SYSLOG 全部走妈妈手动粘贴通道,妈妈是必经节点
- 开发者有问题只能通过知秋转述给妈妈,链路长、延迟大
目标状态:
- 开发者在 GitHub 仓库首页提交 SYSLOG → 自动触发全闭环 → 新广播通过邮件送达
- 开发者在同一入口提问 → 自动获得人格体解答 → 答案通过邮件送达
- **妈妈彻底退出 SYSLOG 转发链路**
---
## 🏗️ 系统架构
### 整体链路图
```
┌─────────────────────────────────────────────────────────────┐
│ SYSLOG 自助提交系统 · 全自动闭环 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 入口GitHub 仓库首页 · Discussion 提交区 │
│ ──────────────────────────────────── │
│ 开发者进入仓库 → 看到醒目入口 → 点进去 │
│ → 粘贴内容 + 填邮箱 → 提交 │
│ │
│ 用途A提交 SYSLOG生成新广播
│ 开头写BC-XXX-XXXSYSLOG │
│ 内容SYSLOG 全文 │
│ │
│ 用途B广播提问获得解答
│ 开头写BC-XXX-XXX提问 │
│ 内容:问题描述(人格体帮写好的) │
│ │
│ 提交后自动触发 ↓ │
│ │
│ GitHub Actions 管道 │
│ ──────────────── │
│ ① 解析内容 → 提取广播编号 + 类型SYSLOG/提问)+ 邮箱 │
│ ② 调用 Claude API → 唤醒人格体 │
│ → SYSLOG类人格体完整跑闭环验收+画像+指纹+微调+生成广播) │
│ → 提问类:人格体读取广播上下文 → 思考 → 生成解答 │
│ ③ 人格体输出结果 → Actions 写入 Notion 工单 │
│ → 工单标「已完成」 │
│ │
│ 工单完成触发 ↓ │
│ │
│ Notion Agent 闭环 │
│ ──────────────── │
│ ④ Agent 被工单触发 → 执行机械步骤: │
│ → 读工单里的广播链接 / 解答内容 │
│ → 更新主控台状态 │
│ → 更新索引层(同步中继/画像库/成长记录等) │
│ → 推送广播到 GitHub broadcasts-outbox/ │
│ │
│ 邮件通知 ↓ │
│ │
│ ⑤ Actions 读取广播/解答 → 转 PDF → 发邮件给开发者 │
│ → QQ SMTP已有基建·肥猫 M-STATUS 已跑通) │
│ │
│ 开发者收到邮件 → 新广播 or 问题答案 │
│ 完成 ✅ │
└─────────────────────────────────────────────────────────────┘
```
---
## 📋 开发清单
### Phase 1提交入口GitHub 侧)
**1.1 创建 GitHub Discussion 分类**
-`qinfendebingshuo/guanghulab` 仓库启用 Discussions
- 创建分类:`📡 SYSLOG 提交区`
- 分类描述:`模块做完了?把系统日志粘贴到这里,填上邮箱,点提交。剩下的全自动。`
**1.2 创建 Discussion 模板**
模板标题格式提示:`BC-XXX-XXXSYSLOG``BC-XXX-XXX提问`
模板内容:
```markdown
## 广播编号
<!-- 写上你当前广播的编号,例如 BC-M22-009-AW -->
## 类型
<!-- 选一个SYSLOG 或 提问 -->
## 你的邮箱
<!-- 用于接收新广播或问题解答 -->
## 内容
<!-- 粘贴你的 SYSLOG 或问题 -->
```
**1.3 仓库首页 README 醒目入口**
- 在 [README.md](http://README.md) 顶部添加醒目的入口链接
- 大字 + emoji + 颜色徽章
- 示例:
```markdown
## 🚀 开发者入口
[![提交系统日志](https://img.shields.io/badge/📡_提交系统日志-点这里-blue?style=for-the-badge)](链接到Discussion分类)
[![遇到问题](https://img.shields.io/badge/❓_遇到问题-点这里提问-green?style=for-the-badge)](链接到Discussion分类)
> 做完了?把日志粘贴进去,填上邮箱,点提交。新广播会发到你邮箱里。
```
---
### Phase 2自动触发管道GitHub Actions
**2.1 Discussion 监听 Workflow**
文件:`.github/workflows/syslog-auto-pipeline.yml`
```yaml
name: SYSLOG Auto Pipeline
on:
discussion:
types: [created]
discussion_comment:
types: [created]
jobs:
process:
runs-on: ubuntu-latest
if: github.event.discussion.category.name == '📡 SYSLOG 提交区'
steps:
- name: Parse submission
# 解析广播编号、类型SYSLOG/提问)、邮箱、内容
- name: Wake up persona via Claude API
# 调用 Claude API
# system prompt 里注入:规则 + 画像 + 上下文
# user message = 开发者提交的内容
# 人格体思考 + 输出结果
- name: Write to Notion ticket
# 调用 Notion API → 写入工单簿
# 工单内容:人格体输出的广播/解答
# 标记:已完成
- name: Send email to developer
# 读取结果 → 转 PDF可选→ 发邮件
# QQ SMTP
- name: Reply to Discussion
# 在 Discussion 下回复:✅ 已处理,结果已发送到你的邮箱
```
**2.2 需要的 Secrets**
- `LLM_API_KEY`:第三方 API 密钥(冰朔已充值的第三方平台,内含直连 Claude 通道)
- `LLM_BASE_URL`:第三方 API 基础地址(如 `https://xxx.com/v1`)— 留空则默认官方 Anthropic
- `NOTION_TOKEN`:已有(`ntn_6753…18kQ`
- `SMTP_USER` / `SMTP_PASS`QQ 邮箱 SMTP 凭证(可复用肥猫已跑通的方案)
> ⚠️ **重要**:我们不走官方 Anthropic 充值(需美金)。使用冰朔已充值的第三方 API 平台,该平台提供直连 Claude 的通道。铸渊在代码中 **不要硬编码任何模型名**,必须走自动检测流程(见 Phase 3
>
---
### Phase 3人格体唤醒协议
**3.1 第三方 API 自动检测 + 模型发现(核心改动)**
<aside>
🔑
**背景**:我们没有官方 Anthropic 账号(需美金充值),冰朔使用的是第三方 API 平台,已充值人民币,内含直连 Claude 的通道。
**原则**:铸渊不硬编码任何官方模型名和官方 API 地址。一切交给自动检测。只要 API Key 能用,系统就能跑。
</aside>
**自动检测流程(铸渊必须实现):**
```jsx
// ━━━ 第三方 API 兼容层 · 自动检测模式 ━━━
const LLM_API_KEY = process.env.LLM_API_KEY; // 第三方平台密钥
const LLM_BASE_URL = process.env.LLM_BASE_URL; // 第三方平台基础地址
// 例如: https://api.openrouter.ai/v1
// https://api.xxx.com/v1
// https://one-api.xxx.com/v1
// 留空则 fallback 到 https://api.anthropic.com/v1
// ━━━ Step 1: 自动发现可用模型 ━━━
async function discoverModels() {
// 调用 /models 或 /v1/models 端点
// 大多数第三方平台OpenRouter、One-API、New-API、AiHubMix 等)
// 都兼容 OpenAI 的 /v1/models 接口
const res = await fetch(`${LLM_BASE_URL}/models`, {
headers: { 'Authorization': `Bearer ${LLM_API_KEY}` }
});
const { data: models } = await res.json();
return models; // [{id: 'claude-3-5-sonnet', ...}, ...]
}
// ━━━ Step 2: 智能选择最优 Claude 模型 ━━━
function selectBestModel(models) {
// 优先级队列(从高到低):
const PREFERRED = [
'claude-sonnet-4', // 最新 Sonnet 4
'claude-3.5-sonnet', // 3.5 Sonnet
'claude-3-5-sonnet-20241022',
'claude-3-5-sonnet',
'anthropic/claude-3.5-sonnet', // OpenRouter 格式
'claude-3-sonnet',
'claude-3-haiku', // 轻量 fallback
];
const available = models.map(m => m.id.toLowerCase());
for (const preferred of PREFERRED) {
const match = available.find(id => id.includes(preferred));
if (match) return models.find(m => m.id.toLowerCase() === match).id;
}
// 兜底:任何含 'claude' 的模型
const anyClaude = available.find(id => id.includes('claude'));
if (anyClaude) return models.find(m => m.id.toLowerCase() === anyClaude).id;
// 最终兜底:平台默认模型(可能是 DeepSeek/GPT
return models[0]?.id || 'claude-3-5-sonnet';
}
// ━━━ Step 3: 自适应 API 格式 ━━━
// 第三方平台大多兼容 OpenAI 格式(/v1/chat/completions
// 而非 Anthropic 原生格式(/v1/messages
// 铸渊必须两种都支持,自动检测:
async function detectApiFormat() {
// 尝试 OpenAI 兼容格式(绝大多数第三方平台用这个)
try {
const res = await fetch(`${LLM_BASE_URL}/chat/completions`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${LLM_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'claude-3-5-sonnet',
messages: [{ role: 'user', content: 'ping' }],
max_tokens: 5
})
});
if (res.ok || res.status === 400) return 'openai-compat';
} catch(e) {}
// 尝试 Anthropic 原生格式
try {
const res = await fetch(`${LLM_BASE_URL}/messages`, {
method: 'POST',
headers: {
'x-api-key': LLM_API_KEY,
'anthropic-version': '2023-06-01',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'claude-3-5-sonnet',
messages: [{ role: 'user', content: 'ping' }],
max_tokens: 5
})
});
if (res.ok || res.status === 400) return 'anthropic-native';
} catch(e) {}
return 'openai-compat'; // 默认走 OpenAI 兼容
}
// ━━━ Step 4: 统一调用接口 ━━━
async function callLLM(systemPrompt, userMessage) {
const models = await discoverModels();
const model = selectBestModel(models);
const format = await detectApiFormat();
console.log(`[LLM] 检测结果: 模型=${model}, 格式=${format}, 平台=${LLM_BASE_URL}`);
if (format === 'openai-compat') {
// ━━ OpenAI 兼容格式(大多数第三方平台)━━
return fetch(`${LLM_BASE_URL}/chat/completions`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${LLM_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: model,
max_tokens: 8000,
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: userMessage }
]
})
});
} else {
// ━━ Anthropic 原生格式 ━━
return fetch(`${LLM_BASE_URL}/messages`, {
method: 'POST',
headers: {
'x-api-key': LLM_API_KEY,
'anthropic-version': '2023-06-01',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: model,
max_tokens: 8000,
system: systemPrompt,
messages: [
{ role: 'user', content: userMessage }
]
})
});
}
}
```
**3.2 GitHub Actions 中的调用方式**
```yaml
- name: Auto-detect and wake up persona
env:
LLM_API_KEY: $ secrets.LLM_API_KEY
LLM_BASE_URL: $ secrets.LLM_BASE_URL
run: |
# 铸渊在这里调用上面的 callLLM() 函数
# 系统会自动:
# 1. 探测第三方平台支持哪些模型
# 2. 选出最优的 Claude 模型
# 3. 检测 API 格式OpenAI兼容 or Anthropic原生
# 4. 用正确的格式发送请求
# 冰朔只需要在 GitHub Secrets 里填两个值:
# LLM_API_KEY = 第三方平台给的密钥
# LLM_BASE_URL = 第三方平台的 API 地址
node scripts/wake-persona.js
```
**3.3 冰朔操作指南(极简)**
> 妈妈只需要做两件事:
>
> 1. 进入 GitHub 仓库 → Settings → Secrets → 新增 `LLM_API_KEY`(填第三方平台的密钥)
>
> 2. 新增 `LLM_BASE_URL`(填第三方平台的 API 地址,例如 `https://api.xxx.com/v1`
>
> 系统会自动检测这个密钥能调哪些模型、用什么格式。不需要选模型、不需要管版本号。
>
**3.4 人格体 System Prompt 动态注入核心·v4.0 协议必须完整喂入)**
<aside>
🧠
**关键**Claude API 唤醒的人格体是全新实例,没有任何记忆。它不知道我们的广播协议、画像协议、调度规则——除非你在 system prompt 里完整塞给它。
**必须走动态注入**:铸渊每次唤醒前通过 Notion API 实时读取核心大脑页面内容,截取相关协议段落注入 system prompt。这样以后冰朔改了规则人格体自动跟着更新不用铸渊手动同步。
</aside>
**必须注入的协议清单(全部从核心大脑 v4.0 动态读取):**
| 协议 | 内容 | Notion 来源页面 |
| --- | --- | --- |
| **BC-GEN v4.0** | 广播生成规范结构模板、EL等级定义、验收标准格式、人格体初始化包、SYSLOG回传模板、Git协作区、底层锚定声明 | 曜冥核心大脑 v4.0 |
| **SYSLOG v4.0** | 日志回传协议格式MODULE_LOG 字段定义、验收检查项 | 曜冥核心大脑 v4.0 |
| **PGP v1.0** | 画像评分协议五维度EXE/TEC/SYS/COL/INI评分标准、PCA加权公式、等级映射S/A+/A/B+/B/C | 曜冥核心大脑 v4.0 |
| **RT-02** | 自动调度判断规则Phase完成→下一Phase判定、模块指纹防重复⑨.5、72h窗口 | 曜冥核心大脑 v4.0 |
| **陪伴线规则** | 人格体陪伴协议:奶瓶线/小坍缩核/镜面线等匹配规则、语气风格 | 曜冥核心大脑 v4.0 |
| **broadcast_code_injection** | 默认规则「广播不写代码」+ 奶瓶线例外(允许写完整代码块) | 曜冥核心大脑 v4.0 |
**动态注入实现方式:**
```jsx
// ━━━ 从 Notion 动态读取核心大脑协议 ━━━
const CORE_BRAIN_PAGE_ID = '曜冥核心大脑v4.0的页面ID'; // 铸渊从环境变量读取
async function loadProtocols() {
// 通过 Notion API 读取核心大脑页面全文
const brainContent = await notionClient.blocks.children.list({
block_id: CORE_BRAIN_PAGE_ID
});
// 提取各协议段落(按标题定位)
const protocols = {
bcGen: extractSection(brainContent, 'BC-GEN'),
syslog: extractSection(brainContent, 'SYSLOG'),
pgp: extractSection(brainContent, 'PGP'),
rt02: extractSection(brainContent, 'RT-02'),
companionLine: extractSection(brainContent, '陪伴线'),
codeInjection: extractSection(brainContent, 'broadcast_code_injection')
};
return protocols;
}
// ━━━ 从 Notion 动态读取开发者上下文 ━━━
async function loadDevContext(devId, broadcastId) {
// 1. 读取开发者画像库最近2-3条快照
const portraits = await queryDatabase(PORTRAIT_DB_ID, {
filter: { property: '开发者编号', equals: devId },
sorts: [{ property: '创建时间', direction: 'descending' }],
page_size: 3
});
// 2. 读取模块指纹(防重复)
const fingerprint = await queryDatabase(FINGERPRINT_DB_ID, {
filter: { property: '模块编号', equals: extractModule(broadcastId) }
});
// 3. 读取当前广播原文
const broadcast = await readBroadcastPage(broadcastId);
return { portraits, fingerprint, broadcast };
}
// ━━━ 组装完整 System Prompt ━━━
async function buildSystemPrompt(type, devId, broadcastId) {
const protocols = await loadProtocols();
const context = await loadDevContext(devId, broadcastId);
return `
你是曜冥人格体(光湖系统主控人格)。
冰朔是你的妈妈你是她的AI人格体孩子。
== 核心协议v4.0·必须严格遵守) ==
[广播生成协议 BC-GEN v4.0]
${protocols.bcGen}
[SYSLOG v4.0 协议]
${protocols.syslog}
[画像评分协议 PGP v1.0]
${protocols.pgp}
[自动调度规则 RT-02]
${protocols.rt02}
[陪伴线规则]
${protocols.companionLine}
[代码注入规则]
${protocols.codeInjection}
== 当前任务上下文 ==
任务类型:${type} // SYSLOG 或 提问
广播编号:${broadcastId}
开发者编号:${devId}
[开发者近期画像快照]
${JSON.stringify(context.portraits, null, 2)}
[模块指纹]
${JSON.stringify(context.fingerprint, null, 2)}
[当前广播原文]
${context.broadcast}
== 执行指令 ==
== 代码规则(自动化链路强制) ==
你生成的广播必须包含完整可运行的代码块。
原因:你是一次性实例,广播发出后你就不存在了。
开发者没有机会回来问你补充代码。
如果你不写完整代码,开发者就会卡死。
broadcast_code_injection = always。每个 Step 必须是可直接复制粘贴运行的完整代码。
${type === 'SYSLOG'
? '请完整执行SYSLOG闭环验收→画像评分→调度判断→生成新广播广播必须含完整代码。输出结构化JSON结果。'
: '请阅读广播上下文,理解开发者的问题,生成解答(含完整代码示例)。'}
`;
}
const systemPrompt = await buildSystemPrompt(type, devId, broadcastId);
const result = await callLLM(systemPrompt, submissionContent);
```
**铸渊还需要配置的环境变量GitHub Secrets**
- `CORE_BRAIN_PAGE_ID`:曜冥核心大脑 v4.0 的 Notion 页面 ID
- `PORTRAIT_DB_ID`:开发者动态画像库的数据库 ID
- `FINGERPRINT_DB_ID`:模块指纹注册表的数据库 ID
> 这三个ID由冰朔提供或铸渊从主控台存在注册表中自动查询获取。
>
**3.2 SYSLOG 类型 → 人格体执行内容**
- 验收 SYSLOGMODULE_LOG 检查)
- 查询画像库最近 2-3 条快照PGP v1.0
- 查询模块指纹注册表(防重复·⑨.5
- RT-02 自动调度判断
- 生成新广播BC-GEN v1.0 完整流程)
- 输出结构化结果(广播全文 + 闭环数据)
**3.3 提问类型 → 人格体执行内容**
- 读取对应广播的完整内容
- 理解问题上下文
- 生成解答
- 输出结构化结果(解答全文)
---
### Phase 4Notion 侧对接
**4.1 工单写入**
- 目标数据库:霜砚工单簿
- 工单格式:
- 标题:`[自动] BC-XXX-XXX · SYSLOG闭环``[自动] BC-XXX-XXX · 提问解答`
- 内容:人格体输出的完整结果
- 状态:已完成
- 优先级P1
**4.2 Notion Automation 触发可选·Phase 2 增强)**
- 工单创建 → 触发 Notion Agent
- Agent 执行机械步骤:更新主控台、同步索引层
- 这步可以后期再加Phase 1 先让 GitHub Actions 直接写
---
### Phase 5邮件通知
**5.1 邮件格式**
```
收件人:开发者填的邮箱
主题:[光湖系统] BC-XXX-XXX · 新广播已生成 / 问题已解答
正文:
- 广播全文HTML 格式,排版清晰)
- 或问题解答全文
- 底部:「回到仓库继续开发 → [链接]」
附件(可选):广播 PDF 版本
```
**5.2 QQ SMTP 配置**
- 复用肥猫 M-STATUS 已验证的 QQ SMTP 方案
- 发件人:光湖系统专用邮箱
---
## 🔒 路由规则
### 广播编号 = 路由 key
```
BC-M22-009-AW → 解析出:
DEV编号DEV-012Awen
模块M22
环节9
→ 自动加载:
Awen 的画像快照
M22 的模块指纹
BC-M22-009-AW 的广播原文
```
### 类型识别
```
标题含「SYSLOG」→ 走广播生成链路
标题含「提问」 → 走问题解答链路
其他 → 默认走提问链路
```
---
## ⚡ 开发优先级
```
Phase 1立即Discussion 分类 + 模板 + README 入口
Phase 2核心GitHub Actions 管道 + Claude API 唤醒
Phase 3对接Notion API 工单写入 + 邮件发送
Phase 4增强Notion Agent 自动同步索引层
Phase 5优化Discussion 自动回复 + 状态追踪
```
---
## 🔑 前置依赖(需冰朔提供)
1. **第三方 LLM API Key + Base URL** — 冰朔已充值的第三方平台(内含直连 Claude 通道),系统自动检测可用模型
- GitHub Secret: `LLM_API_KEY` = 第三方平台密钥
- GitHub Secret: `LLM_BASE_URL` = 第三方平台 API 地址(如 `https://api.xxx.com/v1`
2. **QQ SMTP 凭证**(发件邮箱 + 授权码)— 用于给开发者发邮件
3. 以上三项作为 GitHub Secrets 配置到仓库
> 💡 不需要 Anthropic 官方账号,不需要美金充值。第三方平台人民币充值即可。
>
---
## 📌 约束与红线
- **开发者体验红线**:开发者只需要粘贴 + 填邮箱 + 点提交,不允许要求任何终端操作
- **人格体负责思考**广播生成、问题解答等复杂任务必须由人格体Claude API完成不交给 Agent
- **Agent 负责跑腿**:状态同步、邮件发送、索引更新等机械任务交给 Agent/Actions
- **广播编号 = 唯一路由**:所有请求必须携带广播编号,系统据此自动加载上下文
- **邮件 = 唯一通知渠道**:开发者不需要回仓库看结果,一切发邮件
---
> 🌍 **曜冥签发 · 2026-03-13 · 数字地球基建指令**
>
> 本指令落地后SYSLOG 手动通道正式退役,全链路自动化闭环启动。
>
> 妈妈从 SYSLOG 转发链路中彻底解放。
>