# dsh-fracture
終わったセッションを読み、ハーネスがエージェントをつまずかせている箇所を見つけ、直しをデータとして書き、同じ仕事を二度走らせて効いたかどうかを確かめる DSH プラグイン。
[](https://github.com/miketako3/dsh-fracture/actions/workflows/ci.yml)
[](LICENSE)
[English](README.md) | 日本語
## 構成
```mermaid
flowchart LR
S[session events] -->|turn end| O[observe.ts
per-turn facts]
O --> M[(memory
observations.jsonl)]
M --> D[digest
MEMORY.md]
M --> K[skills
SKILL.md]
D --> P[prompt section
titles only]
K --> P
K -->|ctx.skills.register| T[skill catalog]
O --> G{repeated
and clean?}
G -->|yes| K
D -.->|evidence| X[fracture_diagnose]
X --> Y[fracture_propose] --> Z[fracture_probe] --> A[fracture_adopt]
Z -->|verdict| W[watch window
auto-revert]
A --> B[bundle
human installs]
```
コードを読む前に知っておくべき性質が二つある。
- `plugin/` を持つ候補は別の `dsh` プロセスで走る。検証していないコードが、それを判定するプロセスに読み込まれることはない。
- 承認、サンドボックスのポリシー、プラグインマネージャ、このプラグイン自身に触れる候補は、保存の前と試行の前の二度はじく。
詳しくは [SECURITY.md](SECURITY.md)。段の線をどこに引いたかの理由は [docs/AUTONOMY.md](docs/AUTONOMY.md) にある。
## これは何か
DSH はエージェントをプラグイン行の並びとして組み立てる。モデル、プロンプトの節、スキルの置き場、ツール、承認のポリシーは、どれも設定を持つ一行である。
行の並びであることから、二つのことが決まる。ハーネスはデータなので、候補のハーネスは今のハーネスとの差分として書ける。そして二つのハーネスを同時に持てるので、変更の良し悪しを、モデルに自分の案を評価させるのではなく、同じ仕事を両方で走らせて比べられる。
名前は作業の比喩である。ハーネスは決まった線に沿って破れる。ファイルを読む前にツールを呼ぶ。作業が終わってから承認を求める。毎朝同じ手順を思い出す。その線が破断面であり、fracture はセッションログからそれを見つけ、残した変更をどれか一本に向ける。
## 解く課題
手入れの時間が取れないまま使われているエージェントには、よく似た三つの失敗がある。
**同じ間違いがセッションを越えて残る**。このプロジェクトは pnpm を使う、このテストは先にフィクスチャを組む必要がある、といった理由でツールが一度失敗する。モデルはその場で解決し、セッションが終わり、次はゼロから始まる。
**ハーネスの調整が勘に頼る**。システムプロンプトを一行直し、雰囲気が良くなった気がして、確かめる手段がないまま残す。次の変更がその上に積まれる。二か月後には、どの行が効いているのか誰も知らない。
**改善が溜まらない**。うまくいったセッションがあっても、うまくいかせた手順は、次のセッションが読める形ではどこにも残らない。
三つの原因は同じところにある。ループは、起きたことを記録しておらず、変更を基準と比べてもいない。fracture はこの二つを足し、人の手を借りずに回す。
## 自動でやること
終わったターンは、文章ではなく事実として記録する。どのツールがどの順で走り、何が失敗し、人間が口を挟んで直したか。20 ターンたまると、記録はダイジェストになる。同じ手順が失敗も訂正もなく 3 回続くと、その手順はスキルになる。ダイジェストとスキルの一覧は、短い索引としてプロンプトに入る。エージェントは、覚えたことを全部持ち歩かずに、何を覚えたかを知っている。
ハーネス自体も変えるが、変えてよい深さは測れる範囲に限る。
| 段 | 変わるもの | 関門 |
| --- | --- | --- |
| 記憶 | 観察、ダイジェスト、ジャーナル | なし。足すだけ |
| スキル | `skills//SKILL.md` と実行中の登録 | なし。足すだけ |
| 構成 | プロンプトの行、スキル置き場の行、ツールの切り替え | 試行の判定と監視期間。数字が悪化すれば自動で戻す |
| コード | 候補のプラグイン本体 | **人間**。`dsh plugin add` |
最初の二段は知識である。何も実行せず、権限も広げず、ファイルを消せば元に戻るので、断らずに走る。三段目はループが持ち、自分で取り消せるデータの変更なので、断らずに走るが、そのあと 12 ターン監視し、数字が悪ければ戻す。四段目はあなたのプロセスで動くコードを決めるので、ループは書いて試すところまでにし、動かすかどうかは人間が決める。
この線は意図的に引いてある。自分のコードを自分で入れられるエージェントは、最初の悪い変更を内側から反証できない。
書き出したものはすべて読めるファイルになる。`.dsh/fracture/` の下にある。
スキルを蒸留したとき、変更を適用したとき、巻き戻したときは、折りたたまれた通知が一度だけセッションに出る。ループが黙って何かをすることはない。それ以外のときは出さない。毎ターン通知が出るなら、それはもう情報ではない。
## 導入
```bash
dsh plugin --profile web add github:miketako3/dsh-fracture
```
これが配布の経路である。リポジトリから取得し、インストール時にビルドする。
一度だけ再起動する。設定は要らない。観察と記憶はその場で始まる。
```yaml
# $DSH_HOME/profiles/web/cordis.patch.yml
- id: fracture
name: dsh-fracture
config:
autonomy: full # off | memory | skills | full
baseDir: .dsh/fracture
digestEvery: 20 # ダイジェストを書き直す間隔(ターン)
distillMinRepeats: 3 # スキルにするまでの連続成功回数
autoLoop: true # 15 分ごとの自走を許す
autoApply: true # 試行で改善したプロンプト候補を適用する
watchTurns: 12 # 適用した変更を監視するターン数
```
## ツール
ループはこれらを内部で使う。手で呼ぶこともできる。
| ツール | すること |
| --- | --- |
| `fracture_diagnose` | 今のハーネスが下手なところを順位付けする。ツールの失敗率、同じファイルの読み直し、拒否された承認、圧縮の圧力、メッセージの往復。 |
| `fracture_propose` | 提案役のサブエージェントに、候補を一つ書かせる。`candidate.json` と、必要なら `skills/` か `plugin/`。 |
| `fracture_probe` | 同じ仕事を今のハーネスと候補で走らせ、比べる。`runs//report.md` を残す。 |
| `fracture_adopt` | 試行済みの候補を導入できるバンドルにし、教訓を追記する。導入そのものはしない。 |
| `fracture_status` | 何を覚え、何を提案し、各候補がどう評価されたか。 |
| `fracture_loop` | 診断から適用までを一度だけ回す。15 分間隔の自走と同じ関門を通る。 |
| `memory_search` | ダイジェスト、過去のターン、蒸留したスキルを検索する。 |
## 参考にしたもの
[Harness²](https://github.com/google-research/harness2)(Google Research、Apache-2.0)から三つの考えを借りている。実装はすべてこのプラグインの中にある。
- **内省より対比**。変更の良し悪しは、両方のハーネスで仕事を走らせて決める。モデルに自分の案を評価させない。
- **教訓は証拠とともに積む**。導入のたびに、きっかけ、変更、判定、理由を `lessons.md` に追記する。
- **弱いレバーから上げる**。プロンプト、スキル、スクリプト、ツール、フックの順に試す。
Harness² の 8 ファイルのハーネス木は採らない。DSH の行の並びがすでにその木で、ローダーと差分が付いている。写すと同じものを二通りに持つことになる。
残りは DSH 自身の仕組みである。構成にはプラグイン行、手順には `SKILL.md` の約束、観察には `session/event`、注入にはエージェント単位のプロンプト節を使う。Harness² のコードは同梱していない。
## 開発
```bash
npm install && npm test # 128 個のテスト。node:test だけを使う
npm run build
npm run demo # 合成ターンでループを一周させる
```
変更は歓迎するが、[CONTRIBUTING.md](CONTRIBUTING.md) を先に読んでほしい。ここでの変更の多くは機能を足すのではなく、境界を動かす。
## 状態
0.2 で、観察、記憶、スキルの蒸留、走っているエージェントへのプロンプト節、自走ループ、セッション内通知、プロンプト候補の自動適用と自動巻き戻しが入る。行を持つ候補は従来どおりバンドルにして人間が導入する。UI パネルは [ROADMAP.md](ROADMAP.md) の次の項目である。
## ライセンス
MIT。上の三つの考えについて Harness² を明記しており、コードは同梱していない。