关于 ccs-align
ccs-align 是 Claude-Mem 的 Worker Watch 技能,每小时从本地 worker 获取近期观察并写入独立中间缓存。它还可标记缓存排除项并生成规则冲突报告,不修改权威历史记录。
主要功能
- 01每小时从本地 worker 拉取观察
- 02原子写入并去重中间缓存
- 03按排除标记过滤缓存内容
- 04检查规则层级冲突并生成报告
适用场景
- 01汇总近期决策、修复和安全观察
- 02从编译缓存中排除指定观察
- 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_ENABLED | true | 此席位的总开关。 |
CLAUDE_MEM_CCS_ALIGN_VIEWER_IDS | ccs-align | 此席位要维护缓存的逗号分隔 viewer ID。 |
CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPES | decision,bugfix,security_alert,sensitive | 要拉取的 needle 观察类型(复制自 #3931 的列表,D6)。 |
CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS | false | Phase 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 的内容)。
-
使用针对此
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" -
以最新命中项为锚点调用
timeline。工作进程的代码默认深度为 10(SearchManager.ts)——MCP 文本中所说的“3”已过时,因此省略深度(工作进程会应用 10)或显式传入10。curl -sS "http://127.0.0.1:${WORKER_PORT}/api/timeline?anchor=<newestObservationId>" -
对你实际要缓存的 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)
- 手动编辑 JSON — 打开
exclude-marks.json并添加标记条目。 - Skill 标志 —
exclude <observationId> --reason …(manual、sibling-wall、stripper、secure-isolation)。 - 不会从聊天文本自动提升标记(存在投毒面——参见 Memory dig findings)。
清除工具(仅编译文件)
在标记上记录工具使用 ID 时:
- 调用
get_observations后,如果需要工具 ID,请调用get_tool_uses/POST /api/tool-uses/batch(第 4 层)。 - 将这些 ID 记录到标记的
toolUseIds数组中。 - 绝不要将原始
tool_input/tool_response持久化到middle.jsonl中——第 4 层不属于层合文件。 - 不要调用
DELETE /api/observation/:id——这会将日志标记为墓碑状态,并破坏从历史记录重建的能力。
警告:
get_tool_uses属于渐进式披露阶梯的第 4 层。它会返回原始工具 I/O,只应在标记时调用,以便为排除标记捕获工具使用 ID。绝不要在常规每小时周期中调用它。绝不要将其tool_input/tool_response负载持久化到任何缓存文件中。
取消标记并重建
若要恢复之前排除的观察记录:
- 从
exclude-marks.json中移除标记(使用removeExcludeMark或手动编辑)。 - 通过三层阶梯重新拉取日志(
search→timeline→get_observations)。 - 调用
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 :root | profile、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 | 同一类别在一层允许,在另一层禁止 | 仅报告 |
DRIFT | House 文本已更改;叶子文件仍使用旧措辞(部分前缀匹配) | 仅报告 |
CLOCK_HEADER | 配置文件中提示词开头包含时钟或“当前时间是” | 仅报告(house 规则:前缀中不得有时钟) |
规则报告
输出:~/.claude-mem/ccs-align/<viewerId>/rules-report.md — 按日期划分、仅追加的章节。每次运行都会追加一个新章节,其中包含时间戳、冲突表、所有 MISS 条目以及已应用补丁的数量。状态向上汇总给 Prioritizer(绝不向同级发送垃圾信息)。
有限补丁(D8 默认关闭)
当 CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS=true 时:
- 仅修补
SHADOW_HOUSE冲突 — 绝不修补DENY_ALLOW、DRIFT或CLOCK_HEADER。 - 在应用任何补丁之前,先将拟议的差异写入报告。
- 复制叶子文件,剔除重复行,并以原子方式替换文件(临时文件 + 重命名,使用与
CcsAlignMiddleCache相同的原语)。 - 绝不修补
standing/ Focus /always.md/never.md/danger.md/profile.md。 - 绝不修改 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