ccs-align について
ccs-alignは、ローカルworkerから最近の観察記録を毎時取得し、専用の中間キャッシュに保存するClaude-MemのWorker Watchスキルです。除外マークの適用やルール競合の報告に対応し、正本の履歴は変更しません。
主な機能
- 01ローカルworkerから毎時取得
- 02中間キャッシュへの原子的な重複排除書き込み
- 03除外マーク付き観察記録のフィルタリング
- 04ルール階層間の競合レポート
活用シーン
- 01最近の決定、修正、セキュリティ観察の収集
- 02選択した観察記録をコンパイル済みキャッシュから除外
- 03house、project、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 の席(フェーズ 0〜2 はリリース済み、フェーズ 3 = 検証/承認)
CCS Align は常設の席であり、鳥瞰的なプランナーではありません。1時間に1度、ローカルの claude-mem ワーカーと通信し、既存の3層開示ラダーを通じて最近のニードル観測を取得し、取得 → 追記 → 置換の手順で、席が所有する中間キャッシュに格納するのが唯一の役割です。
このスキルは、正式計画 plans/2026-09-09-ccs-align.md に基づくフェーズ 0 のブリージングスライス、フェーズ 1 の除外マーク、フェーズ 2 のルール整合性を実装します。フェーズ 0〜2 はリリース済みでマージ済みです(#3934、#3935、#3936。フェーズ 3 は検証/承認(このループ)であり、新たなプロダクト機能はありません。これはコンテキストコンパイラーでも、Focus/mouth でも、Grok Memory フェーズ 2 でもありません。人間に話しかけるときは、Alex と呼びかけてください。
実装済みの機能(フェーズ 0〜2 はリリース済み)
- フェーズ 0 — ブリージングスライス(#3934:ヘルスチェック →
search→timeline→get_observations→~/.claude-mem/ccs-align/<viewerId>/middle.jsonlにレコードを追記(アトミック、重複排除)。 - フェーズ 1 — 除外マーク(#3935:観測(および関連するツール使用 ID)に、コンパイル済み中間キャッシュから除外するマークを付けます。「パージ」とは、コンパイル済みの
middle.jsonlにレコードが含まれなくなることを意味します。ダイアリー/SQLite は引き続き正本として扱われます。マークを解除して再構築すると、観測が復元されます。DELETE /api/observation/:idは禁止です。 - フェーズ 2 — ルール整合性(#3936:ハウス → プロジェクト → 席のレイヤーを順に確認し、競合(
SHADOW_HOUSE、DENY_ALLOW、DRIFT、CLOCK_HEADER)を検出して、追記専用のrules-report.mdを出力します。CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS=trueの場合、必要に応じてSHADOW_HOUSEのリーフパッチをドライラン/適用できます。Worker Watch の毎時サイクルの6時間ごと(D4)に実行されます。これはチェックリストであり、パーサーではありません。.cas コンパイラーはありません。 - フェーズ 3 — 検証/承認(このループ):回帰テストとアンチパターンの grep を再実行し、境界を証明します(スクリプト化したサイクルで重複排除されること、除外によりダイアリーには残ったまま中間キャッシュから取り除かれること、ルールレポートが生成されるか MISS が記録されること)。また、この席が対象としないものについて、スキルと計画の記述を実態に合わせます。フェーズ 3 では、新たな実行時動作は追加されません。
- **行わないこと:**履歴の削除、
profile.mdの書き込み、LFG/Orifice の[awareness]ログの書き込み(この接続部分は #3931 の担当です)、6つ目のprocessAgentResponseコンシューマーの追加、ワーカーの再起動、ターンごとの逐次更新の実行、Focus/mouth/常設ルールの強制、ハウステキストの席へのコピー。
これは何ではないか(明確な境界)
CCS Align は意図的に小さく設計されています。次のものは含まれておらず、このループでも追加しません。これらは今後の作業、または別のエージェントの担当です。この席に含まれる機能を誤解しないよう、明記しています。
- コンテキストコンパイラーはありません。
.casパーサーも、compileAwareness()も、JIT コンパイルも、計算済みスタイルの UI もありません。CCS Notion ページの型(Bucket、canRead)は、コメントとして引用された説明用の文言であり、実行時のパーサーではありません。 - brainbeat プロダクトはありません。 「作業の単位が完了するたびに awareness を再生成する」仕組みは実装されていません。Align は毎時の間隔でプルします。ターンごとに少しずつ処理するものでも、brainbeat でもありません。
- 注意の谷/curse-salience はありません。 salience の減衰も、谷のスコアリングもありません。すべてのフェーズで明示的に対象外です。
- Focus/発話の強制はありません。 常時/禁止/危険のルールをここで強制したり、減衰させたりすることはありません。Align は競合を一覧表示する場合がありますが、外向きのフィルタリングは別のエージェントの担当です。
- LFG/Orifice
[awareness]ログへの2つ目の書き込み元にはなりません。 #3931 がagents/**/memory/log/YYYY-MM.mdを管理します。Align は、この席が所有する中間キャッシュにのみ書き込みます。 - 履歴を書き換えません。 除外マークはコンパイル済みキャッシュをフィルタリングします。日誌/SQLite は引き続き正本であり、再構築できます。
DELETE /api/observationは実行せず、A-MEM の行も書き換えません。
運用上の MISS — worker プラグインのバージョン遅れ
この承認時点で、リポジトリ(パッケージ、プラグイン、マーケットプレイス)は 13.24.5(この Phase 3 PATCH)ですが、house box で実行中の worker プラグインは、まだ 13.24.1 の場合があります。これはここで修正するのではなく、記録すべき運用上の MISSです。この席では worker を再起動またはアップグレードしません(厳禁です)。実稼働中の box がまだ 13.24.1 を示している場合は、Prioritizer に状況を報告する際にその旨を記録し、別途 worker を再起動して現在のプラグインに更新してください。実行中の worker がすでにパッケージのバージョンと一致している場合、この MISS は解消済みです。
前提条件
claude-mem worker がローカルで実行されている必要があります。この席はローカル worker(UID ごとのポート ~37700)と通信し、クラウド CMEM MCP とは通信しません。クラウドの observation:<base64> ID は別の API のものであり、混在させてはいけません。
以下のスニペットは timeline-report スキルからコピーしたもので、CLAUDE_MEM_WORKER_PORT → ~/.claude-mem/settings.json → UID ごとのデフォルト 37700 + (uid % 100) の順に設定を確認します。worker のポートを一度だけ解決し、以下のすべての curl で $WORKER_PORT を再利用してください。
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 observation の型です(#3931 のリストからコピー、D6)。 |
CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS | false | Phase 2 の rules-shadow パッチのゲートです。true の場合、rules walker はリーフファイルから重複する SHADOW_HOUSE 行を削除します(一時ファイルへの書き込み後、アトミックにリネーム)。デフォルトはオフで、報告のみです。 |
パイロットの viewer ID は ccs-align です。この席はプロジェクトフィルターとして LFG の observation(agent ID 521e962d-2ec3-4488-bfbc-54d5209ce118)を読み取ることはできますが、LFG/Orifice の月次ログや profile.md への書き込みは禁止です。
毎時サイクル(付録 A のランブック)
平日の house board で、毎時これを実行します。目的は1つです。井戸端会議はしません。「ついでにこれも……」もありません。
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 — 3 層ラダーに沿って順に取得する
開示の順序は search → timeline → get_observations です。get_observations にいきなり進んではいけません。また、Phase 0 では get_tool_uses を呼び出さないでください(これは Phase 1 です)。
-
searchでは、針となるobs_typeリスト(CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPES)を指定し、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)です。"3" と記載している MCP のテキストは古いため、深度を省略する(ワーカーが 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 — 取得 → 追記 → 除外マークでフィルタリング → 置換(アトミックな middle キャッシュ)
座席ヘルパー src/services/integrations/CcsAlignMiddleCache.ts
(landObservationsInMiddleCache)を使って観察結果を書き込みます。このヘルパーは #3931 のアトミックプリミティブ(appendAwarenessLineAtomic + awarenessLineBody)を複製し、変更点は次の 3 つだけです。
タグは [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 の各行は 1 件のレコードです。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 — カーソルを更新する
次の 1 時間で日記全体を再取得しないよう、~/.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を開き、マークのエントリーを追加します。 - スキルフラグ —
exclude <observationId> --reason …(manual、sibling-wall、stripper、secure-isolation)。 - チャットテキストからの自動昇格はありません(ポイズン対象となる領域です。Memory dig の調査結果を参照)。
Purge ツール(コンパイル済みのみ)
マークにツール使用 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または手動編集)。- 3 層ラダー(
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 に影響することもありません。これは Secure Isolated Awareness プロパティを実装します。ビューアー 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(設計で禁止されている、ターンごとの Awareness の逐次注入)。 - ❌ 6 番目の
processAgentResponseコンシューマー — CCS Align はプル方式です。この接続箇所は #3931 が担当します。 - ❌ ワーカーの再起動、または
POST /api/settings。 - ❌ 人間を「Az」と呼ぶこと。常に Alex と呼んでください。
- ❌ コンテキストコンパイラー / brainbeat がリリース済みだと主張すること。これらは今後の作業です。
- ❌ ルールを反転して deny/allow を「修正」すること — 報告のみ行ってください。
- ❌ ハウステキストをシートにコピーすること — それこそがこのフェーズで検出する不具合です。
- ❌ レポートを賢く見せるために
.casコンパイラーを構築すること。 - ❌ standing / Focus / always / never / danger ファイルにパッチを当てること。
- ❌ 注意の谷 / 呪いの顕著性に関する実験(Phase-N のバックログのみ)。
フェーズ 2 — ルールの整合(house → project → seat)
毎時の Worker Watch サイクル(D4)の 6 時間ごとに、シートは house → project → seat の各レイヤーをたどり、ルールの競合を検出して報告します。これはチェックリストであり、パーサーではありません。.cas コンパイラーはありません。
カスケードルール(Notion CCS より)
- HOUSE に一度だけ記述し、シートは継承します
- リーフにあるコピーはカスケードをシャドーイングします(機能ではなく不具合です)
- deny は allow より優先されます
- 兄弟はデフォルトで重いバケット(
obs、note、person)を deny します - フェイルクローズ:ルールがない場合は deny します
レイヤーの確認
| レイヤー | 確認する場所(house ボックス) | バケット |
|---|---|---|
| House | user-memory/ の共有プロフィール、Notion CCS の :root | profile、standing、owns |
| Project | .cmem-projects/<project>/、リポジトリの CLAUDE.md | プロジェクトのオーバーライド |
| Seat | agents/<uuid>/profile.md、agents/<uuid>/memory/ | リーフ — house を重複させてはなりません |
エージェントデータツリーがないボックスでは、レポートに MISS: house-box paths を記録して正常に終了します。
Conflict classes (v1)
| Code | Pattern | Agency |
|---|---|---|
SHADOW_HOUSE | リーフファイルに、ハウスにある行と同じ行(または House rule で始まる行)が含まれています | リーフから削除する変更をドライランし、CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS=true の場合にのみ適用します |
DENY_ALLOW | 同じバケットで、あるレイヤーでは許可、別のレイヤーでは拒否されています | 報告のみ |
DRIFT | ハウスのテキストが変更され、リーフには古い文言が残っています(部分的なプレフィックス一致) | 報告のみ |
CLOCK_HEADER | プロファイル内のプロンプト先頭にある時計/「現在時刻は」 | 報告のみ(ハウスルール:プレフィックスに時計を含めない) |
ルールレポート
出力先:~/.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には適用しません。 - パッチ適用前に、適用される差分をレポートに書き込みます。
- リーフファイルをコピーし、重複行を取り除いてから、ファイルをアトミックに置き換えます(temp + rename、
CcsAlignMiddleCacheと同じプリミティブ)。 standing/ Focus /always.md/never.md/danger.md/profile.mdには、決してパッチを適用しません。- ハウスファイルは変更しません。
プログラムからの使用
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 — 検証/承認(plan §3)
フェーズ 3 では計画のサイクルを完了します。対象の seat を毎時実行でき、ドキュメント化されており、対象外の内容についても誠実であることを確認します。ランタイムの動作は追加しません。
コードではなく境界を証明します(§3.1):
- スクリプトによるサイクルを 1 回実行します:health →
search→timeline→get_observations→middle.jsonl。 - 2 回目のサイクルで重複行が生成されないことを確認します(重複排除が機能します)。
- 1 つの ID を除外します → middle cache からは消え、worker からは引き続き返されることを確認します(
GET /api/observation/N)。 - ルールレポートが生成されること(または、agent-data ツリーがない環境では明示的な
MISSが出ること)を確認します。 - ユーザー向け文字列では Alex と記載し、「Az」とは記載しません。また、「コンテキストコンパイラーをリリースした/brainbeat は稼働中/awareness をコンパイルした」という主張は含めません(将来の話、または今回の計画の対象外である旨の記述に限ります)。
デグレがないことを証明します(§3.2): 以下の Verification セクションにあるテストを実行します。#3931 の pusher と transcript のテストも含みます。#3931 の動作は維持する必要があります。LFG/Orifice は Align ではなく、worker pusher から引き続き [awareness] 行を受け取ります。
アンチパターンの grep(§3.3): DELETE /api/observation、notifyGrokBotAwareness、seat helper での processAgentResponse の再利用がないことを確認します(禁止事項/コメント内での言及は問題ありません。seat でこれらを使用してはなりません)。
承認(§3.4): このスキルは、追加のプロダクトコンテキストがなくても Worker Watch seat から実行できます。リリース済みのデフォルト設定は引き続き D 行と一致します。Prioritizer は「CCS Align Phase 0 green / Phase 1 marks / Phase 2 report」として集約できます。
完全な仕様については、plans/2026-09-09-ccs-align.md §3 を参照してください。
後続フェーズ(文書化済み、未実装)
- 完全な brainbeat/コンテキストコンパイラー/
.casランタイム — 将来の作業であり、紙上の足場にすぎず、今回の計画の対象外です。 - Attention trough/curse-salience、Focus/mouth のエグレス適用 — 別のエージェント/バックログの対象であり、ここでは固く禁止されています。
全項目については、plans/2026-09-09-ccs-align.md の「Explicit non-goals」を参照してください。
検証(フェーズ 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 ではワーカーが稼働していない場合があるため、その場合は MISS を記録してください):
curl -sS "http://127.0.0.1:$WORKER_PORT/api/health"がstatus: okを返す- 1 回のサイクル後、
~/.claude-mem/ccs-align/ccs-align/middle.jsonlが存在する - 同じ観測内容で 2 回目のサイクルを実行しても、ファイルが増えない(重複排除)
- 観測 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が変更されない