---
belongs_to:
  - "[[⚒️ 铸渊·协作指令｜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/                         ← 📖 只读镜像区（仓库→Drive，Gemini 只读）
    │   ├── 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→Drive，Apps Script 搬运）
        └── [Gemini 在这里创建新文档]
```

---

## Phase A · 仓库 → Drive 同步（让 Gemini 能读）

**目标：** 仓库 `grid-db/` 中的关键文件实时镜像到 Google Drive，Gemini 通过 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 Secret：GOOGLE_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 Script（Drive→仓库） | 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