返回目录
文件与数据 插件

dsh-raven-research

wxxb789/dsh-raven-research

Source-grounded deep research, writing, and learning plugin for DeepSeek Harness (dsh): steerable checkpoints, mid-run steering, and citations verified against retrieved sources.

Stars
0
Forks
0
Issues
0
更新
今天

PROJECT TOPICS

项目标签

INSTALL REFERENCE

安装参考

未验证
dsh plugin --profile web add github:wxxb789/dsh-raven-research

该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。

PROJECT README

README

dsh-raven-research — start, checkpoint, steer, complete, export: one progressive, source-grounded Task inside DeepSeek Harness

dsh-raven-research

One progressive, source-grounded Task for deep research, writing, and learning — inside DeepSeek Harness.

Early checkpoints you can steer mid-run · citations verified against the bytes actually retrieved · no second agent runtime.

CI DeepSeek Harness plugin Harness 0.1.0-rc.8 TypeScript Node License MIT Stars

English · 中文

TL;DR · Install · Usage · How it works · Configuration · FAQ

[!IMPORTANT] v1 developer preview. Pinned and tested against DeepSeek Harness 0.1.0-rc.8, which is itself an RC and ships breaking changes. Not published to npm yet — install from a checkout.

TL;DR

  • What it is: a DeepSeek Harness (dsh) plugin that adds one progressive, evidence-aware Task abstraction for deep research, general writing, academic writing, and learning.
  • Why it matters: you get a useful Checkpoint early, you steer it mid-run instead of restarting, and every citation is checked against the bytes actually retrieved — not against what the model remembers.
  • How it is built: one Cordis plugin on the host plane, one model-facing raven_task tool, one compact prompt section, and one settings card in the Web GUI. No second agent runtime, no model host, no vector store, no database. The Harness agent keeps researching and writing with its normal tools.
  • Install: pnpm build && pnpm pack, add the tarball to your Harness deployment, then dsh plugin --profile <name> add dsh-raven-research. See Install.
  • Use: talk to the Harness agent normally — no launch phrase, no separate Task UI. See Usage.

    Why Raven

A substantial research or writing request usually disappears into a long batch pipeline: you wait, you get one wall of text, and the citations are whatever the model remembered. Raven changes the shape of that work.

Plain long-running agent run With Raven
Silence until a final dump An early useful outline, draft, or findings set as a Checkpoint, then incremental refinement of the same Artifact
A correction restarts the work A correction becomes a Steering Revision on the same Task; prior evidence and Checkpoints survive
Citations are remembered strings Citations resolve to inspected Sources; excerpts are matched against retrieved bodies
Three reprints of one wire story read as three confirmations Claims sharing a declared sourceFamily are marked as not independent corroboration
One dead link fails the whole run Failed dependencies defer only the affected Claims; independently verified work still completes honestly
State dies with the tool call The Task book is rebuilt from the session log and survives stop/resume

Normal discover → read → analyze → draft → verify → refine movement stays autonomous. Raven asks only when an unresolved choice changes the public outcome, evidence floor, audience, deliverable, significant cost, or an external/destructive/sensitive side effect.

Features

  • Batched discovery over the official search seam. discover sends several complementary queries in one Task step through the Harness web search capability, folds one URL returned by several queries into one Lead, and keeps every sibling's results when a query fails — the failure is recorded as a Limitation, not an aborted batch. What comes back are Leads, never Sources: nothing can be cited until it has been opened and excerpted.
  • Agent Teams reuse. Where the deployment composes the Harness Agent Teams capability, the Raven Task belongs to the Team: every member reads and extends the same Task, a teammate cannot start a competing one, and each member's own durable records merge into one Task book. Where no Team is composed, nothing changes.
  • Progressive delivery. A Checkpoint is useful on its own and is published while the Task is still running, so you can redirect the work before the expensive part.
  • Steering instead of restarts. steer applies a user correction to the live Task and preserves prior evidence.
  • Citations checked against retrieved bytes. Artifacts cite stable Source IDs with [@source-id]. Raven matches bounded excerpts against retrieved bodies, renders recorded URLs mechanically, and rejects unknown citations, unregistered URLs, cross-host redirects, and broken or mismatched Sources. A mismatch reports the nearest retrieved passage so the anchor can be repaired instead of retried blindly.
  • Independence-aware Claim trace. Every Completion appends a trace mapping material Claim IDs and text to Source IDs, marking Claims whose Sources share one sourceFamily so reprints of a single originating record cannot read as several confirmations. Genuinely conflicting Claims are recorded as contested rather than silently resolved.
  • Honest partial results. Withdrawn Claims force the asserting prose to be edited in the same Checkpoint; a dropped citation may not leave a bare assertion standing. Unverifiable evidence refuses publication rather than silently downgrading to "unchecked".
  • Session-durable Task book. Works from a direct tool call and from inside a Code Mode run_code program, and survives stop/resume — see One Task book, two durability paths.
  • One sentence per line. Every stored Artifact is normalized so each sentence occupies its own line, making a line the smallest edit unit: a revision diffs as the sentences that actually changed instead of as whole rewritten paragraphs. The transform is Markdown-structure-aware and idempotent — fenced code, tables, headings, thematic breaks, link definitions, math blocks, YAML frontmatter, hard line breaks, and list/blockquote continuation prefixes are copied through untouched.
  • Draft Variants. draft asks every configured provider/model route for the same bounded instruction and returns the candidates, each laid out one sentence per line so they diff line by line. A Draft Variant is a candidate exactly as a Lead is: it carries no evidence, can never be cited, and never counts toward the evidence floor. Off until a deployment configures routes.
  • First-class settings namespace. Registering the plugin exposes raven-research to every configuration surface a Harness deployment composes; there is nothing to add to the Harness itself.
  • A settings card in the Web GUI. Raven ships a browser half that registers a card under Settings › Plugins for its own namespace — see Configuration for what that requires.
  • Durable export. export emits a valid llm-wiki repository — artifact page, immutable raw/ source pages with verification receipts, and an appendable log.md — that the agent writes with ordinary file tools. Raven never touches the filesystem itself.

Install

Raven is not on npm yet, so install it from a checkout. Everything below happens outside the Harness repository: you never edit a Harness checkout or a shipped preset.

Requirements

Requirement Version
DeepSeek Harness 0.1.0-rc.8 (checkout 141eb6fef83422698aef7a981029e843e8161534)
Node.js ^22.19.0 \|\| >=24.0.0
pnpm 11.21.0
Peer dependencies Nine @deepseek-ai/* packages — the cordis framework, the schema library, and seven Harness Service Definitions (cordis, dsh-agent, dsh-llm, dsh-session, dsh-settings, dsh-system-prompt, dsh-tools, dsh-web, schemastery) — supplied by the Harness deployment, never bundled

1. Build and pack

git clone https://github.com/wxxb789/dsh-raven-research.git
cd dsh-raven-research
pnpm install --frozen-lockfile
pnpm build
pnpm pack        # -> dsh-raven-research-0.1.0.tgz

2. Add the tarball to your Harness deployment

Run this from the deployment root; the package only has to be resolvable in that Node resolution graph:

pnpm add /path/to/dsh-raven-research-0.1.0.tgz

The tarball installs with no runtime dependency of its own; the deployment supplies the peers. They are peers rather than dependencies on purpose: a profile installs plugins with autoInstallPeers: false so they fall through to the running installation and every plugin shares one cordis instance. Once the package is published, the equivalent dependency is dsh-raven-research@0.1.0.

3. Enable it

Raven declares a Profile Bundle (dsh.bundle.patch in package.json), so the Harness CLI can mount it for you:

dsh plugin --profile <name> add dsh-raven-research

That appends the package to the profile's dsh.profile.bundles, and the bundled cordis.patch.yml inserts one row on the host plane:

- insert:
    - id: raven-research
      name: dsh-raven-research

Host plane is deliberate. Raven publishes no Service, so the usual host-plane criterion does not apply; what does apply is that two of the things it registers are process-wide. Its settings namespace can only be offered while something serves it — mounted only inside a preset, raven-research would appear in the settings UI exactly while a session using that preset happened to be alive, and vanish between sessions. The tools/code-dispatch-log waterfall, which carries the durable record of a Task step taken from inside run_code, is process-wide for the same reason. Because tools and system-prompt are layered registries, a host row lands in the global layer and every agent sees raven_task without opting in.

Alternative: scope Raven to one agent preset


To give Raven to a single preset instead, skip the bundle and append the row from examples/agent-row.cordis.yml to that preset's cordis.yml:

- id: raven-research
  name: dsh-raven-research
  # Optional base layer for the raven-research settings namespace:
  # config:
  #   sourceVerification: remote
  #   sourceCheckTimeoutMs: 30000

[!WARNING] Never edit a shipped Harness preset — copy it first. Raven publishes no process service, so this row needs no isolate realm. It consumes the preset's scoped tools and systemPrompt registries and obtains web dynamically when source reopening is available.

[!WARNING] Do not do both. The same package mounted on the host plane and inside a preset registers raven_task twice, into two different layers.

4. Verify

Start the Harness and ask the agent for something substantive (see Usage). Raven is live when a raven_task call appears in the transcript and a Checkpoint arrives before the final answer.

Upgrade

cd dsh-raven-research
git pull
pnpm install --frozen-lockfile
pnpm check          # lint, typecheck, test, build
pnpm pack

Then re-add the fresh tarball from the deployment root:

pnpm add /path/to/dsh-raven-research-<version>.tgz

pnpm keys a local tarball by its integrity hash, so new bytes are picked up even when the version string is unchanged; if a deployment still serves the old build, run pnpm install --force.

Two things to check before upgrading:

  • Harness pin. Compare dshRaven.harnessVersion in package.json with the Harness you actually run. Raven is pinned to one RC and does not claim compatibility with untested versions.
  • Settings. raven-research values stored in the user's settings.yaml survive the reinstall; the preset config: block is only the base layer.

[!WARNING] An in-flight Task lives in the session, not on disk. Finish it or export it before swapping the build.

Uninstall

  1. Remove Raven from the profile bundle:

    dsh plugin --profile <name> remove dsh-raven-research

    If you mounted the preset row instead, delete the - id: raven-research row from that preset's cordis.yml.

  2. Remove the package from the deployment:

    pnpm remove dsh-raven-research
  3. Optional: drop the raven-research section from the user's settings.yaml.

Every Raven registration — the raven_task tool, the prompt section, the agent/pre-step listener, the tools/code-dispatch-log listener, the settings section, and the browser card — is disposer-backed and owned by its Cordis fiber, so unloading removes all of it and leaves no orphaned tool or prompt text (pnpm test:dsh exercises exactly that disposal path against a real Harness Loader). Restart the Harness if your deployment does not reload the composition on change.

Nothing else is left behind: Raven owns no database, no cache, and no files. Task state lives in the Harness session log, and anything you exported is a plain llm-wiki repository you already own.

Usage

There is no launch phrase and no separate Raven UI — users talk to the Harness agent normally, and the model drives the Task lifecycle.

Research the strongest primary-source evidence for and against this policy. Show me
an early findings outline, keep working, and refine it into a decision memo.
Turn these notes into an 800-word essay for engineering managers. Draft early so I
can redirect the emphasis.
Develop a literature-review section from these papers. Preserve disagreement and do
not invent references.
Teach me closures with one mental model, two worked examples, and a self-check.

Steering is just the next message — "focus on cost, not adoption", "make it more sceptical", "cite only primary sources" — and it lands on the same Task instead of starting a new one.

The raven_task actions

raven_task is model-facing. These are internal lifecycle operations on one user Task, not workflows a user has to manage:

Action What it does
start Opens one Task with an Outcome (research, general-writing, academic-writing, learning) and a grounding level (required, optional, none).
discover Runs one batch of complementary queries through the Harness web search seam and returns Leads — uninspected candidates, never Sources. A failing query becomes a Limitation instead of losing the batch.
draft Asks every configured provider/model route for the same bounded instruction and returns the candidates for comparison. A Draft Variant carries no evidence and can never be cited.
checkpoint Publishes a user-visible Artifact version with new Sources, Claims, and recorded failures, and verifies grounded evidence.
steer Applies a user correction to the same Task, preserving prior evidence and Checkpoints.
complete Validates citation identity, material Claim links, matched excerpts, Source reachability, and the exact Artifact fingerprint against the latest post-steer Checkpoint.
status Reports the current Task book.
stop Ends the Task with a recorded reason; explicitly not Completion.
resume Reopens a stopped Task — including an older one — without losing evidence or Artifact.
export Returns llm-wiki page bytes for the agent to write with ordinary file tools.

One sentence per line

Raven stores every Artifact in the Task's Prose Layout rather than in whatever line shape the model submitted. Under the default sentence-per-line layout each sentence occupies its own line, so a line is the smallest edit unit and a revision diffs as the sentences that actually changed. Markdown structure is never reflowed: fenced code, tables, headings, thematic breaks, link definitions, math blocks, YAML frontmatter, hard line breaks, and list or blockquote continuation prefixes are copied through as written.

The transform is idempotent, and the stored bytes are the ones Completion compares against — so the returned Artifact, not the submitted one, is what the model edits next. Set proseLayout: as-written to store exactly what the agent wrote, or proseFormat: plain where Artifacts are not Markdown.

Comparing wording: Draft Variants

action=draft sends one bounded instruction — a section, a paragraph, an abstract — to every configured provider/model route and returns the results together, each laid out one sentence per line so they diff line by line. A route that fails or times out costs its own variant, never the round.

A Draft Variant is a candidate, exactly as a Lead is. It carries no evidence, may never be cited, and never counts toward the evidence floor; a sentence every variant agrees on is still unsupported until a recorded Source excerpt supports it. Adopt phrasing, never facts.

The deployment owns the route list: the agent may select a subset of draftRoutes and nothing else, because naming a model is naming spend and a data path. An unknown route is refused with the configured set named rather than quietly substituted. Drafting is off until a deployment sets draftRoutes; until then the call reports that instead of drafting from the session model.

Keeping the result after the session: llm-wiki export

After Completion, action=export returns page bytes for an llm-wiki repository: an artifact page under wiki/queries, one immutable wiki/raw page per Source carrying the verified excerpt and its verification receipt (capture: excerpt-only), and one appendable wiki/log.md entry. Pass init=true to also seed SCHEMA.md, index.md, and log.md for a repository with no wiki yet. The result is a valid llm-wiki, readable by Obsidian and by that skill's own tooling. Write the returned bytes exactly — each raw-page digest covers its own body, so editing after export invalidates it.

How it works (under the hood)

flowchart LR
  U[User request] --> S["raven_task start"]
  S --> C1["Checkpoint<br/>early useful Artifact"]
  C1 --> ST["steer<br/>user correction"]
  ST --> C2["Checkpoint<br/>refined Artifact"]
  C2 --> V{"Source and Claim<br/>verification"}
  V -- "excerpt matches retrieved bytes" --> D["complete"]
  V -- "unknown citation / broken source" --> L["Claim deferred<br/>Limitation recorded"]
  L --> C2
  D --> E["export<br/>llm-wiki pages"]

What the plugin registers

Raven exports plain Cordis plugin metadata (name, inject = ['tools', 'systemPrompt'], a Schemastery Config, and apply) and keeps apply thin. On the host plane it registers:

  • one raven_task model tool through ctx.tools;
  • one compact static section through ctx.systemPrompt;
  • one agent/pre-step listener that puts the live Task book in front of the model before each step;
  • one tools/code-dispatch-log listener that keeps a Code Mode Task step durable (see below); and
  • the raven-research settings section, gated behind ctx.inject so a deployment without a settings service simply never runs that wiring.

The package also ships a browser half (dsh.client, exported as ./client) whose only contribution is one card in the keyed settings.plugin.item slot, registered under the key raven-research — the same string the host half registers as its settings namespace. That keying is what lets a plugin distributed outside the Harness repository contribute a card at all: the tab pairs the two halves without ever learning what the namespace means. The browser half mirrors no Task state; the tool, the evidence checks, the model calls, and the durable record are all host concerns.

web is deliberately not injected: it is fetched dynamically from the context when a Source has to be reopened or a discovery batch runs, so a deployment without it still loads and still writes. The experimental agentTeams capability is read the same way and is never a dependency: it is private and unpublished upstream, so Raven mirrors only the shape it reads and degrades to single-agent behaviour everywhere else. Every registration returns a disposer owned by the calling fiber, which is what makes uninstall clean.

One Task book, two durability paths

Raven keeps one Task book per session — or per Agent Team — and rebuilds it from the session log rather than from storage of its own:

  • A direct tool call carries the Task record as durable result metadata (tool/result.meta, kind dsh-raven-research/task-state).
  • A call made inside a Code Mode run_code program is a nested sub-call with no result card, so the Harness computes no presentation metadata for it. Raven attaches the same record to the durable copy of that sub-dispatch instead, through the tools/code-dispatch-log waterfall, as an HTML comment on the Harness-owned tool/code-dispatch event.

[!IMPORTANT] Raven writes no plugin-owned session event type. The Harness persistence read path refuses to interpret any stored log containing an event type it does not know unless the writer marked that event ignorable, and Session.append gives an out-of-repo plugin no way to set that marker — so a single Code Mode Task step written under a plugin-owned type would make the entire session unloadable. Riding a known event type keeps the session loadable by construction. If a deployment's spill policy replaces an oversized log copy, that one step is simply not restored; the session still loads, and the next direct call republishes the whole record.

Either path restores the book when a session resumes, so a Task advanced from inside a program is not silently lost.

One Task per Agent Team

Where the deployment composes the Harness Agent Teams capability, Raven keys the Task book by the Team id rather than by the Agent id, so the Lead and every teammate share one Task identity, one evidence set, and one Artifact. A teammate's start is refused while the Team's Task is active, its Checkpoints land on that Task, and each member's own durable records merge into the shared book as that member is first seen. Raven reads the capability structurally through ctx.get('agentTeams') and contains every call: the Team packages are private, unpublished, and carry no stability promise upstream, so the absence — or a throwing probe — must never fail a Task step.

The failure path carries the Task too

A failed call has to reach the model with the Task it must correct against, but the registry's own error text cannot know a Task is open. Raven attaches a <raven_task_recovery> note through the tool-owned content finalizer — the one hook that also runs for invalid arguments and cancellations, where the output projection never runs at all.

The verification pipeline

Grounded Checkpoints and Completion run recorded Sources through an internal SourceVerifier seam (a Harness-web adapter in production, a deterministic adapter in tests):

  1. Reopen the recorded URL over the Harness web capability, bounded by sourceCheckTimeoutMs.
  2. Reject a redirect that leaves the recorded source identity, so a parked or aggregated host cannot silently stand in for a citation.
  3. Normalize HTML presentation to text, then match the bounded excerpt literally; a mismatch reports the nearest retrieved passage instead of a bare failure.
  4. Treat a truncated retrieval as unverifiable, never as fabrication — a body the fetch contract cut off is a retrieval limit, not missing evidence.
  5. Report a per-Source timeout as unverifiable instead of holding the whole Checkpoint open.

Completion then re-checks citation identity, material Claim links, Source reachability, and the exact Artifact fingerprint, and appends the independence-aware Claim trace.

Package surface and non-goals

Raven ships as one dependency-light ESM package: one Cordis plugin, one model tool, one prompt section, a pure TypeScript Task engine, a browser half contributing a single settings card, compact same-session replay through official tool/result.meta and tool/code-dispatch, and three seams over official Harness capabilities — a SourceSearcher for Leads and a SourceVerifier for evidence over ctx.web, and a drafter for Draft Variants.

It deliberately excludes a Task GUI, model host, vector store, custom scheduler, general agent framework, and Raven-owned database. Long-running goals, subagents, workflows, files, and persistence remain Harness responsibilities.

Design evidence and decisions


Configuration

Raven owns the raven-research settings namespace. Registering it is what exposes it: a Harness that composes a settings provider serves the namespace to every configuration surface.

Field Default Effect
sourceVerification remote structural-only withholds every remote check. No Source can then be confirmed, so a Checkpoint that records Sources is refused with the policy named. Set it only where the network is genuinely out of reach.
sourceCheckTimeoutMs 0 Deadline for one remote Source check, in milliseconds. 0 means no deadline. An exceeded deadline reports that one Source as unverifiable instead of holding the Checkpoint open.
sourceDiscovery seam disabled withholds action=discover entirely: the call reports discovery as unavailable and records a Limitation rather than returning an empty result the agent could mistake for "nothing exists". The agent keeps its own Harness tools.
searchMaxQueries 4 Upper bound on queries in one discover batch, mirroring the Harness web_search batch bound. The bound is applied before deduplication, so repeating a query spends its slot.
searchMaxResults 8 Upper bound on candidates requested per query, mirroring the Harness web_search source bound. The merged Lead list is bounded separately.
searchTimeoutMs 30000 Deadline for one discovery query, in milliseconds. 0 means no deadline. An exceeded query is recorded as a failed query and a Limitation; its siblings still return their Leads.
proseLayout sentence-per-line How every stored Artifact is laid out. The default puts one sentence on each line, making a line the smallest edit unit. as-written stores exactly what the agent submitted.
proseFormat markdown The Artifact format Raven assumes. markdown is the documented default final output format and is what makes the layout structure-aware. plain treats every line as prose, so a deployment whose Artifacts are not Markdown does not get its headings and code reflowed as sentences.
draftRoutes [] Model routes a Draft Variant may be requested from, one provider/model per entry, split on the first slash so a namespaced model id survives — openrouter/deepseek/deepseek-chat is the provider openrouter and the model deepseek/deepseek-chat. This list is the whole universe: the agent may select a subset of it and nothing else. Empty disables Draft Variants and reports that instead of drafting from the session model.
draftMaxTokens 4000 Upper bound on one Draft Variant, in model output tokens. 0 means the built-in bound. Every route in a round shares it so the variants stay comparable.
draftTimeoutMs 120000 Deadline for one Draft Variant, in milliseconds. 0 means no deadline. A route that exceeds it produces no variant and says so; its siblings still return theirs.

[!NOTE] No setting can lower a Task's evidence floor. Withholding checks makes evidence unverifiable, which refuses publication; it never turns unchecked Sources into confirmed ones.

The composition entry in cordis.yml is the base layer. A value stored in the user's settings.yaml overrides it and takes effect on the next Source check, with no restart; if the settings service goes away, the composition entry becomes authoritative again.

A browser card for this namespace is registered under Settings › Plugins by Raven's browser half, so the fields above are editable without hand-writing settings.yaml. The card renders every field, marks which keys the user layer actually overrides, and refuses a Save while any staged edit is unparseable rather than writing the valid half of a form.

Two honest requirements. The card only appears in a deployment that composes @deepseek-ai/dsh-client-ui-settings-plugins — the Harness web app bundle does. And the keyed settings.plugin.item slot it targets is the contract as declared by Harness 0.1.0-rc.8; the published copy of that package still declares the older list-shaped slot, so Raven vendors the newer shape and scripts/verify-dsh.ts asserts it against the Harness checkout under test, which turns any drift into a failed release gate instead of a card that silently never renders.

Compatibility

Raven v1 is pinned and tested against:

  • DeepSeek Harness 0.1.0-rc.8;
  • Harness checkout commit 141eb6fef83422698aef7a981029e843e8161534;
  • Node.js ^22.19.0 || >=24.0.0; and
  • pnpm 11.21.0.

DeepSeek Harness is currently an RC and ships breaking changes. Raven does not claim compatibility with untested Harness versions.

Development

pnpm install --frozen-lockfile
pnpm check
pnpm test:pack

The repository uses a TypeScript-first modern toolchain: TypeScript 6 for strict type checking, tsdown for ESM and declaration builds, Vitest for unit/integration/acceptance tests, Oxlint with warnings denied, and pnpm with a frozen lockfile and an explicit esbuild build allowlist.

Verify the real Harness Loader, prompt registry, tool registry, execution pipeline, and Cordis disposal against the intended checkout:

$env:DSH_CHECKOUT = 'Q:\repos\deepseek-harness'
pnpm test:dsh

For a release-equivalent local gate:

$env:DSH_CHECKOUT = 'Q:\repos\deepseek-harness'
pnpm check:release

Acceptance coverage

The Vitest suite covers all four Outcomes and verifies that Raven …


  • batches complementary discovery queries, folds one URL into one Lead, and survives a failing query;
  • refuses to present Leads as evidence, and reports withheld or absent discovery instead of an empty search;
  • lays every stored Artifact out one sentence per line, idempotently, without reflowing Markdown structure;
  • returns Draft Variants as candidates only, and reports an unconfigured or unknown route instead of substituting one;
  • inserts exactly one host-plane row from the bundle patch, and registers the settings card under its namespace key;
  • shares one Task across an Agent Team and refuses a teammate's competing Task;
  • keeps a Code Mode Task step durable without writing any plugin-owned session event type;
  • exposes a useful intermediate research Artifact before final verification;
  • refines the same Task after a mid-run user correction;
  • proceeds through normal stages without a confirmation action;
  • rejects unknown references and recorded excerpts absent from retrieved source bytes;
  • reopens cited URLs before grounded Checkpoints and again at Completion;
  • preserves independent results across partial source failures;
  • requires Completion bytes to equal the latest post-steer Checkpoint;
  • distinguishes Completion from tool/worker termination; and
  • stops and resumes without losing the Task, evidence, or Artifact.

pnpm test:pack creates an isolated staging project with no lib/, links only the pinned development toolchain, exercises the real prepack lifecycle without mutating the repository build, checks the exact nine-file allowlist, and installs the tarball with an isolated pnpm home/store in a second external consumer before import, apply, and model-tool execution.

FAQ

Does Raven replace the Harness agent, or add another model? Neither. Raven adds one task abstraction and one tool. The existing Harness agent does the research and writing with its own tools and its own model.

Do I need a vector database, an index, or an embedding pipeline? No. Raven has no store of its own. Sources are recorded by stable identity and reopened over the Harness web capability when verification runs.

Does Raven search the web itself, or does the agent? Both, on purpose. action=discover runs a batch of complementary queries through the same ctx.web search seam that backs the Harness web_search tool, so the queries and their failures become part of the Task record instead of disappearing into the transcript. The agent keeps its own retrieval tools for everything else, and it is still the agent that opens a Lead and records the excerpt — discovery never produces evidence.

Does it work inside an Agent Team? Yes. The Raven Task belongs to the Team rather than to one member. Agent Teams is an experimental, unpublished Harness capability, so Raven consumes it optionally: without it, every Agent simply owns its own Task book.

Does it work without web access? Yes, for non-grounded writing and learning. Without a composed Harness web capability, external Claims are not published as supported: they remain deferred, and a grounding-required Task with zero valid Claims stays active rather than being labeled complete.

Does it work in Code Mode (run_code)? Yes — see One Task book, two durability paths.

How is this different from a "deep research" pipeline? A pipeline hides its middle and hands you one final report. Raven publishes the middle as steerable Checkpoints on one continuing Task, and gates Completion on excerpt-level verification rather than on the run having finished.

Does excerpt matching prove the Claim is true? No. Raven verifies URL reachability and literal presence of the bounded excerpt after whitespace/HTML presentation normalization. Literal presence is not semantic entailment; the agent remains responsible for Claim judgment.

Is it on npm? Not yet. Build and pack from a checkout — see Install.

Which DeepSeek Harness versions are supported? Only the pinned RC listed under Compatibility.

How do I remove it cleanly? Drop one preset row and one dependency — see Uninstall. Raven leaves no database, cache, or files behind.

v1 limits

  • Excerpt verification is literal, not semantic (see FAQ).
  • The four Outcomes select grounding defaults and explicit prompt policy inside the existing Harness agent; Raven embeds no second model and no deterministic prose generator, so content quality remains model-dependent.
  • Natural-language correction detection is performed by the Harness model using Raven's pre-step context. The plugin supplies the deterministic same-Task steer transition; it does not guess corrections with a rule-based text classifier.
  • Without a composed Harness web capability, external Claims stay deferred.
  • State is durable within the owning Harness session, including multiple stopped or completed Task identities and later resume of an older Task. Cross-session projects, reusable corpora, and spaced-repetition storage are out of scope; export is the supported way to keep work.
  • Raven renders Task progress through ordinary tool results and chat; its only browser surface is the settings card, and v1 has no custom UI for the Task itself.
  • Draft Variants are off until a deployment configures draftRoutes, and a variant is never evidence: it cannot be cited and never counts toward the evidence floor.

Contributing

Issues and pull requests are welcome. Run pnpm check before opening a PR; the release-equivalent gate is pnpm check:release with DSH_CHECKOUT pointing at a Harness checkout.

If Raven saves you a rewrite, a ⭐ helps other DeepSeek Harness users find it — and browse dsh-plugin for the rest of the ecosystem.

License

MIT


TL;DR · Install · Upgrade · Uninstall · Usage · How it works · FAQ

Keywords: DeepSeek Harness plugin · dsh-plugin · Cordis plugin · AI research agent · deep research · agentic research · source grounding · citation verification · evidence-based writing · academic writing assistant · learning assistant · retrieval-augmented generation · hallucination mitigation · TypeScript · Node.js

CLASSIFICATION EVIDENCE

分类依据

项目类型插件
功能分类文件与数据
规则置信度

系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: academic-writing、ai-research、deep-research、rag、research-agent。