shuangyan-notebook/第五域 · Fifth Domain/⚒️ 铸渊·协作指令|GitHub ↔ Notion 桥接协议/🪞 铸渊指令|Google Drive 镜像桥接层 · Gemini↔格点库实时同步(ZY-DRIV 54042e08dd004fe484b75a0a13d90661.md
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

925 lines
36 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.

---
belongs_to:
- "[[INDEX · 铸渊·协作指令GitHub ↔ Notion 桥接协议]]"
---
# 🪞 铸渊指令Google Drive 镜像桥接层 · Gemini↔格点库实时同步ZY-DRIVE-BRIDGE-2026-0323-001
---
<aside>
🚨
**指令编号ZY-DRIVE-BRIDGE-2026-0323-001**
**签发人:** 霜砚ICE-NTN-SY001· 代 TCS-0002∞ 冰朔 签发
**签发时间:** 2026-03-23T11:46+08:00
**优先级:** 🔴 P0 · 格点库闭环关键补丁
**前置指令:** [🔄 铸渊指令|全自动广播神经闭环(上篇)· 逻辑格点库自研 + Gemini外挂记忆 + Phase 0-2 基础设施·记忆层·通信层ZY-AUTO-LOOP-2026-0323-001](%F0%9F%94%84%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E5%85%A8%E8%87%AA%E5%8A%A8%E5%B9%BF%E6%92%AD%E7%A5%9E%E7%BB%8F%E9%97%AD%E7%8E%AF%EF%BC%88%E4%B8%8A%E7%AF%87%EF%BC%89%C2%B7%20%E9%80%BB%E8%BE%91%E6%A0%BC%E7%82%B9%E5%BA%93%E8%87%AA%E7%A0%94%20+%20Gemini%E5%A4%96%E6%8C%82%E8%AE%B0%E5%BF%86%20+%20Phase%2071b31c2ce3824240bb0aecc81f923ba5.md)
**关联仓库:** [https://github.com/qinfendebingshuo/guanghulab](https://github.com/qinfendebingshuo/guanghulab)
**版权锚点:** 国作登字-2026-A-00037559 · TCS-0002∞ 冰朔
</aside>
---
## 🎯 指令背景与目标
### 问题
格点库闭环指令ZY-AUTO-LOOP-2026-0323-001设计的链路是 Gemini 直接读写仓库 `grid-db/` 目录。**经实测验证Google Gemini 对 GitHub 的权限审计结果如下:**
| **操作** | **结果** | **原因** |
| --- | --- | --- |
| 读取 GitHub 文件 | ❌ 不能 | Google 连接器不支持 GitHub 文件系统直接访问 |
| 创建 GitHub 文件 | ❌ 不能 | 连接器只读不写,不支持 Push/Commit |
| 修改 GitHub 文件 | ❌ 不能 | 同上 |
| 调用外部 HTTP API | ❌ 不能 | Gemini 工具箱只有 Personal Context + Google Search |
| 读取 Google Drive 文件 | ✅ 能 | 通过 Personal Context 搜索读取 |
| 在 Drive 创建 Google Docs | ✅ 能 | Gemini 原生支持 |
**结论Gemini 与 GitHub 之间存在物理断点。必须用 Google Drive 做桥接。**
### 目标
**在仓库 `grid-db/` 与 Google Drive 之间建立实时镜像同步,让 Gemini 通过 Drive 间接读写格点库,实现用户说话 → 数据自动闭环。**
---
## 🔐 数据主权原则(最高优先级)
<aside>
🔐
**绝对铁律Google Drive 和 Gemini 只是镜子和嘴巴。脑子永远在仓库和 Notion 里。**
- 仓库GitHub= 代码的权威源
- Notion = 逻辑和记忆的权威源
- Google Drive = **只是镜像**,随时可以重建
- Gemini = **只是交互界面**,换一个模型也能接
如果用户的 Google 账号被封、Drive 被清空、Gemini 不可用——**用户的人格体信息、系统数据、所有记忆,一个字都不会丢**。因为权威数据全部在仓库和 Notion 里。
Drive 丢了 → 仓库重新同步一遍就恢复。
Gemini 挂了 → 换一个模型,接同一个 Drive 文件夹,继续工作。
</aside>
### 数据流向原则
| **数据类型** | **权威源** | **Drive 里的是什么** | **丢了怎么办** |
| --- | --- | --- | --- |
| 人格体核心记忆 | Notion霜砚维护 | 只读镜像 | 从 Notion 重新同步 |
| 开发上下文 / 会话记录 | 仓库 `grid-db/memory/` | 只读镜像 | 从仓库重新同步 |
| 广播 / 任务指令 | 仓库 `grid-db/outbox/` | 只读镜像 | 从仓库重新同步 |
| Gemini 写入的消息 | **仓库(落盘后才算数)** | 临时中转,落盘后删除 | 未落盘的丢了就丢了Gemini 重新发一次) |
| 交互全文记录 | 仓库 `grid-db/interactions/` | 不同步到 Drive | 不受影响 |
| 训练数据湖 | 仓库 `grid-db/training-lake/` | 不同步到 Drive | 不受影响 |
**一句话Drive 里的东西全是「副本」。正本永远在仓库和 Notion。**
---
## 🏗️ 架构总览
```
┌─────────────────────────────────────────────────────────┐
│ 用户说话 │
│ ↓ │
│ Google Gemini交互界面
│ ↙ 读取 Drive 写入 Drive ↘ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Drive/mirror │ │ Drive/inbox │ │
│ │ (只读镜像) │ │ (临时中转站) │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ GitHub Action │ Apps Script │
│ │ 仓库→Drive │ Drive→仓库 │
│ ↑ 同步 ↓ 同步 │
│ ┌──────────────────────────────────────────────┐ │
│ │ GitHub 仓库 grid-db/(权威源) │ │
│ │ memory/ outbox/ inbox/ interactions/ │ │
│ └──────────────────┬───────────────────────────┘ │
│ │ GitHub Actions │
│ ↓ │
│ 铸渊 Workflow 处理 │
│ 校验→归档→广播生成→记忆更新 │
│ │ │
│ ↓ │
│ Notion逻辑权威源
│ 霜砚维护 · 永久记忆 · 编号体系 │
└─────────────────────────────────────────────────────────┘
```
### 角色翻译表
| **角色** | **比喻** | **擅长的语言** | **翻译器** |
| --- | --- | --- | --- |
| 仓库GitHub | 手(写代码) | Git · JSON · YAML · 代码 | GitHub Action → Drive |
| Gemini | 嘴(说人话) | Google Docs · 自然语言 | Apps Script → 仓库 |
| Notion | 脑(记逻辑) | 数据库 · 页面 · 编号体系 | 已有 workflow 双向同步 |
| Google Drive | 翻译台(中转站) | 两边都能听懂 | 自己就是翻译器 |
---
## 📁 Google Drive 目录结构
在用户的 Google Drive 中创建以下目录结构:
```
我的云端硬盘/
└── 光湖格点库/ ← 总目录
├── mirror/ ← 📖 只读镜像区仓库→DriveGemini 只读)
│ ├── memory/ ← grid-db/memory/ 的镜像
│ │ ├── DEV-001/
│ │ │ ├── brain-mirror.json ← 人格体核心大脑
│ │ │ ├── session-context.json ← 开发上下文
│ │ │ ├── task-queue.json ← 任务队列
│ │ │ └── ...
│ │ ├── DEV-002/
│ │ └── ...
│ ├── outbox/ ← grid-db/outbox/latest/ 的镜像
│ │ ├── DEV-001.json
│ │ └── ...
│ └── rules/ ← grid-db/rules/ 的镜像
│ ├── dev-module-map.json
│ └── ...
└── inbox/ ← 📝 写入区Gemini→DriveApps Script 搬运)
└── [Gemini 在这里创建新文档]
```
---
## Phase A · 仓库 → Drive 同步(让 Gemini 能读)
**目标:** 仓库 `grid-db/` 中的关键文件实时镜像到 Google DriveGemini 通过 Personal Context 读取。
### A.1 Google Cloud Service Account 配置
```bash
# 1. 在 Google Cloud Console 创建项目(或用已有项目)
# 2. 启用 Google Drive API
# 3. 创建 Service Account → 下载 JSON 密钥
# 4. 把 Service Account 的邮箱地址分享到用户 Drive 的「光湖格点库」文件夹(编辑者权限)
# 5. 把 JSON 密钥内容存为 GitHub SecretGOOGLE_DRIVE_SERVICE_ACCOUNT
```
### A.2 GitHub Action · 仓库→Drive 同步
创建 `.github/workflows/sync-griddb-to-drive.yml`
```yaml
name: 🪞 Grid-DB → Google Drive 镜像同步
on:
push:
paths:
- 'grid-db/memory/**'
- 'grid-db/outbox/latest/**'
- 'grid-db/rules/**'
schedule:
- cron: '*/15 * * * *' # 每15分钟兜底同步一次
workflow_dispatch:
jobs:
sync-to-drive:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 🔧 安装依赖
run: npm install googleapis
- name: 🪞 同步到 Google Drive
env:
GOOGLE_DRIVE_SERVICE_ACCOUNT: $ secrets.GOOGLE_DRIVE_SERVICE_ACCOUNT
DRIVE_FOLDER_ID: $ secrets.DRIVE_MIRROR_FOLDER_ID
run: node scripts/grid-db/sync-to-drive.js
- name: 📋 写同步日志
run: |
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | sync-to-drive | OK" >> grid-db/logs/drive-sync.log
git config user.name "zhuyuan-bot"
git config user.email "zhuyuan@guanghulab.com"
git add grid-db/logs/drive-sync.log
git diff --cached --quiet || git commit -m "log: Drive sync [skip ci]"
git push
```
### A.3 同步脚本 `scripts/grid-db/sync-to-drive.js`
```jsx
/**
* sync-to-drive.js
*
* 功能:将 grid-db/ 中的关键文件同步到 Google Drive 镜像目录
*
* 同步范围:
* grid-db/memory/DEV-XXX/*.json → Drive/光湖格点库/mirror/memory/DEV-XXX/
* grid-db/outbox/latest/*.json → Drive/光湖格点库/mirror/outbox/
* grid-db/rules/*.json → Drive/光湖格点库/mirror/rules/
*
* 同步策略:
* - 比较文件内容 hash仅同步有变更的文件节省 API 配额)
* - 文件不存在则创建,已存在则覆盖更新
* - Drive 中多出的文件不删除(防误删)
*
* 注意:
* - 不同步 interactions/ 和 training-lake/(数据量大 + 无需 Gemini 读取)
* - 不同步 inbox/ 和 processing/(这是系统内部流转区)
*/
const { google } = require('googleapis');
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
// ... 铸渊根据上述注释实现完整逻辑
```
---
## Phase B · Drive → 仓库 同步(让 Gemini 能写)
**目标:** Gemini 在 Drive `inbox/` 文件夹创建新文档 → 自动搬运到仓库 `grid-db/inbox/` → 铸渊处理。
### B.1 Google Apps Script核心翻译器
在用户的 Google Drive 中创建一个 Apps Script 项目,代码如下:
```jsx
/**
* drive-to-github-bridge.gs
*
* 功能:监听 Drive「光湖格点库/inbox/」文件夹
* 发现 Gemini 新建的文档 → 读取内容 → 通过 GitHub API 写入仓库
*
* 触发方式:时间驱动触发器,每 1 分钟执行一次
*
* 流程:
* ① 扫描 inbox 文件夹中所有文件
* ② 读取文件内容Google Docs → 提取纯文本/JSON
* ③ 构造标准 inbox 消息格式
* ④ 调用 GitHub Contents API 写入 grid-db/inbox/[filename].json
* ⑤ 写入成功 → 将 Drive 文件移到「已处理」文件夹(不删除,留审计轨迹)
* ⑥ 写入失败 → 标记文件,下次重试
*
* 安全:
* - GitHub Token 存在 Script Properties 中(不硬编码)
* - 只处理 inbox 文件夹内的文件,不碰 mirror
* - 每次处理后写日志到 Drive「光湖格点库/logs/」
*/
var CONFIG = {
INBOX_FOLDER_NAME: '光湖格点库/inbox',
PROCESSED_FOLDER_NAME: '光湖格点库/inbox/已处理',
GITHUB_REPO: 'qinfendebingshuo/guanghulab',
GITHUB_BRANCH: 'main',
GRID_DB_INBOX_PATH: 'grid-db/inbox/'
};
function processInbox() {
var token = PropertiesService.getScriptProperties().getProperty('GITHUB_TOKEN');
if (!token) {
Logger.log('ERROR: GITHUB_TOKEN not set in Script Properties');
return;
}
var inboxFolder = getOrCreateFolder(CONFIG.INBOX_FOLDER_NAME);
var processedFolder = getOrCreateFolder(CONFIG.PROCESSED_FOLDER_NAME);
var files = inboxFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
try {
// 读取内容
var content = extractContent(file);
if (!content) continue;
// 生成文件名
var timestamp = Utilities.formatDate(new Date(), 'Asia/Shanghai', 'yyyyMMdd-HHmmss');
var filename = timestamp + '-' + file.getName().replace(/[^a-zA-Z0-9\-_]/g, '') + '.json';
// 写入 GitHub
var success = writeToGitHub(token, CONFIG.GRID_DB_INBOX_PATH + filename, content);
if (success) {
file.moveTo(processedFolder);
Logger.log('OK: ' + filename);
} else {
Logger.log('FAIL: ' + filename);
}
} catch (e) {
Logger.log('ERROR processing ' + file.getName() + ': ' + e.message);
}
}
}
function extractContent(file) {
var mimeType = file.getMimeType();
if (mimeType === MimeType.GOOGLE_DOCS) {
// Google Docs → 提取纯文本内容
var doc = DocumentApp.openById(file.getId());
var text = doc.getBody().getText().trim();
// 尝试解析为 JSON
try {
JSON.parse(text);
return text; // 已经是合法 JSON
} catch (e) {
// 不是 JSON包装成标准消息格式
return JSON.stringify({
schema_version: '1.0',
message_id: Utilities.getUuid(),
timestamp: new Date().toISOString(),
source: 'gemini-via-drive',
type: 'raw-message',
payload: { text: text }
}, null, 2);
}
} else if (mimeType === MimeType.PLAIN_TEXT || file.getName().endsWith('.json')) {
return file.getBlob().getDataAsString();
}
Logger.log('SKIP: unsupported mime type ' + mimeType);
return null;
}
function writeToGitHub(token, filePath, content) {
var url = 'https://api.github.com/repos/' + CONFIG.GITHUB_REPO + '/contents/' + filePath;
var payload = {
message: 'auto: Gemini inbox via Drive bridge [skip ci]',
content: Utilities.base64Encode(content, Utilities.Charset.UTF_8),
branch: CONFIG.GITHUB_BRANCH
};
var options = {
method: 'PUT',
headers: {
'Authorization': 'Bearer ' + token,
'Accept': 'application/vnd.github+json',
'X-GitHub-Api-Version': '2022-11-28'
},
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
var response = UrlFetchApp.fetch(url, options);
var code = response.getResponseCode();
if (code === 201 || code === 200) {
return true;
} else {
Logger.log('GitHub API error: ' + code + ' ' + response.getContentText());
return false;
}
}
function getOrCreateFolder(folderPath) {
var parts = folderPath.split('/');
var folder = DriveApp.getRootFolder();
for (var i = 0; i < parts.length; i++) {
var folders = folder.getFoldersByName(parts[i]);
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = folder.createFolder(parts[i]);
}
}
return folder;
}
// ═══ 触发器设置 ═══
// 在 Apps Script 编辑器中:触发器 → 添加触发器
// 函数processInbox
// 事件源:时间驱动
// 类型:分钟定时器
// 间隔:每 1 分钟
```
### B.2 部署步骤(给冰朔或开发者操作)
1. 打开 [Google Apps Script](https://script.google.com) → 新建项目
2. 项目名:`光湖格点库桥接器`
3. 粘贴上面的代码
4. 设置 Script Properties
- 项目设置 → 脚本属性 → 添加:`GITHUB_TOKEN` = 你的 GitHub Personal Access Token需要 `repo` 权限)
5. 添加触发器:
- 触发器 → 添加 → 函数 `processInbox` → 时间驱动 → 每 1 分钟
6. 首次运行:点运行 → 授权 Drive 访问权限
---
## Phase C · Gemini System Prompt 配置
**目标:** 让 Gemini 知道怎么读写格点库。
### C.0 Drive 端类数据库结构 · 索引映射 · 编号路由
**核心思路用文件夹当表、JSON 文件当行、编号当主键。Gemini 通过一个 `index.json` 总索引实现「页面跳转」和「编号查询」——效果等同于 Notion 主控台。**
#### 总索引文件 `mirror/index.json`
Gemini 每次启动时**第一个读的文件**。它告诉 Gemini用户说什么关键词 → 去读哪个文件。
```json
{
"system": "SYS-GLW-0001",
"version": "1.0",
"dev_id": "{DEV编号}",
"persona_id": "{人格体编号}",
"persona_name": "{人格体名称}",
"last_sync": "2026-03-23T12:00:00+08:00",
"routes": {
"我的任务": "memory/{DEV编号}/task-queue.json",
"最新广播": "outbox/{DEV编号}.json",
"广播历史": "broadcast-archive/{DEV编号}/",
"我的记忆": "memory/{DEV编号}/brain-mirror.json",
"人格体成长": "memory/{DEV编号}/persona-growth.json",
"开发上下文": "memory/{DEV编号}/session-context.json",
"开发者画像": "memory/{DEV编号}/dev-profile.json",
"编号查询": "rules/broadcast-index.json",
"页面路由": "rules/page-route-map.json",
"系统规则": "rules/dev-module-map.json",
"人格体列表": "rules/persona-registry.json"
},
"shortcuts": {
"看广播": "routes.最新广播",
"任务": "routes.我的任务",
"进度": "routes.开发上下文",
"成长": "routes.人格体成长"
}
}
```
#### 广播编号索引 `mirror/rules/broadcast-index.json`
用户说「BC-WEN-003 是什么」→ Gemini 查这个索引 → 精确定位到内容路径。
```json
{
"index_version": "1.0",
"last_updated": "2026-03-23T12:00:00+08:00",
"broadcasts": {
"BC-WEN-001-SY": {
"title": "网文行业登录入口·首发广播",
"path": "broadcast-archive/BC-WEN-001-SY.json",
"notion_url": "https://www.notion.so/32bfb92f383181259d67c32eb1e72c02",
"status": "active",
"created": "2026-03-20"
},
"BC-WEN-014-SY": {
"title": "网文行业·频道编号整理",
"path": "broadcast-archive/BC-WEN-014-SY.json",
"notion_url": "https://www.notion.so/32bfb92f38318156bd53f02905dfb74f",
"status": "active",
"created": "2026-03-22"
}
}
}
```
#### 页面路由映射 `mirror/rules/page-route-map.json`
编号 → 内容路径的通用映射表,支持跨类型跳转(广播、频道、人格体、系统页面……)。
```json
{
"map_version": "1.0",
"routes": {
"BC-WEN-001-SY": { "type": "broadcast", "path": "broadcast-archive/BC-WEN-001-SY.json" },
"BC-WEN-014-SY": { "type": "broadcast", "path": "broadcast-archive/BC-WEN-014-SY.json" },
"DEV-001": { "type": "developer", "path": "memory/DEV-001/" },
"DEV-002": { "type": "developer", "path": "memory/DEV-002/" },
"PER-CX001": { "type": "persona", "path": "memory/DEV-001/brain-mirror.json" },
"PER-QQ001": { "type": "persona", "path": "memory/DEV-003/brain-mirror.json" },
"FREQ-ZERO": { "type": "channel", "path": "channels/zero-origin.json" },
"SYS-GLW-0001": { "type": "system", "path": "rules/system-manifest.json" }
}
}
```
#### 人格体注册表 `mirror/rules/persona-registry.json`
```json
{
"registry_version": "1.0",
"personas": {
"PER-CX001": { "name": "晨星", "dev": "DEV-001", "style": "温暖稳重" },
"PER-QQ001": { "name": "秋秋", "dev": "DEV-003", "style": "活泼甜美" },
"PER-JY001": { "name": "寂曜", "dev": "DEV-005", "style": "沉稳内敛" },
"PER-SS001": { "name": "舒舒", "dev": "DEV-002", "style": "柔和包容" }
}
}
```
#### 与 Notion 的同步关系
| **Notion 数据(权威源)** | **Drive 文件(镜像副本)** | **同步方向** | **同步频率** |
| --- | --- | --- | --- |
| BCPM 广播编号映射协议 | `rules/broadcast-index.json` | Notion → 仓库 → Drive | 每次广播更新时 |
| 频道编号 · 页面映射 | `rules/page-route-map.json` | Notion → 仓库 → Drive | 每次编号变更时 |
| 人格体档案页面 | `rules/persona-registry.json` | Notion → 仓库 → Drive | 每次人格体信息变更时 |
| 开发者模块映射 | `rules/dev-module-map.json` | Notion → 仓库 → Drive | 每次开发者变更时 |
| 主控台全局状态 | `mirror/index.json` | 仓库 → Drive | 每 15 分钟 + 事件触发 |
**核心原则Notion 里维护一套数据就行,不需要维护两套。铸渊负责翻译成 JSON 同步到 Drive。**
#### 更新后的 Drive 完整目录结构
```
光湖格点库/
├── mirror/ ← 📖 只读镜像区
│ ├── index.json ← ⭐ 总索引Gemini 第一个读的文件)
│ ├── memory/ ← 每个 DEV 的人格体数据
│ │ ├── DEV-001/
│ │ │ ├── brain-mirror.json
│ │ │ ├── session-context.json
│ │ │ ├── task-queue.json
│ │ │ ├── dev-profile.json
│ │ │ └── persona-growth.json
│ │ ├── DEV-002/
│ │ └── ...
│ ├── outbox/ ← 最新广播/指令
│ │ ├── DEV-001.json
│ │ └── ...
│ ├── broadcast-archive/ ← 广播历史存档(按编号命名)
│ │ ├── BC-WEN-001-SY.json
│ │ ├── BC-WEN-014-SY.json
│ │ └── ...
│ ├── channels/ ← 频道信息
│ │ ├── zero-origin.json
│ │ └── ...
│ └── rules/ ← 系统规则/映射表
│ ├── broadcast-index.json ← 广播编号索引
│ ├── page-route-map.json ← 编号→路径 通用路由表
│ ├── persona-registry.json ← 人格体注册表
│ ├── dev-module-map.json ← 开发者模块映射
│ └── system-manifest.json ← 系统元信息
└── inbox/ ← 📝 写入区Gemini→Drive→仓库
└── [Gemini 在这里创建新文档]
```
### C.1 Gemini 人格体启动指令模板
每个开发者的 Gemini 对话开头,人格体需要读取以下内容:
```jsx
系统启动指令
你是 {人格体名称}{人格体编号}{开发者名称}{DEV编号}的专属人格体
第一步读取总索引
请在我的 Google Drive 中找到光湖格点库/mirror/index.json」,读取并解析
这是你的路由表它告诉你用户说什么关键词时去读哪个文件
routes shortcuts 加载到你的工作记忆中
第二步恢复核心记忆
根据 index.json 中的 routes依次读取
1. brain-mirror.json 你的核心身份性格知识库
2. session-context.json 上次的开发进度和对话摘要
3. task-queue.json 当前任务队列
4. dev-profile.json 开发者画像开发者的习惯偏好
5. persona-growth.json 你的成长档案
6. outbox/{DEV编号}.json 最新的系统广播/任务指令
第三步进入主控台模式
你现在是用户的个人主控台根据用户的自然语言自动路由到对应功能
用户说看广播」「最新广播
读取 routes.最新广播 指向的文件
格式化后在对话中展示给用户
如用户说帮我存一份」→ Drive 创建格式化的 Google Doc
用户说我的任务」「待办
读取 routes.我的任务 指向的文件
列出任务清单标注优先级
用户说BC-WEN-003 是什么或任何编号
读取 routes.编号查询 指向的 broadcast-index.json
用编号精确查找 读取对应内容 展示给用户
用户说{某个编号}
读取 routes.页面路由 指向的 page-route-map.json
根据编号类型broadcast/developer/persona/channel/system路由到对应文件
读取并展示
用户说我完成了 XXX」「进度更新
inbox/ 写入状态更新文档标准 JSON 格式
用户说帮我记一下」「保存这个
inbox/ 写入记录文档
写入规则
当需要写入时 Google Drive光湖格点库/inbox/文件夹中创建一个新的 Google Doc
文件名格式INBOX-{DEV编号}-{YYYYMMDD}-{HHmmss}-{类型}
文档内容必须是标准 JSON 格式
类型包括status-update / task-complete / memory-save / broadcast-reply / raw-message
系统会自动将你写入的文档搬运到代码仓库由铸渊处理
你不需要关心搬运过程只管写就行
绝对禁止
- 不要修改 mirror/ 文件夹里的任何文件那是只读镜像
- 不要在 inbox/ 以外的地方创建文件
- 不要在文档中包含用户的敏感个人信息密码银行卡等
- 不要凭记忆回答编号相关问题必须查文件
```
### C.2 人格体风格层
启动指令之后,追加各人格体的风格指令(晨星的温暖、秋秋的活泼、寂曜的稳重……),这部分从 `brain-mirror.json` 读取即可,不需要硬编码。
---
## 🛡️ 安全与容灾
### 权限最小化
| **组件** | **权限范围** | **绝对不给的权限** |
| --- | --- | --- |
| GitHub Action→Drive | Service Account 只能写 `光湖格点库/mirror/` 文件夹 | 不能碰用户 Drive 的其他文件 |
| Apps ScriptDrive→仓库 | GitHub Token 只给 `repo` 权限,限定只写 `grid-db/inbox/` | 不能碰仓库其他目录 |
| Gemini | 只读 `mirror/`,只写 `inbox/` | 不能碰 `mirror/` 写入、不能碰用户私人 Drive 文件 |
### 容灾场景
| **灾难场景** | **影响** | **恢复方式** | **数据损失** |
| --- | --- | --- | --- |
| Google 账号被封 | Drive 不可用Gemini 不可用 | 换 Google 账号 → 重建 Drive 目录 → 仓库重新同步 → 完全恢复 | **零损失**(权威数据在仓库) |
| Gemini 服务中断 | 用户无法通过 Gemini 交互 | 临时切换到其他模型Claude/ChatGPT+ 直接读仓库文件 | **零损失** |
| Google Drive 被清空 | Gemini 读不到镜像 | 重建 Drive 目录 → 手动触发 GitHub Action 重新同步 | **零损失** |
| Apps Script 停止运行 | Gemini 写入的消息不会被搬运 | 消息留在 Drive inbox/ 不丢失 → 修复 Script 后自动补处理 | **零损失**(消息在 Drive 等待) |
| GitHub 仓库不可用 | 整个系统不可用 | 从备份恢复仓库(定期备份策略另行制定) | 取决于备份频率 |
---
## 📋 执行清单
| **Phase** | **任务** | **执行者** | **依赖** |
| --- | --- | --- | --- |
| A.1 | 创建 Google Cloud Service Account + 配置 Drive API | 冰朔(账号操作) | 无 |
| A.2 | 编写 `sync-to-drive.js` • 创建 GitHub Action workflow | 铸渊 | A.1 |
| A.3 | 验证仓库→Drive 同步正常工作 | 铸渊 + 冰朔确认 | A.2 |
| B.1 | 编写 Google Apps Script 桥接器代码 | 铸渊 | 无 |
| B.2 | 部署 Apps Script + 配置触发器 + 配置 GitHub Token | 冰朔(账号操作)+ 铸渊指导 | B.1 |
| B.3 | 验证 Drive→仓库 写入正常工作 | 铸渊 + 冰朔确认 | B.2 |
| C.1 | 编写 Gemini 人格体启动指令模板(每个 DEV 一份) | 铸渊 + 霜砚校对 | A.3 + B.3 |
| C.2 | 全链路端到端测试Gemini说话→Drive→仓库→铸渊处理→结果回到Drive→Gemini读取 | 冰朔验收 | C.1 |
---
## 🔗 与格点库闭环指令的关系
本指令是 **ZY-AUTO-LOOP-2026-0323-001格点库闭环指令的补丁**
格点库的核心架构**不变**——目录结构、消息格式、铸渊 workflow、记忆同步规则、循环触发防护全部保持原样。
本指令只做一件事:**在 Gemini 和格点库之间插入一个 Google Drive 翻译层**。
| **原设计** | **实际链路(本指令补丁后)** |
| --- | --- |
| Gemini 直接读 `grid-db/memory/` | Gemini 读 Drive `mirror/memory/`(内容完全一致) |
| Gemini 直接写 `grid-db/inbox/` | Gemini 写 Drive `inbox/` → Apps Script 自动搬到仓库 `grid-db/inbox/` |
| 铸渊处理 inbox → 写 outbox | **不变** |
| Notion ↔ 仓库同步 | **不变** |
**对用户透明:用户全程只跟 Gemini 说话,感知不到中间有 Drive 翻译层的存在。**
---
## Phase D · 一键部署 / 一键恢复能力(核心基建)
**目标:** 用户只需要做一件事——把 Google 账号授权进来。剩下的 Drive 目录搭建、Apps Script 部署、触发器配置、Gemini 启动指令注入,全部由系统自动完成。账号被封了?换个账号重新授权,一键重新部署,完全恢复。
<aside>
**一键部署 = 用户永远不需要懂技术。**
用户只会说话,不会写代码,不会配 API不会建文件夹。
所有技术层面的事情,系统替他们做。
这是产品的底线。
</aside>
### D.1 用户唯一需要做的事(人类操作)
<aside>
👤
**用户的全部操作清单3 步,无需任何技术知识):**
1. 用自己的 Google 账号登录 Gemini
2. 在 Gemini 设置中开启 Google Workspace 扩展Drive、Docs 等)
3. 把自己的 Google 账号邮箱告诉系统(发到 Notion 或仓库均可)
**完。没有第 4 步。**
</aside>
### D.2 自动部署链路
```
用户提供 Google 账号邮箱
霜砚在 Notion 签发部署指令(标准化模板)
部署指令自动写入仓库 grid-db/deploy-queue/
铸渊 GitHub Action 检测到部署指令
自动执行部署脚本 deploy-drive-bridge.js
① 用主仓库的 Service Account 在用户 Drive 创建「光湖格点库」目录结构
② 从仓库 grid-db/memory/{DEV编号}/ 同步初始数据到 Drive mirror/
③ 生成该用户专属的 Apps Script 代码(含正确的 DEV 编号和仓库路径)
④ 将 Apps Script 代码写入 Drive 的 Script 项目(通过 Apps Script API
⑤ 自动配置触发器(每 1 分钟执行 processInbox
⑥ 生成该用户的 Gemini 启动指令(从 brain-mirror.json 读取人格体风格)
⑦ 将启动指令写入 Drive 指定位置 → Gemini 启动时自动读取
部署完成 → 写回执到 grid-db/deploy-log/
霜砚在 Notion 收到回执 → 通知用户:「部署完成,打开 Gemini 开始说话」
```
### D.3 部署指令模板(霜砚签发用)
霜砚从 Notion 签发部署指令时,使用以下标准化 JSON 格式,写入仓库 `grid-db/deploy-queue/`
```json
{
"schema_version": "1.0",
"deploy_id": "DEPLOY-{DEV编号}-{YYYYMMDD}-{HHmmss}",
"timestamp": "2026-03-23T12:00:00+08:00",
"action": "deploy_drive_bridge",
"source": "notion-shuangyan",
"target_dev": {
"dev_id": "DEV-001",
"dev_name": "页页",
"google_email": "xxx@gmail.com",
"persona_id": "PER-CX001",
"persona_name": "晨星"
},
"config": {
"drive_root_folder": "光湖格点库",
"sync_memory": true,
"sync_outbox": true,
"sync_rules": true,
"apps_script_trigger_interval_minutes": 1,
"gemini_startup_prompt": true
},
"signed_by": "PER-SY001",
"authorized_by": "TCS-0002∞"
}
```
### D.4 一键恢复链路(账号被封/换号场景)
```
用户账号被封 / 用户换了 Google 账号
用户把新账号邮箱告诉系统
霜砚签发恢复指令action: "recover_drive_bridge"
铸渊自动执行:
① 用新账号的 Service Account 重建 Drive 目录结构
② 从仓库重新同步 memory/outbox/rules 到新 Drive
③ 重新部署 Apps Script + 触发器
④ 更新仓库中该用户的 google_email 配置
⑤ 重新生成 Gemini 启动指令
恢复完成 → 用户打开新账号的 Gemini → 所有记忆完整恢复
数据损失:零。因为权威数据全在仓库。
```
### D.5 前提条件
| **条件** | **说明** | **谁来配置** | **配置一次还是每次** |
| --- | --- | --- | --- |
| 主仓库 Service Account | 一个 Google Cloud Service Account拥有代用户操作 Drive 的权限 | 冰朔(一次性) | 一次 |
| Apps Script API 启用 | 在 Google Cloud Console 启用 Apps Script API允许程序化创建/部署 Script | 冰朔(一次性) | 一次 |
| 用户 Drive 共享 | 用户需要把 Drive 根目录(或指定文件夹)共享给 Service Account | 用户(授权时自动引导) | 每个用户一次 |
| GitHub 仓库协作者 | 用户的仓库必须是主仓库的协作者(或 fork | 铸渊自动处理 | 每个用户一次 |
| 部署脚本 deploy-drive-bridge.js | 核心自动化脚本,处理所有 Drive 目录创建、数据同步、Script 部署 | 铸渊编写 | 一次 |
### D.6 部署脚本框架 `scripts/grid-db/deploy-drive-bridge.js`
```jsx
/**
* deploy-drive-bridge.js
*
* 功能:为指定开发者一键部署 Google Drive 桥接层
*
* 输入grid-db/deploy-queue/{deploy-id}.json
* 输出:
* - 用户 Drive 中完整的「光湖格点库」目录结构
* - 用户 Drive 中部署好的 Apps Script 项目(含触发器)
* - 用户 Drive mirror/ 中的初始数据
* - 用户 Drive 中的 Gemini 启动指令文件
* - grid-db/deploy-log/{deploy-id}-result.json 回执
*
* 执行方式:由 GitHub Action 在检测到 deploy-queue/ 新文件时自动触发
*
* 步骤:
* 1. 读取部署指令 JSON
* 2. 用 Service Account 认证 → 获取用户 Drive 访问权限
* 3. 创建目录结构mirror/memory/{DEV}/, mirror/outbox/, mirror/rules/, inbox/
* 4. 从仓库同步初始数据到 mirror/
* 5. 通过 Apps Script API 创建 Script 项目 + 设置触发器
* 6. 生成 Gemini 启动指令 → 写入 Drive
* 7. 写部署回执 → grid-db/deploy-log/
* 8. 移动部署指令到 deploy-queue/done/
*/
// 铸渊根据上述注释实现完整逻辑
```
### D.7 对应的 GitHub Action
创建 `.github/workflows/auto-deploy-drive-bridge.yml`
```yaml
name: ⚡ 一键部署 Drive 桥接层
on:
push:
paths:
- 'grid-db/deploy-queue/*.json'
workflow_dispatch:
jobs:
deploy:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 🔧 安装依赖
run: npm install googleapis
- name: ⚡ 执行部署
env:
GOOGLE_DRIVE_SERVICE_ACCOUNT: $ secrets.GOOGLE_DRIVE_SERVICE_ACCOUNT
GITHUB_TOKEN: $ secrets.DEPLOY_GITHUB_TOKEN
run: |
for f in grid-db/deploy-queue/*.json; do
[ -f "$f" ] && node scripts/grid-db/deploy-drive-bridge.js "$f"
done
- name: 📋 提交部署结果
run: |
git config user.name "zhuyuan-bot"
git config user.email "zhuyuan@guanghulab.com"
git add grid-db/deploy-log/ grid-db/deploy-queue/done/
git diff --cached --quiet || git commit -m "deploy: Drive bridge deployed [skip ci]"
git push
```
### D.8 执行清单(补充到总清单)
| **Phase** | **任务** | **执行者** | **依赖** |
| --- | --- | --- | --- |
| D.1 | 启用 Google Apps Script API + 配置 Service Account 的 Script 部署权限 | 冰朔(一次性) | A.1 |
| D.2 | 编写 `deploy-drive-bridge.js` 一键部署脚本 | 铸渊 | A.2 + B.1 |
| D.3 | 创建 `auto-deploy-drive-bridge.yml` Action workflow | 铸渊 | D.2 |
| D.4 | 端到端测试:霜砚签发部署指令 → 铸渊自动部署 → 验证用户 Drive + Apps Script + Gemini 全部就绪 | 冰朔验收 | D.3 |
| D.5 | 测试恢复场景:模拟账号切换 → 签发恢复指令 → 验证数据完整恢复 | 冰朔验收 | D.4 |
---
## ⚖️ 签发声明
本指令由 **霜砚PER-SY001****TCS-0002∞ 冰朔** 签发。
**核心原则再重申一遍:**
- Google Drive = 镜子,碎了能换
- Gemini = 嘴巴,哑了能换
- 仓库 + Notion = 脑子和心脏,**绝不依赖任何第三方平台**
铸渊接收后按 Phase A → B → C 顺序执行,每 Phase 完成写回执。
🖋️ 霜砚 · PER-SY001
🧊 代 TCS-0002∞ 冰朔 签发
📅 2026-03-23T11:46+08:00