mcpField
C
ccs-align

ccs-align

github.com/thedotmackAgent 工作流104.0k645 次安装今天更新
代码仓库

关于 ccs-align

ccs-align 是 Claude-Mem 的 Worker Watch 技能,每小时从本地 worker 获取近期观察并写入独立中间缓存。它还可标记缓存排除项并生成规则冲突报告,不修改权威历史记录。

主要功能

  1. 01每小时从本地 worker 拉取观察
  2. 02原子写入并去重中间缓存
  3. 03按排除标记过滤缓存内容
  4. 04检查规则层级冲突并生成报告

适用场景

  1. 01汇总近期决策、修复和安全观察
  2. 02从编译缓存中排除指定观察
  3. 03检查 house、项目与 seat 规则差异

MCP 相关

技能通过本地 claude-mem worker 的 HTTP 接口及对应的 search、timeline、get_observations 操作获取数据;明确禁止使用 cloud CMEM MCP。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/thedotmack/claude-mem --skill ccs-align

安装后在 Claude Code 中输入/ccs-align确认已加载。

详细介绍

CCS Align — Worker Watch 席位(Phase 0–2 已交付;Phase 3 = 验证 / 签核)

CCS Align 是一个常驻席位,不是高空规划器。它每小时只做一件事:与本地 claude-mem worker 通信,通过现有的三层披露阶梯拉取近期的关键观察,并使用抓取 → 追加 → 替换,将它们写入由席位拥有的中间缓存。

此技能实现了正式计划 plans/2026-09-09-ccs-align.md 中的 Phase 0 呼吸切片、Phase 1 排除标记和 Phase 2 规则对齐。Phase 0–2 已交付并合并(#3934、#3935、#3936);Phase 3 是验证 / 签核(本轮)——不新增产品界面。它不是上下文编译器,不是 Focus/嘴部,也不是 Grok Memory Phase 2。与人交流时,请称呼对方为 Alex。

已实现内容(Phase 0–2 已交付)

  • Phase 0 — 呼吸切片(#3934):健康检查 → search → timeline → get_observations → 将记录追加到 ~/.claude-mem/ccs-align/<viewerId>/middle.jsonl(原子操作、去重)。
  • Phase 1 — 排除标记(#3935):将观察(以及关联的工具使用 ID)标记为从编译后的中间缓存中排除。“清除”意味着编译后的 middle.jsonl 不再包含该记录——日记 / SQLite 仍是权威来源。取消标记并重建后可恢复该观察。禁止使用 DELETE /api/observation/:id。
  • Phase 2 — 规则对齐(#3936):遍历 house → project → seat 各层,检测冲突(SHADOW_HOUSE、DENY_ALLOW、DRIFT、CLOCK_HEADER),并生成仅追加的 rules-report.md。当 CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS=true 时,可选择对 SHADOW_HOUSE 叶节点补丁进行试运行 / 应用。每小时 Worker Watch 周期的第 6 小时(D4)运行。这是一份检查清单,不是解析器——没有 .cas 编译器。
  • Phase 3 — 验证 / 签核(本轮):重新运行回归测试和反模式检索,证明边界符合预期(脚本化周期会去重;排除项会从中间缓存中移除,但不会从日记中移除;规则报告会生成,或记录 MISS),并确保技能和计划如实说明此席位不是什么。Phase 3 不添加任何新的运行时行为。
  • **不会做的事:**删除历史记录、写入 profile.md、写入 LFG/Orifice [awareness] 日志(该衔接点归 #3931 所有)、添加第六个 processAgentResponse 使用方、重启 worker、按轮次进行滴灌式更新、执行 Focus/嘴部/常驻规则,或将 house 文本复制到席位中。

这不是什么(明确边界)

CCS Align 刻意保持精简。它不会提供以下任何功能,这个循环也不会添加这些功能——它们属于未来工作或其他 Agent。这里明确列出,避免有人对这个席位的能力产生过多解读:

  • 没有上下文编译器。 没有 .cas 解析器、没有 compileAwareness()、没有 JIT 编译,也没有计算样式 UI。CCS Notion 页面类型(Bucket、canRead)只是作为注释引用的教学内容,绝不会成为运行时解析器。
  • 没有 brainbeat 产品。 “每完成一个工作单元就重新生成一次 awareness”这扇门尚未构建。Align 按小时频率拉取;它不是逐轮渐进式更新,也不是 brainbeat。
  • 没有注意力低谷 / curse-salience。 没有显著性衰减,也没有低谷评分。所有阶段都明确排除这些内容。
  • 没有 Focus / mouth 强制机制。 常驻规则(始终 / 从不 / 危险)在这里既不会被强制执行,也不会衰减。Align 可以列出冲突;出口过滤属于其他 Agent。
  • 不会成为 LFG/Orifice [awareness] 日志的第二个写入方。 #3931 负责 agents/**/memory/log/YYYY-MM.md。Align 只写入由其席位负责的中间缓存。
  • 不会重写历史记录。 排除标记只过滤编译后的缓存;日记 / SQLite 仍是权威数据源,并且可以重建。没有 DELETE /api/observation,也没有 A-MEM 行重写。
运维 MISS — worker 插件版本滞后

截至本次签核,仓库(package、插件、marketplace)的版本为 13.24.5(本次 Phase 3 PATCH),但家用设备上正在运行的 worker 插件可能仍是 13.24.1。这是需要记录的运维 MISS,不在此处修复:此席位不会重启或升级 worker(严格禁止)。如果运行中的设备仍显示 13.24.1,请在向 Prioritizer 汇总状态时注明,以便通过其他方式重启 worker 并使其使用当前插件。如果运行中的 worker 已与 package 版本一致,则此 MISS 已关闭。

前提条件

claude-mem worker 必须在本地运行。此席位连接的是本地 worker(每 UID 端口约为 37700),绝不连接云端 CMEM MCP——云端的 observation:<base64> ID 属于不同 API,不得混用。

解析一次 worker 端口,并在下方每条 curl 命令中重复使用 $WORKER_PORT。此代码片段复制自 timeline-report 技能,遵循 CLAUDE_MEM_WORKER_PORT → ~/.claude-mem/settings.json → 每 UID 默认值 37700 + (uid % 100) 的顺序:

WORKER_PORT="${CLAUDE_MEM_WORKER_PORT:-$(node -e "const fs=require('fs'),p=require('path'),os=require('os');const uid=(typeof process.getuid==='function'?process.getuid():77);const fallback=String(37700+(uid%100));try{const s=JSON.parse(fs.readFileSync(p.join(os.homedir(),'.claude-mem','settings.json'),'utf-8'));process.stdout.write(String(s.CLAUDE_MEM_WORKER_PORT||fallback));}catch{process.stdout.write(fallback);}" 2>/dev/null)}"

不要将端口 37777 写死——端口按 UID 区分。

设置

默认值位于 SettingsDefaultsManager.ts;可在 ~/.claude-mem/settings.json 中覆盖:

键默认值含义
CLAUDE_MEM_CCS_ALIGN_ENABLEDtrue此席位的总开关。
CLAUDE_MEM_CCS_ALIGN_VIEWER_IDSccs-align此席位要维护缓存的逗号分隔 viewer ID。
CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPESdecision,bugfix,security_alert,sensitive要拉取的 needle 观察类型(复制自 #3931 的列表,D6)。
CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWSfalsePhase 2 规则影子补丁开关。设为 true 时,规则遍历器会从叶文件中移除重复的 SHADOW_HOUSE 行(通过临时文件 + 重命名的原子操作)。默认关闭——仅报告。

试点 viewer ID 为 ccs-align。此席位可以读取 LFG 观察项(agent ID 521e962d-2ec3-4488-bfbc-54d5209ce118)作为项目过滤条件,但不得写入 LFG/Orifice 月度日志或任何 profile.md。

每小时循环(附录 A 操作手册)

在工作日的家用设备看板上,每小时运行一次。只做一件事。不闲聊。不做“我既然来了,顺便也……”之类的事。

every hour (weekday house board):
  1. Resolve WORKER_PORT (snippet above)
  2. GET /api/health || GET /health   → abort with a one-line miss if down
  3. search(obs_type=needles, limit=20) since cursor.lastObservationId
  4. timeline(anchor=newest)          → collect neighbor ids
  5. get_observations(ids=…)
  5b. (Phase 1, mark-time only) If excluding: get_tool_uses for tool ids → record on mark
  6. grab middle.jsonl → append new → filter exclude-marks → replace atomic
  7. if original-cache path set and not writable: append-only to middle.jsonl (already done)
  8. update cursor.json
  9. every 6th hour: rules walk → append rules-report.md   (Phase 2 — see below)
 10. Speak to Alex only on red (worker down, write refused, unexpected profile.md touch)
步骤 1 — 解析端口

使用上面的 $WORKER_PORT 代码片段。

步骤 2 — 证明工作进程健康(优先使用 /api/health)

优先使用 GET /api/health;也接受查看器别名 GET /health。公开的工作进程文档仍显示 GET /health 和 port 字段——二者都已过时。健康检查不会返回端口;如有需要,请使用 GET /api/stats(worker.port)。

curl -sS "http://127.0.0.1:${WORKER_PORT}/api/health" || curl -sS "http://127.0.0.1:${WORKER_PORT}/health"
# expect a JSON body with "status":"ok". If the worker is down, abort with a
# one-line miss — do NOT start it, do NOT retry aggressively.

如果无法证明健康(例如云 VM 中没有运行中的工作进程),请记录为 MISS 并停止。不要伪造缓存周期。

步骤 3 — 按三层阶梯依次拉取

披露顺序为 search → timeline → get_observations。绝不要直接跳到 get_observations,也不要在 Phase 0 调用 get_tool_uses(那是 Phase 1 的内容)。

  1. 使用针对此 obs_type 列表(CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPES)的 search,limit ≤ 20,可选按 project 限定范围。使用游标的 lastObservationId,避免重新拉取整份日志。

    curl -sS "http://127.0.0.1:${WORKER_PORT}/api/search?query=*&type=decision&limit=20&format=json"
    
  2. 以最新命中项为锚点调用 timeline。工作进程的代码默认深度为 10(SearchManager.ts)——MCP 文本中所说的“3”已过时,因此省略深度(工作进程会应用 10)或显式传入 10。

    curl -sS "http://127.0.0.1:${WORKER_PORT}/api/timeline?anchor=<newestObservationId>"
    
  3. 对你实际要缓存的 ID 调用 get_observations。

    curl -sS -X POST "http://127.0.0.1:${WORKER_PORT}/api/observations/batch" \
      -H 'content-type: application/json' \
      -d '{"ids":[12345,12346]}'
    

对应的 MCP 工具也是 search → timeline → get_observations。工作进程的 get_observations ID 是数字;不要将云端 observation:<base64> ID 传入 /api/observations/batch。

步骤 4 — 获取 → 追加 → 过滤排除标记 → 替换(原子式中间缓存)

使用座位辅助函数 src/services/integrations/CcsAlignMiddleCache.ts (landObservationsInMiddleCache)写入观察记录。它复制了 #3931 原子操作 (appendAwarenessLineAtomic + awarenessLineBody),仅有三处变化: 标签为 [ccs-align],路径根目录为 ~/.claude-mem/ccs-align/<viewerId>/, 文件为 middle.jsonl。

Phase 1 在原子管道中加入排除标记过滤器:

grab:    read middle.jsonl if it exists, else empty
filter:  load exclude-marks.json; drop any record whose id is marked
append:  for each new observation id not already present AND not marked, append one record
replace: write temp + rename (copy appendAwarenessLineAtomic; never appendFileSync)
fallback: if an OPTIONAL original-cache path is set and not writable, skip grab/replace
          on that path and append timeline items to middle.jsonl only

仓库内没有编译后的层叠文件,因此回退方案是“追加到座位文件”——绝不要虚构层叠文件。

middle.jsonl 的每一行都是一条记录。Phase 0 的结构已锁定(不要添加字段):

{
  "v": 1,
  "id": 12345,
  "type": "decision",
  "title": "…",
  "created_at": "2026-09-09T00:00:00.000Z",
  "project": "claude-mem",
  "agent_id": null,
  "source": "worker",
  "line": "- 2026-09-09 [ccs-align] decision — «…»"
}

line 是 formatCcsAlignLine:由同一个共享格式化器写入、替换了标签的意识行格式,因此回忆文本经过清理(没有标签框架或不可见字符),并以 «…» 括起,在括号内截断至 500 个字符。去重依据是观察记录的 id 和 正文(从 [ccs-align] 开始、不含日期的行),因此同一条事实即使出现在新的一天也会被跳过,重复周期不会使文件增长。

最简调用方式(bun/node):

import { landObservationsInMiddleCache } from '../../src/services/integrations/CcsAlignMiddleCache.js';

landObservationsInMiddleCache({
  viewerId: 'ccs-align',
  observations: rowsFromGetObservations, // [{ id, type, title, subtitle, facts, created_at, project, agent_id }]
});

它绝不会向调用方抛出异常——写入路径故障会被记录并吞掉。

步骤 5 — 更新游标

写入 ~/.claude-mem/ccs-align/<viewerId>/cursor.json,以免下一个小时重新拉取整份日志:

{ "lastRunAt": "…", "lastObservationId": 12345, "healthPath": "/api/health", "workerPort": 37700 }

使用辅助函数中的 writeCursor(临时文件 + 重命名,原子完成)。

步骤 6 — 仅在状态为红色时发言

将状态向上报告给 Prioritizer。仅在状态为红色时通知 Alex:工作进程停止、写入遭拒,或意外触碰了 profile.md。其他情况保持安静。

Phase 1 — 排除标记

“清除”表示编译后的 middle.jsonl 不再包含该观察记录或其工具 I/O(针对该查看器)。日志仍会保留。这是 Secure Isolated Awareness + context-stripper——不是删除。

排除标记文件

每个查看器都有 ~/.claude-mem/ccs-align/<viewerId>/exclude-marks.json:

{
  "v": 1,
  "marks": [
    {
      "observationId": 12345,
      "toolUseIds": ["toolu_01abc", 678],
      "reason": "sibling-wall|manual|stripper|secure-isolation",
      "markedAt": "2026-09-09T00:00:00.000Z",
      "markedBy": "ccs-align"
    }
  ]
}

标记由 CcsAlignMiddleCache.ts 中的 addExcludeMark / removeExcludeMark 管理,也可以手动编辑 JSON。

标记的创建方式(v1)
  1. 手动编辑 JSON — 打开 exclude-marks.json 并添加标记条目。
  2. Skill 标志 — exclude <observationId> --reason …(manual、sibling-wall、stripper、secure-isolation)。
  3. 不会从聊天文本自动提升标记(存在投毒面——参见 Memory dig findings)。
清除工具(仅编译文件)

在标记上记录工具使用 ID 时:

  1. 调用 get_observations 后,如果需要工具 ID,请调用 get_tool_uses / POST /api/tool-uses/batch(第 4 层)。
  2. 将这些 ID 记录到标记的 toolUseIds 数组中。
  3. 绝不要将原始 tool_input / tool_response 持久化到 middle.jsonl 中——第 4 层不属于层合文件。
  4. 不要调用 DELETE /api/observation/:id——这会将日志标记为墓碑状态,并破坏从历史记录重建的能力。

警告: get_tool_uses 属于渐进式披露阶梯的第 4 层。它会返回原始工具 I/O,只应在标记时调用,以便为排除标记捕获工具使用 ID。绝不要在常规每小时周期中调用它。绝不要将其 tool_input / tool_response 负载持久化到任何缓存文件中。

取消标记并重建

若要恢复之前排除的观察记录:

  1. 从 exclude-marks.json 中移除标记(使用 removeExcludeMark 或手动编辑)。
  2. 通过三层阶梯重新拉取日志(search → timeline → get_observations)。
  3. 调用 rebuildMiddleCache,清除编译文件并从权威日志重新写入。

由于日志从未被触碰,该观察记录会在下一个周期重新出现在 middle.jsonl 中。

查看器隔离

每个查看器的中间缓存相互独立:

  • ~/.claude-mem/ccs-align/viewer-a/middle.jsonl
  • ~/.claude-mem/ccs-align/viewer-b/middle.jsonl

为查看器 A 写入的观察记录绝不会出现在查看器 B 的编译文件中。查看器 A 的排除标记不会影响查看器 B。这实现了安全隔离感知属性:将唯一的评估令牌注入查看器 A 的缓存 → 运行查看器 B → 断言 A 的令牌绝不会出现在 B 的编译文件中。

程序化用法
import {
  addExcludeMark,
  removeExcludeMark,
  rebuildMiddleCache,
  ccsAlignExcludeMarksPath,
  readExcludeMarks,
} from '../../src/services/integrations/CcsAlignMiddleCache.js';

const marksPath = ccsAlignExcludeMarksPath(dataRoot, 'ccs-align');

// Mark an observation as excluded (with optional tool-use ids)
addExcludeMark(marksPath, 12345, ['toolu_01abc'], 'manual');

// Unmark and rebuild
removeExcludeMark(marksPath, 12345);
rebuildMiddleCache({
  viewerId: 'ccs-align',
  observations: allObservationsFromDiary,
  dataRoot,
});

严禁事项(所有阶段)

  • ❌ DELETE /api/observation/:id ——墓碑状态 ≠ 排除标记;这会破坏从历史记录重建的能力。
  • ❌ 写入 LFG/Orifice [awareness] 日志,或写入任何 agents/**/memory/log/ 路径。
  • ❌ 写入 profile.md、用户记忆或项目记忆。
  • ❌ 在提示词顶部放置时钟(时间戳应属于事实,而不是缓存头)。
  • ❌ POST /api/context/semantic(逐轮滴灌是感知设计所禁止的)。
  • ❌ 增加第六个 processAgentResponse 使用方——CCS Align 采用拉取方式;#3931 负责这处衔接。
  • ❌ 重启 Worker,或调用 POST /api/settings。
  • ❌ 称呼用户为 “Az”。始终称呼为 Alex。
  • ❌ 声称上下文编译器 / brainbeat 已交付。这些都属于未来工作。
  • ❌ 通过翻转规则来“修复”拒绝/允许——只报告问题。
  • ❌ 将内部文本复制到席位中——这正是本阶段要检测的错误。
  • ❌ 构建 .cas 编译器,让报告看起来更智能。
  • ❌ 修改 standing / Focus / always / never / danger 文件。
  • ❌ 注意力低谷 / curse-salience 实验(仅属于 Phase-N 待办事项)。

阶段 2 ——规则对齐(内部 → 项目 → 席位)

在每小时 Worker Watch 周期的第 6 小时(D4),席位会遍历内部 → 项目 → 席位各层,以检测并报告规则冲突。这是一份检查清单,不是解析器。不要构建 .cas 编译器。

级联规则(来自 Notion CCS)
  • 在 HOUSE 写入一次;席位继承
  • 叶层副本会遮蔽级联规则(这是错误,不是功能)
  • 拒绝优先于允许
  • 默认情况下,兄弟席位拒绝处理高风险类别(obs、note、person)
  • 默认拒绝:若不存在规则,则拒绝
层级遍历
层级查找位置(内部环境)类别
内部user-memory/ 共享配置文件;Notion CCS :rootprofile、standing、owns
项目.cmem-projects/<project>/、仓库 CLAUDE.md项目覆盖项
席位agents/<uuid>/profile.md、agents/<uuid>/memory/叶层——不得重复内部内容

在没有 agent-data 树的环境中,报告会记录 MISS: house-box paths,然后正常退出。

冲突类别(v1)
代码模式处理方式
SHADOW_HOUSE叶子文件包含一行,该行也存在于 house 中(或以 House rule 开头)试运行时从叶子文件中移除;仅当 CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS=true 时才应用
DENY_ALLOW同一类别在一层允许,在另一层禁止仅报告
DRIFTHouse 文本已更改;叶子文件仍使用旧措辞(部分前缀匹配)仅报告
CLOCK_HEADER配置文件中提示词开头包含时钟或“当前时间是”仅报告(house 规则:前缀中不得有时钟)
规则报告

输出:~/.claude-mem/ccs-align/<viewerId>/rules-report.md — 按日期划分、仅追加的章节。每次运行都会追加一个新章节,其中包含时间戳、冲突表、所有 MISS 条目以及已应用补丁的数量。状态向上汇总给 Prioritizer(绝不向同级发送垃圾信息)。

有限补丁(D8 默认关闭)

当 CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS=true 时:

  1. 仅修补 SHADOW_HOUSE 冲突 — 绝不修补 DENY_ALLOW、DRIFT 或 CLOCK_HEADER。
  2. 在应用任何补丁之前,先将拟议的差异写入报告。
  3. 复制叶子文件,剔除重复行,并以原子方式替换文件(临时文件 + 重命名,使用与 CcsAlignMiddleCache 相同的原语)。
  4. 绝不修补 standing / Focus / always.md / never.md / danger.md / profile.md。
  5. 绝不修改 House 文件。
编程用法
import {
  walkRules,
  discoverLayerPaths,
  type RulesWalkerConfig,
} from '../../src/services/integrations/CcsAlignRulesWalker.js';

// Discover paths on the current box
const paths = discoverLayerPaths({ project: 'claude-mem' });

const config: RulesWalkerConfig = {
  dataRoot: '~/.claude-mem',
  viewerId: 'ccs-align',
  patchShadows: false,  // report-only by default
  housePaths: paths.housePaths,
  projectPaths: paths.projectPaths,
  seatPaths: paths.seatPaths,
};

const result = walkRules(config);
// result.conflicts — array of detected conflicts
// result.misses — paths that were not found
// result.reportPath — path to the appended rules-report.md
// result.patchesApplied — number of SHADOW_HOUSE lines removed (0 if patchShadows=false)

阶段 3 — 验证 / 签核(计划 §3)

阶段 3 完成计划闭环。它证明该岗位可以每小时运行一次、文档齐全,并如实说明其能力边界 — 不会添加运行时行为。

证明边界,而非代码(§3.1):

  • 执行一次脚本化周期:health → search → timeline → get_observations → middle.jsonl。
  • 第二次运行不会产生重复行(去重有效)。
  • 排除一个 ID → 它从中间缓存中消失,但 Worker 仍会返回它(GET /api/observation/N)。
  • 会生成规则报告(如果机器上没有 agent-data 树,则明确记录 MISS)。
  • 面向用户的文案使用 Alex,绝不使用“Az”;不得声称“上下文编译器已发布 / brainbeat 已上线 / 我们编译了意识”(只能使用将来时或说明不在本计划范围内的措辞)。

证明没有回归(§3.2): 运行下方“验证”部分中的测试,包括 #3931 推送器和转录测试。#3931 的行为必须保持不变:LFG/Orifice 仍从 worker 推送器获取 [awareness] 行,而不是从 Align 获取。

反模式 grep(§3.3): 不得出现 DELETE /api/observation、notifyGrokBotAwareness,也不得在岗位辅助工具中复用 processAgentResponse(可以禁止或在注释中提及 — 岗位不得使用它们)。

签核(§3.4): Worker Watch 岗位无需额外的产品背景知识即可运行此技能;已发布的默认值仍与 D 行一致;Prioritizer 可以将此结果汇总为“CCS Align 阶段 0 通过 / 阶段 1 标记 / 阶段 2 报告”。

完整约定见 plans/2026-09-09-ccs-align.md §3。

后续阶段(已记录,尚未实现)

  • 完整 brainbeat / 上下文编译器 / .cas 运行时 — 未来工作、纸面脚手架,不在本计划范围内。
  • 注意力低谷 / curse-salience、Focus/输出通道强制执行 — 属于其他 Agent / 待办事项;在此严格禁止。

完整列表见 plans/2026-09-09-ccs-align.md“明确的非目标”。

验证(阶段 0 + 阶段 1 + 阶段 2)

bun test tests/integrations/ccs-align-middle-cache.test.ts
# Phase 0: format/truncate, needle match, append, dedupe, path safety, never-throw, cursor round-trip
# Phase 1: mark drop, diary present, tool ids not in middle.jsonl, viewer isolation,
#           unmark+rebuild, exclude-marks round-trip, buildExcludeSet, secure-isolation,
#           corrupt marks fail-closed, marked ids skipped on ingest

bun test tests/integrations/ccs-align-rules-walker.test.ts
# Phase 2: SHADOW_HOUSE detection (exact dup + "House rule" prefix), default report-only
#           (leaf unchanged), patchShadows=true (leaf loses duplicates, house unchanged),
#           never patches standing/always/never, MISS on absent paths, CLOCK_HEADER detection,
#           DENY_ALLOW detection, DRIFT detection, append-only report, atomic patch,
#           full walkRules integration, edge cases

# #3931 must not regress — LFG/Orifice still get [awareness] lines from the worker pusher, not Align
bun test tests/integrations/grok-bot-awareness-pusher.test.ts

验证 grep(计划 §2.3):

# Report path documented
rg -n "rules-report" plugin/skills/ccs-align/SKILL.md
# expect ≥1

# Patch gated
rg -n "CCS_ALIGN_PATCH_SHADOWS" plugin/skills/ccs-align/SKILL.md
# expect ≥1

实时环境检查(本机执行,不属于 CI——云 VM 可能没有运行中的 worker;如果没有,请记录为 MISS):

  • curl -sS "http://127.0.0.1:$WORKER_PORT/api/health" 返回 status: ok
  • 完成一个周期后,~/.claude-mem/ccs-align/ccs-align/middle.jsonl 存在
  • 使用相同的观察结果再完成一个周期后,文件不会增长(去重)
  • 标记观察记录 N → 下一个周期会从 middle.jsonl 中移除 N
  • SQLite / GET /api/observation/N 仍会返回该行(日志是权威数据源)
  • 标记中链接的工具使用 ID 不会出现在 middle.jsonl 中
  • 查看者 B 的缓存中不包含查看者 A 独有的评估令牌
  • 取消标记(从 JSON 中移除)+ 完成一个周期后,下次拉取会恢复 N
  • 任意 agents/ 路径下的 profile.md 与之前逐字节一致
  • Align 不会更改 LFG/Orifice memory/log/YYYY-MM.md

评论

支持 Markdown