Prose review for human-facing writes. The write and edit tools require a human_facing flag; the plugin reviews the text against layered PROSE.md rules in the background, stages annotations, reconciles them against the full file, and merges them through /humanize, /humanize-loop or post-compaction while the main session keeps working. /humanize-review runs a batch over git-tracked files on demand.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Lry722/dsh-humanize
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 简体中文
Let reasoning models focus on the work. Let what they deliver read like a person wrote it.
dsh-humanize is a plugin for deepseek-harness. It targets the machine-sounding jargon that coding-specialized models produce on complex tasks.
Why it exists
Coding-specialized models handle complex engineering reasoning, but their prose drifts toward machine jargon. That costs the reader extra effort.
Packing many style and rhetoric constraints into the main prompt splits the model's reasoning attention, and complex tasks get slower.
How it works
dsh-humanize separates logical reasoning from prose polish:
- Mark at write time: when content is written, separate code and data from text meant for people. Only human-facing writes trigger review.
- One style contract:
PROSE.mddefines how prose should read. - Cite each rule: the reviewer annotates against individual
PROSE.mdrules and points at the expression that violates the rule. - Apply later: review runs in the background while the main session keeps moving. Annotations merge when the user asks for them.
Install
Install from GitHub:
dsh plugin --profile web add github:Lry722/dsh-humanize
For local development, link the current directory:
dsh plugin --profile web add link:/path/to/dsh-humanize
Restart dsh after installation.
Configuration
Open the dsh-humanize row in the Plugins list and edit its configuration. The bottom of the settings page shows where staged annotations and review request records are stored, with a copy button beside each path. These settings take effect immediately:
reviewProviderandreviewModel: the model used for review, picked from the host model catalog. Defaults to the model the session is using.reviewReasoningEffort: reasoning effort for the review model, picked from the efforts that model publishes. Defaults to the model's own default.mergeProviderandmergeModel: the model used by the merge subagent, with the same controls as the review model. The merge subagent covers/humanize,/humanize-loopand compaction-triggered merges. Defaults to the model the main session is using. Set both fields together; if only one is set, both follow the session model.mergeReasoningEffort: reasoning effort for the merge subagent, picked from the efforts that model publishes. Defaults to the reasoning effort the main session is using.reviewConcurrency: concurrency for batch review. Minimum 1, default 3.reviewRetries: number of retries after a failure. Minimum 0, maximum 3, default 1.loopMaxRounds: maximum rounds for loop merge. Minimum 1, maximum 10, default 3.mergeOnCompaction: whether to merge all staged annotations in the project when context compaction ends. Default true. When off, merges only run on/humanizeor/humanize-loop.storageDir: where staged annotations are stored. Leave empty for the default~/.dsh/humanize.
Each of the review and merge model sections has a test button. It sends a minimal request to confirm the provider, model and reasoning effort respond. An empty model selection follows the session model for review; the test button requires both fields to be set.
Review call records are stored separately in the system temp directory; the exact path appears at the bottom of the settings page. When a review response cannot be parsed, the raw response is written next to the call record for comparison.
Relative paths resolve against the process working directory. Changing the storage location leaves the old contents in place.
Batch review concurrency is capped by the number of files to review. High concurrency can hit the model provider's rate limit.
A call that hits a rate limit is recorded as failed and retried. A review that times out is aborted; that review ends as aborted and is not retried. Other failures wait longer before each retry; after the retry budget is spent, the review is marked failed. Write review and batch review share this retry behavior.
When a batch review ends, it lists the files that still failed and why, up to three entries; the rest are counted only. If write reviews keep failing, a failed record appears in the task list and points at the review model configuration.
You can also pass the same settings to the dsh-humanize entry in the profile's cordis.patch.yml:
- id: dsh-humanize
config:
settings:
reviewProvider: deepseek
reviewModel: deepseek-chat
Usage
Put a PROSE.md in the directory of the file under review or in a parent directory. The user-wide spec goes at ~/.dsh/PROSE.md. Specs stack by directory; the narrower the scope, the higher the priority.
The front matter of PROSE.md can declare which files the spec covers with include, using .gitignore syntax:
---
include:
- '*.md'
- 'docs/**/*.txt'
- '!drafts/'
---
include belongs to the whole spec chain. If any level of the chain declares it, only files that match enter review. Write review and batch review both follow this scope. If no level declares include, the spec applies to every file.
Binary files such as images, archives, fonts and build output skip review. Detection samples the start of the file; write review and batch review both use it. A batch review reports how many files it skipped.
When the model writes a file it must declare human_facing. Pass true for content meant for people, false for pure code or data. Writes marked true enter review; the rest are skipped. A programmatic call that omits the field is treated as false and logs a warning. Review looks only at the regions changed in this write.
Reviews of the same file run serially. Writes from different sessions or subagents queue separately, and pending entries are kept per agent without overwriting each other. While a merge runs, the reviews of the agent that started it step aside. Reviews from other agents on the same target files also step aside.
Annotations are staged under ~/.dsh/humanize/annotations/. The path mirrors the reviewed file. Annotations can be edited directly. The storage location can be changed on the settings page.
Run /humanize <path> to merge annotations for a file or directory. With no path, it uses the current working directory.
The merge runs in a separate context. When it finishes, the main session receives a summary.
The staged annotations for the merged files are cleared.
The plugin then runs another review over the files it just changed; this is called re-review. New annotations from re-review also stay in the staging files.
The merge result appears in the main session summary; the re-review result appears in the task row. If re-review fails for /humanize or /humanize-loop, the task ends as failed, no longer counts as converged, and a note is added to the main session.
When a merge starts, running reviews are aborted first. Queued reviews are discarded, and annotations already produced are discarded with them. Reviews from other sessions on the same files also step aside.
If the plugin reloads during a merge or re-review, that run ends. Completed merges still clear their staged annotations. Incomplete merges keep them; run the command again to continue.
Run /humanize-loop <path> to merge and re-review in a loop. After each merge round, every file just merged is re-reviewed. New annotations from re-review feed the next merge round. The loop ends when re-review produces no new annotations or the round limit is reached.
The merge target, round and files awaiting re-review stay in memory. If staged annotations are empty mid-run, the loop waits for re-review before deciding whether new annotations remain. Only one merge run is allowed at a time, across sessions.
If the plugin reloads during a loop, that run ends. Completed merges still clear their staged annotations. Incomplete merges keep them.
/humanize, /humanize-loop and compaction-triggered merges all register background tasks. The loop progress bar shows the current round and the number of annotations in that round.
/humanize and /humanize-loop tasks can be cancelled from the task list. Cancelling a loop takes effect before the next round; completed merges still clear their staged annotations. Compaction-triggered merges only report results and cannot be cancelled.
If the profile watches this plugin's directory with HMR, changing the plugin's own source triggers a plugin reload. Reload ends a running merge; run the command again to continue.
Run /humanize-review <path> to dispatch a batch review. The scope is the project's git-tracked files.
Review runs in the background as a task. The progress bar updates above the input box. The task list in the session header shows the same task. Review runs in a separate context; what it reads stays separate from the session.
The target must be inside a git repository whose status can be read. If either condition is missing, the task ends as failed with a reason. If there is nothing to review (no git-tracked files, or no file matches the include patterns), the task ends as completed and says so.
Prompts
Prompts sent to the model live in prompts/ at the package root; edit them directly:
prompts/review-system.md: system prompt for review calls, shared by write review and batch review.prompts/merge-request.md: user message sent to the merge subagent; contains the path to the merge request file.prompts/merge-header.md: prompt at the start of the merge message, shared by all three merge triggers.prompts/human-facing-field.md: description of thehuman_facingfield in the wrapped tool.
Review and merge read their prompt files on every call. The human_facing description is read when the wrapped tools are registered, so changes apply to new sessions.
Links
More in this category
tt-a1i/archify#integrations/deepseek-harness★ 87151
Generate validated, self-contained interactive architecture, workflow, sequence, data-flow, and lifecycle diagrams from repositories or system descriptions.
dream-num/dsh-univer-office★ 581
Give DeepSeek Harness a real office environment. Univer Office Plugin brings spreadsheets, docs, slides, canvases, relational tables, and more into one runtime — with connected data, validation, versioned changes, and isolated worktrees for multi-agent collaboration.
ECNU/EduWork#dsh-knowledge-studio★ 214
A workspace-based Studio for source-grounded reports, slides, tables, mind maps, quizzes, flashcards, audio and video, using DSH models and shared artifact services. Office generation requires Python 3.12+ with its dependencies and DSH_OFFICE_PYTHON configured; media rendering requires Chromium, and local ASR additionally requires whisper.cpp and a model.
PerryLink/dsh-industry-research★ 211
Deterministic industry research reports for DeepSeek Harness — company and industry research flows produce structured, verifiable reports from staged evidence.
HuanLinOTO/dsh-plugin-mineru★ 48
Expose MineRU document parsing tools to the model.
PolinniZhong/dsh-knit★ 47
Puts the Markdown documents, source files, images and video that already exist anywhere in the session workspace into the DSH sidebar, ranked by relevance to the current conversation. The default lexical mode matches your recent messages against title, summary and body locally with IDF weighting (BM25) — no model calls, no network, nothing leaves the machine. The list comes from scanning the workspace rather than from a recent-files list, so restarting DSH or opening a new session does not empty it. Results are organised into a three-tier reading order (primary / supporting / related) with a verifiable reason on every row — which field matched, which document cites this one — and one click opens an in-place preview: Markdown as rendered text, relative-path images actually drawn, source code with the host's own syntax highlighting, video streamed over HTTP Range. The same Context Pack is exposed to the agent as a knit_docs tool. Later versions added read evidence and lifecycle tracking (attribution is frozen at the moment of reading), pin / exclude (exclusion applies before retrieval, and is undoable), relation evidence (references / imports / tests, with line numbers) and an incremental index reused across restarts. Since v0.23 there is also an optional hybrid mode: it is off by default and only runs once you configure an Ollama or OpenAI-compatible embedding provider yourself. When it runs, what leaves the machine is your query text plus each candidate file's title and summary — a Markdown summary is an excerpt of the body's first paragraph (at most 60 characters), a code file's summary is its workspace-relative directory, and an image or video contributes its file name; full bodies and absolute paths are not sent, and a loopback provider keeps everything on this machine. Since v0.24 it also associates uncommitted changes: a read-only git status (fixed argv, no shell, whitelisted child-process environment) combined with the same reference / import / test / mention evidence shows which files a change is likely to drag along, and it is off by default. The benefit of semantic retrieval still awaits a real-provider run, so no recall improvement is claimed.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.