Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ jobs:
node-version: ${{ matrix.node }}
cache: npm
- run: npm ci
- name: Run native DSH Skill discovery smoke
run: npm run test:dsh-native
- name: Run Vitest
run: npm run test:ci
- name: Verify Harness DSL generated sources
Expand Down
47 changes: 34 additions & 13 deletions docs/adapters/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

This is the single entry point for Claude Code, Codex, Qoder, Cursor, Qwen,
GitHub Copilot, Pi, Kimi Code, WorkBuddy, and Grok host boundaries, plus the
DeepSeek Harness (DSH) developer-preview session-only slice. Do not
DeepSeek Harness (DSH) verified install/discovery and developer-preview session
slices. Do not
create `docs/adapters/claude-code.md`, `docs/adapters/codex.md`,
`docs/adapters/qoder.md`, `docs/adapters/cursor.md`, `docs/adapters/qwen.md`,
`docs/adapters/copilot.md`, `docs/adapters/pi.md`,
Expand Down Expand Up @@ -44,7 +45,7 @@ project `.kimi-code/skills/`), then runs `/skill:better-harness`.
| Kimi Code | Analysis-capable source-local host | `.kimi-plugin/plugin.json` | `scripts/agent-customize/providers/kimi.mjs` | `scripts/session-analysis/platforms/kimi.mjs` | self-contained HTML + Markdown | `AGENTS.md` + `~/.kimi-code/skills` + project `.kimi-code/skills`/`.kimi/skills` + `~/.kimi-code/mcp.json` | `harness evidence-bundle --platform kimi` -> validated `html` render |
| WorkBuddy | Analysis-capable source-local host | none (skills install into `~/.workbuddy/skills`) | `scripts/agent-customize/providers/workbuddy.mjs` | `scripts/session-analysis/platforms/workbuddy.mjs` | self-contained HTML + Markdown | `~/.workbuddy` `AGENTS.md` + identity files + `.agents` + `AGENTS.md` | `session-analysis --platform workbuddy sources` -> validated `html` render |
| Grok | Analysis-capable source-local host | none (skills install into `~/.grok/skills`) | `scripts/agent-customize/providers/grok.mjs` | `scripts/session-analysis/platforms/grok.mjs` | self-contained HTML + Markdown | `~/.grok` + `.grok` + `.agents` + `AGENTS.md` | `session-analysis --platform grok sources` -> skill symlink -> validated `html` render |
| DeepSeek Harness (DSH) | Partial session-evidence adapter (developer preview) | none / unavailable | unavailable | `scripts/session-analysis/platforms/dsh.mjs`; `dsh-v1` for the audited format-0 session-evidence slice from DSH `dsh-v0.1.0-rc.7` and `dsh-v0.1.0-rc.8`, raw `.jsonl` and feature-detected `.jsonl.zstd` | unavailable; no report route | unavailable | read-only `node scripts/session-analysis.mjs sources --platform dsh --workspace <path> [--dsh-home <dir>]` or `node scripts/session-analysis.mjs facts --platform dsh --workspace <path> [--dsh-home <dir>]` |
| DeepSeek Harness (DSH) | Verified install/discovery for headless/base and Web `standard`/`code`/`cordis`; partial session evidence (developer preview) | local DSH Cordis policy at `scripts/dsh-skill-discovery/index.mjs`; no lifecycle shell | unavailable | `scripts/session-analysis/platforms/dsh.mjs`; `dsh-v1` for the audited format-0 session-evidence slice from DSH `dsh-v0.1.0-rc.7` and `dsh-v0.1.0-rc.8`, raw `.jsonl` and feature-detected `.jsonl.zstd` | unavailable; no report route | canonical Skill from the complete root; model Skill calls rejected | `npm run test:dsh-native`; read-only session `sources`/`facts` commands remain separate |

## Read-only Plugin Lifecycle

Expand Down Expand Up @@ -84,9 +85,9 @@ Plans never execute and always preserve native surface differences:
Kimi Code, Grok, and DSH are absent from this table on purpose: none has a
validated native lifecycle contract yet, so lifecycle targets reject them with
`UNKNOWN_HOST` instead of borrowing another host's install route. Kimi Code and
Grok retain their configured-asset and session evidence. DSH retains only its
partial session-evidence slice and has no lifecycle profile or native lifecycle
claim.
Grok retain their configured-asset and session evidence. DSH retains its
bounded verified discovery and partial session-evidence slices, but has no
lifecycle profile or native lifecycle claim.

The lifecycle commands do not read raw session transcripts, contact a registry,
edit host settings, or register an `apply` path.
Expand Down Expand Up @@ -192,8 +193,28 @@ edit host settings, or register an `apply` path.
`signals.json`). The adapter honors `GROK_HOME`. Grok has no install shell in
this repository; skills install manually into `~/.grok/skills` (symlink is
enough for `/better-harness`).
- DeepSeek Harness has a developer-preview, JSONL-only session adapter at
`scripts/session-analysis/platforms/dsh.mjs`. Home resolution is strictly
- DeepSeek Harness has two independent bounded slices. Verified
install/discovery uses DSH `0.1.1-rc.2` at audited source
`b150a551b8d465e31e418e1b2eaf5e79bbb7d28e`. The sole supported discovery
route points the active DSH `skill-filesystem.customSkillDirs` at the
absolute `<BETTER_HARNESS_ROOT>/skills` directory and loads the local Cordis
policy at `scripts/dsh-skill-discovery/index.mjs` with the same complete root.
The policy verifies the winning DSH definition's `custom` source, absolute
`SKILL.md` path, directory `resourceBase`, two-parent root invariant, and
required `scripts/`, `references/`, `models/`, and `templates/` resources
before direct `/better-harness` injection. It rejects model-facing
`skill({ name: "better-harness" })` calls without changing shared Skill
frontmatter or other hosts. The route is qualified for headless/base and for
a Web user preset copied from `standard`, `code`, or `cordis`, where the
active scoped `skill-filesystem` row is edited. Web `minimal` mounts no Skill
loader and remains unsupported. Project `.dsh/skills` and `.agents/skills`
candidates retain DSH precedence; a same-name shadow fails canonical
verification. Copies, symlinks/junctions, relative paths, and literal `~`
values are not canonical routes. Moving the Better Harness root requires
updating every configured absolute path. The credential-free native owner
smoke is `npm run test:dsh-native`.
- Separately, DeepSeek Harness has a developer-preview, JSONL-only session
adapter at `scripts/session-analysis/platforms/dsh.mjs`. Home resolution is strictly
`--dsh-home` over `DSH_HOME` over `~/.dsh`, and the only source root is
`<home>/sessions`. Discovery is read-only and accepts only the fixed nested
`session.jsonl` or `session.jsonl.zstd` layout. Workspace qualification uses
Expand All @@ -216,12 +237,12 @@ edit host settings, or register an `apply` path.
feature-detected; where it is absent, including Node.js 23.0 through 23.7,
compressed evidence is unavailable while independent raw JSONL evidence
remains readable. There is no fallback dependency or shell.
This slice does not provide native DSH installation or invocation, live PTY
or process state, configured assets or Skills, plugin lifecycle, a shell,
manifest or package integration, report/output routing, README Quickstart or
Installation placement, SQLite or custom persistence, automatic
optimization, plugin fault or causality attribution, or artifact repair or
writes. See [Story #93](https://github.com/QoderAI/better-harness/issues/93)
The combined DSH boundary does not provide live PTY or process state,
configured assets, plugin lifecycle, a managed shell, manifest or package
integration, report/output routing, README Quickstart, SQLite or custom
persistence, automatic optimization, plugin fault or causality attribution,
or artifact repair or writes. See
[Story #93](https://github.com/QoderAI/better-harness/issues/93)
and the [dated support specification](../specs/2026-08-18-93-deepseek-harness-session-evidence.md).

## Output Modes
Expand Down
53 changes: 39 additions & 14 deletions docs/docs/hosts/adapter-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,12 @@ host-neutral.
## Support levels

Better Harness currently declares ten more complete capability-level host
adapters plus one DSH session-only partial slice. Six have verified public
adapters plus bounded DSH discovery and session slices. Six have verified public
Quickstart paths. Pi, Kimi Code, WorkBuddy, and Grok are visible as adapter
support because their installation and end-to-end evidence boundaries differ
from that six-host set. DSH is visible only as a developer-preview session
evidence contract, not as a runnable report adapter. The [canonical adapter matrix](https://github.com/QoderAI/better-harness/blob/main/docs/adapters/README.md)
from that six-host set. DSH has Verified install/discovery for a qualified
runtime/preset boundary plus a developer-preview session-evidence contract; it
is not a runnable report adapter. The [canonical adapter matrix](https://github.com/QoderAI/better-harness/blob/main/docs/adapters/README.md)
remains the complete capability-level source of truth.

## Supported host adapters
Expand All @@ -35,7 +36,7 @@ remains the complete capability-level source of truth.
| Kimi Code | Adapter support | Analysis-capable source-local host | `.kimi-plugin/plugin.json` | Workspace-matching Kimi wire transcripts | Self-contained HTML + Markdown |
| WorkBuddy | Adapter support | Analysis-capable source-local host | None; skills use WorkBuddy-owned paths | Workspace-matching WorkBuddy JSONL transcripts | Self-contained HTML + Markdown |
| Grok | Adapter support | Analysis-capable source-local host | None; skills use Grok-owned paths | Workspace-matching Grok session dirs (`updates.jsonl`) | Self-contained HTML + Markdown |
| DeepSeek Harness (DSH) | Session analysis only | Partial, developer-preview contract | None | DSH JSONL backend session format `0`: raw `.jsonl` and feature-detected `.jsonl.zstd` | Unavailable |
| DeepSeek Harness (DSH) | Verified install/discovery | Qualified headless/base and Web `standard`/`code`/`cordis`; partial session evidence | Local DSH Cordis policy; no lifecycle shell | DSH JSONL backend session format `0`: raw `.jsonl` and feature-detected `.jsonl.zstd` | Unavailable |

The `@qoder-ai/better-harness` npm package includes all seven plugin metadata
roots. Pi reuses install metadata in the existing `package.json`, so it does
Expand All @@ -62,10 +63,11 @@ unavailable, transient Pi update/remove are not applicable, and WorkBuddy
returns `PLUGIN_LIFECYCLE_UNSUPPORTED`. Kimi Code and Grok have no validated
native lifecycle contract yet, so lifecycle targets reject them with
`UNKNOWN_HOST` while their adapter evidence stays available. DSH likewise has
no lifecycle profile: lifecycle targets reject it with `UNKNOWN_HOST`, and only
its partial session evidence remains available. The shadow host
profiles do not replace the canonical adapter matrix while ADR-0002 remains
proposed.
no lifecycle profile: lifecycle targets reject it with `UNKNOWN_HOST`; its
manually configured verified discovery and partial session evidence remain
available. The shadow host profiles do not replace the canonical adapter matrix
while ADR-0002 remains proposed. DSH's verified discovery does not add a
lifecycle target.

## Output modes

Expand Down Expand Up @@ -120,8 +122,31 @@ smoke is observed.

### DeepSeek Harness (DSH) {#deepseek-harness-dsh}

DSH coverage is a developer-preview, JSONL-only session slice, with Better
Harness adapter metadata `dsh-v1`. Its format-0 session-evidence slice is
DSH has Verified install/discovery against DSH `0.1.1-rc.2` at audited source
`b150a551b8d465e31e418e1b2eaf5e79bbb7d28e`. The only supported route points
the active `skill-filesystem.customSkillDirs` at the absolute
`<BETTER_HARNESS_ROOT>/skills` directory and loads the Better Harness DSH policy
from the same complete root. The policy fails closed unless DSH's winning
definition has the expected `custom` source, `SKILL.md` path, directory
`resourceBase`, two-parent root, and required root resources. A direct user
`/better-harness` gesture then injects the canonical Skill at DSH's pre-model
step boundary, while a model-facing Better Harness `skill` tool call is
rejected.

This route is qualified for headless/base. In Web it is qualified only for an
active user preset copied from `standard`, `code`, or `cordis` and configured
through that preset's scoped `skill-filesystem` row. Web `minimal` has no Skill
loader and remains unsupported. DSH's project-local same-name roots keep their
native higher precedence, but such a winner is reported unverified rather than
canonical. Standalone copies and symlinks/junctions are not supported install
routes. Paths must be absolute; DSH resolves relative paths from its process
working directory and does not expand a literal `~`. Moving the complete Better
Harness root requires reconfiguring every absolute path. The Installation page
documents the configuration boundary; run the pinned, credential-free owner
smoke with `npm run test:dsh-native`.

Separately, DSH has a developer-preview JSONL session slice with Better Harness
adapter metadata `dsh-v1`. Its format-0 session-evidence slice is
validated against DSH `dsh-v0.1.0-rc.7` and `dsh-v0.1.0-rc.8`, including RC8
interrupted assistant messages and required team-event vocabulary. Team events
are validated and accounted, not projected as team analytics. Home resolution
Expand Down Expand Up @@ -150,10 +175,10 @@ The implemented source-checkout smoke boundary is read-only:
node scripts/session-analysis.mjs sources --platform dsh --workspace <path> [--dsh-home <dir>]
```

This is not evidence of native DSH installation or invocation. DSH has no live
PTY/process integration, configured-asset or Skill discovery, plugin lifecycle,
shell, manifest, package integration, report/output route, README Quickstart or
Installation path, SQLite or custom persistence support, automatic
Verified discovery does not imply a complete report loop. DSH has no live
PTY/process integration, configured-assets support, plugin lifecycle, managed
shell, manifest, package integration, report/output route, public Quickstart,
SQLite or custom persistence support, automatic
optimization, plugin-fault attribution, or artifact mutation/recovery. See the
[canonical source matrix](https://github.com/QoderAI/better-harness/blob/main/docs/adapters/README.md)
and [Story #93](https://github.com/QoderAI/better-harness/issues/93).
Expand Down
84 changes: 83 additions & 1 deletion docs/docs/installation.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,92 @@ managed plugin lifecycle surface. There is no `plugin apply` command.
Git can clone the Cursor manifest for inspection, but manifest presence alone
does not establish a supported installation route.

## DeepSeek Harness verified discovery (not Quickstart) {#deepseek-harness-dsh}

DeepSeek Harness (DSH) has a bounded **Verified install/discovery** route for
the qualified DSH `0.1.1-rc.2` contract. This is not a public Quickstart or a
complete report loop.

Start from a complete Better Harness source checkout or npm package directory.
Call its absolute directory `<BETTER_HARNESS_ROOT>` below. It must contain
`skills/better-harness/SKILL.md`, `scripts/better-harness.mjs`, `references/`,
`models/`, and `templates/`.

### Headless/base

In the active headless profile's `cordis.patch.yml`, configure the existing
global Skill filesystem row and insert the Better Harness DSH policy:

```yaml
- id: skill-filesystem
config:
customSkillDirs:
- /absolute/path/to/better-harness/skills

- insert:
- id: better-harness-explicit-only
name: /absolute/path/to/better-harness/scripts/dsh-skill-discovery/index.mjs
config:
betterHarnessRoot: /absolute/path/to/better-harness
```

The profile file is normally
`$DSH_HOME/profiles/headless/cordis.patch.yml`. Replace every example with the
same real absolute root before starting a new session.

### Web `standard`, `code`, or `cordis`

The Web host owns Skill discovery inside the selected agent preset. In Web's
Agent Presets settings, copy `standard`, `code`, or `cordis` to a user preset.
Edit that copy's active `skill-filesystem` row in
`$DSH_HOME/.agent-presets/<your-preset>/agent.cordis.yml`:

```yaml
- id: skill-filesystem
name: '@deepseek-ai/dsh-skill-filesystem'
config:
customSkillDirs:
- /absolute/path/to/better-harness/skills
```

Then insert the same `better-harness-explicit-only` policy row shown above in
`$DSH_HOME/profiles/web/cordis.patch.yml`, select the copied user preset, and
start a new session. Editing only the global Web `skill-filesystem` row is not
the qualified route. Web `minimal` does not mount the Skill loader and remains
unsupported.

### Verify the boundary

Enter the gesture directly as the user:

```text
/better-harness
```

DSH must inject the canonical Skill before model request derivation. The local
policy checks DSH's winning source, path, directory resource base, complete-root
invariant, and required root resources. It rejects a higher-precedence
project-local same-name Skill and rejects model-facing
`skill({ name: "better-harness" })` calls.

Use an absolute path on macOS, Linux, and Windows, including when it contains
spaces or Unicode. DSH resolves relative `customSkillDirs` from its process
working directory and does not expand a literal `~`. Do not install a standalone
Skill copy or use a symlink/junction as the canonical route. If the complete
Better Harness root moves, update both the `customSkillDirs` value and policy
plugin path/configuration. Repository contributors can repeat the pinned,
credential-free native proof with `npm run test:dsh-native`.

This maturity level does not provide configured assets, evidence-bundle or
report registration, output routing, rendering, lifecycle management,
MCP/profile product support, Web `minimal`, or a full report workflow. The
[adapter matrix](./hosts/adapter-matrix#deepseek-harness-dsh) tracks the exact
boundary.

:::tip Don't see your Coding Agent?

The six tabs below are the verified Quickstart paths, while the project tracks
ten host adapters in total. [Compare all adapter support boundaries](./hosts/adapter-matrix),
ten fuller host adapters plus bounded DSH slices. [Compare all adapter support boundaries](./hosts/adapter-matrix),
then [follow the new-host contribution workflow and worked pull requests](./hosts/contributing-new-coding-agent)
if you want to add or complete an integration. You can also
[browse current repository pull requests](https://github.com/QoderAI/better-harness/pulls)
Expand Down
Loading
Loading