mcpField
C
ccs-align

ccs-align

github.com/thedotmackエージェントワークフロー104.0k645 回インストール今日更新
リポジトリ

ccs-align について

ccs-alignは、ローカルworkerから最近の観察記録を毎時取得し、専用の中間キャッシュに保存するClaude-MemのWorker Watchスキルです。除外マークの適用やルール競合の報告に対応し、正本の履歴は変更しません。

主な機能

  1. 01ローカルworkerから毎時取得
  2. 02中間キャッシュへの原子的な重複排除書き込み
  3. 03除外マーク付き観察記録のフィルタリング
  4. 04ルール階層間の競合レポート

活用シーン

  1. 01最近の決定、修正、セキュリティ観察の収集
  2. 02選択した観察記録をコンパイル済みキャッシュから除外
  3. 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_ENABLEDtrueこの席のマスタースイッチです。
CLAUDE_MEM_CCS_ALIGN_VIEWER_IDSccs-alignこの席がキャッシュを管理する、カンマ区切りの viewer ID です。
CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPESdecision,bugfix,security_alert,sensitiveプル対象の Needle observation の型です(#3931 のリストからコピー、D6)。
CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWSfalsePhase 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 です)。

  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"
    
  2. 最新のヒットを起点に timeline を呼び出します。ワーカーの コード上のデフォルト深度は 10(SearchManager.ts)です。"3" と記載している MCP のテキストは古いため、深度を省略する(ワーカーが 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 — 取得 → 追記 → 除外マークでフィルタリング → 置換(アトミックな 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)
  1. JSON の手動編集 — exclude-marks.json を開き、マークのエントリーを追加します。
  2. スキルフラグ — exclude <observationId> --reason …(manual、sibling-wall、stripper、secure-isolation)。
  3. チャットテキストからの自動昇格はありません(ポイズン対象となる領域です。Memory dig の調査結果を参照)。
Purge ツール(コンパイル済みのみ)

マークにツール使用 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. 3 層ラダー(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 に影響することもありません。これは 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 ボックス)バケット
Houseuser-memory/ の共有プロフィール、Notion CCS の :rootprofile、standing、owns
Project.cmem-projects/<project>/、リポジトリの CLAUDE.mdプロジェクトのオーバーライド
Seatagents/<uuid>/profile.md、agents/<uuid>/memory/リーフ — house を重複させてはなりません

エージェントデータツリーがないボックスでは、レポートに MISS: house-box paths を記録して正常に終了します。

Conflict classes (v1)
CodePatternAgency
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 の場合:

  1. パッチを適用するのは SHADOW_HOUSE の競合のみです。DENY_ALLOW、DRIFT、CLOCK_HEADER には適用しません。
  2. パッチ適用前に、適用される差分をレポートに書き込みます。
  3. リーフファイルをコピーし、重複行を取り除いてから、ファイルをアトミックに置き換えます(temp + rename、CcsAlignMiddleCache と同じプリミティブ)。
  4. standing / Focus / always.md / never.md / danger.md / profile.md には、決してパッチを適用しません。
  5. ハウスファイルは変更しません。
プログラムからの使用
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 が変更されない

コメント