Parity checklist
English | 中文
The parity checklist records, for each stock DeepSeek Harness (DSH) area that Delorun is compared against and for each deliberate difference, the status of that area in this tree and one piece of evidence. Every row names its baseline, the recorded upstream tag dsh-v0.2.2-rc.3, which the delorun/docs/contracts/c16-parity-composition.md replays. The page covers the areas below, the switches and changed defaults that the parity composition contract lists, and the differences that the comparison page names. It does not inventory every stock feature.
How rows are judged
The status column states what this tree does. built means the change is in the tree: the row names its switch ID, or, for a Delorun change that has no switch, says no switch and names its ledger entry. planned means the change is not in the tree: the row names the switch ID and work package from the registry or, where the registry has no entry, the C16 changed default or the contract that defines it. stock means upstream's behaviour at the baseline is unchanged in the area.
Each row gives one evidence. A check name, such as parity-switches, runs node_modules/.bin/tsx delorun/apps/tools/src/parity/composition/check-parity-switches.ts, which reads the switch registry, the switch fields and the parity overlay. A spec path names a test file that asserts the row. An entry that begins with Manual check: names the source lines that a reviewer reads to confirm the row.
Eleven built switches have a switch-on scenario that is pending recording: main_chat, rename_workspace_tool, permission_defaults, fetch_guard, scheduled_task_consent, instruction_layer_consent, mcp_add_consent, external_agent_consent, sandbox_protected_reads, update_turn_refusal and default_workspace_directory. parity-switches reports each one as pending, not as passing, so this page claims no replay result for them. The model-visible switches preset_inspect, plugin_manager_read_exemption, profile_history and container_denial_marker have a recorded scenario under snapshots/, which the parity replay runs under the overlay.
Liveshare
Liveshare is upstream's experimental share feature. This tree keeps it with one Delorun change.
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Owner surfaces refused to share viewers | dsh-v0.2.2-rc.3: a share viewer is refused owner surfaces, such as pluginManager/listPlugins; this tree keeps that list | stock | packages/experimental/liveshare/tests/viewer-access-policy.spec.ts |
| Plugin-manager history, restore and undo | dsh-v0.2.2-rc.3: the endpoint classification lacks pluginManager/history, pluginManager/restore and pluginManager/undo; this tree classifies each as owner-only in packages/experimental/liveshare/src/endpoint-classification.ts at lines 145, 155 and 159 | built: no switch; security ledger entry | Manual check: the three lines are absent at dsh-v0.2.2-rc.3 and present in the tree, and the ledger entry records the lead's verdict. |
Desktop app payload
The desktop app's Python, Node and Office payload has no Delorun change in this tree.
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Python runtime | dsh-v0.2.2-rc.3: the desktop payload carries a Python interpreter and rejects a payload that lacks node and pnpm; this tree has no Delorun change under apps/desktop | stock | apps/desktop/tests/primary-runtime-preparation.spec.ts |
| Node runtime | dsh-v0.2.2-rc.3: the prepared runtime includes bin/node and one pnpm distribution; this tree has no Delorun change under apps/desktop | stock | apps/desktop/tests/runtime-preparation.spec.ts |
| Office engine | dsh-v0.2.2-rc.3: each platform's payload keeps only its selected Office engine; this tree has no Delorun change under apps/desktop | stock | apps/desktop/tests/runtime-file-policy.spec.ts |
SDK runtime selection
Delorun keeps upstream's SDK and its documented runtime selection.
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Runtime selection | dsh-v0.2.2-rc.3: the Python SDK starts the bundled dsh --profile sdk runtime unless the caller selects another dsh executable or profile (Python README); this tree has no Delorun change in python/ or packages/sdk/ | stock | python/sdk/tests/test_bundled_runtime.py |
Deliberate differences
Each difference below is one that Delorun's documents name or that C16 lists. The rows are grouped by topic.
Setup's prompts answer sets four of the switches below: permission_defaults, instruction_layer_consent, mcp_add_consent and scheduled_task_consent. "Ask me first", the default, turns them on in the profile, and "Ask less (like DeepSeek Harness)" turns them off there, which is each one's parity value. fetch_guard and external_agent_consent stay on whichever answer is given (apps/cli/src/setup/prompt-switches.ts).
Home and account
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Home directory | dsh-v0.2.2-rc.3: the home is ~/.dsh, named by DSH_HOME_DIR_NAME in packages/util/home-paths/src/index.ts at line 12. This tree: delorun resolves its home from DELORUN_HOME or ~/.delorun through delorun/packages/home/README.md, refuses ~/.dsh and paths inside it, and sets DSH_HOME to the Delorun home for every runtime process it starts; upstream's own dsh command still uses ~/.dsh | built: contract delorun/docs/contracts/c01-home-layout.md, no switch ID | delorun/packages/home/tests/home.integration.spec.ts |
| DeepSeek account and Platform | dsh-v0.2.2-rc.3: packages/credentials/deepseek-account and packages/llm/llm-deepseek-account are in the tree, and deepseek-account itself serves the Platform sign-in, Usage and Top-up pages, because rc.3 removed the separate packages/credentials/deepseek-account-platform package. This tree's Delorun CLI profiles compose deepseek-account disabled, where delorun/packages/bundle-local/README.md sets it as a C16 changed default, so no Platform sign-in, Usage or Top-up page is served and llm-deepseek-account stays inert; the parity composition keeps upstream's row, which the overlay leaves out | built: C16 changed default, no switch ID | delorun/packages/bundle-local/tests/composition.integration.spec.ts (no enabled deepseek-account row) |
Setup and model providers
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Model provider at first run | dsh-v0.2.2-rc.3: no terminal setup. The studio's Settings → Models page lists every provider the adapters serve, and while no provider can serve requests a first-run dialog asks for a DeepSeek key only (packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx). This tree: delorun setup asks which of eleven providers to use, listed by name, or none, and writes the rows the Models page and the model picker save (delorun/docs/contracts/c11-setup-answers.md); DeepSeek with DEEPSEEK_API_KEY and its default model writes no provider row, so the profile is composed as stock composes it, and --yes without --provider writes none. The prompts answer "Ask less (like DeepSeek Harness)" covers the prompt switches only, not this question. The parity composition runs no setup | built: no switch; no ledger entry, as the change is under delorun/ | delorun/apps/cli/tests/setup/providers.spec.ts |
Permissions
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Full access consent per workspace | dsh-v0.2.2-rc.3: full access needs no consent, as C16's parity column states. This tree: delorun/packages/plugin-permission-defaults/README.md refuses a switch to full access in a workspace without a recorded consent, which the person gives at the home's computer: in the studio (picking full access in a chat, the approval card's "Allow for this chat", or Settings → Permissions) or with delorun workspace full-access; a per-call escalation still goes through upstream's approval. Mounted on in Delorun's CLI profiles and in the profile delorun headless boots, where a full-access request is also refused before boot for a working directory without a recorded grant | built: permission_defaults | delorun/packages/plugin-permission-defaults/tests/permission-defaults.spec.ts, delorun/packages/plugin-permission-defaults/tests/surfaces.spec.ts and parity-switches |
| New workspace default | dsh-v0.2.2-rc.3 and this tree: a new workspace starts on workspace-write, and the approval policy is ask unless the mode is danger-full-access (packages/bundle/base/cordis.patch.yml at lines 246 and 262) | stock | Manual check: lines 246 and 262 set those defaults, and the file has no ledger entry. |
| sdk-minimal sandbox mode | dsh-v0.2.2-rc.3 and this tree: the sdk-minimal profile sets sandbox-policy mode danger-full-access (packages/bundle/sdk-minimal/cordis.patch.yml at line 73) | stock | Manual check: line 73 sets that mode, and the file has no ledger entry. |
| Workspace network | dsh-v0.2.2-rc.3 and this tree's upstream profiles: commands the model runs in the sandbox, and web_fetch, reach the host's network. This tree: delorun/packages/plugin-permission-defaults/README.md gives each workspace a network setting, open (the default, as stock), allowlist or off, which the studio changes at the home's computer; it is part of the permission_defaults switch, so Delorun's CLI profiles carry it and "Ask less (like DeepSeek Harness)" in setup's prompts turns it off | built: permission_defaults | delorun/packages/plugin-permission-defaults/tests/command-network.spec.ts, egress-proxy.spec.ts and network.spec.ts |
Model-visible tools
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
preset_inspect | dsh-v0.2.2-rc.3: no preset_inspect tool. This tree registers it only when presetInspect is on, and the switch defaults to off. The shipped Standard, PTC and Cordis presets mount the tool row without the switch, so no shipped preset in this tree lists the tool | built: preset_inspect, with a recorded scenario | packages/preset/agent-preset-registry/tests/tools.spec.ts |
| Only new model-visible Delorun tool | dsh-v0.2.2-rc.3: no preset_inspect tool. In this tree, preset_inspect is the only tool with a new name among Delorun's registrations; the plugin_manager registration is edited, not added | built: preset_inspect | Manual check: git diff --unified=0 dsh-v0.2.2-rc.3 -- packages apps scripts delorun adds one tool registration with a new name, preset_inspect, in packages/preset/agent-preset-registry/src/tools.ts. |
Data sharing
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Desktop analytics, upstream's default | dsh-v0.2.2-rc.3 and this tree's upstream profiles: on by default. The product-analytics config defaults enabled to true in packages/client/product-analytics/src/index.ts at line 36, and the desktop profile sets it to true in packages/bundle/web-app/cordis.patch.yml at line 53. The desktop shell's own flag starts false until the Host policy arrives (apps/desktop/src/main.ts at line 480) | stock | Manual check: the three lines match this description, and none of the files has a ledger entry. |
| Desktop analytics, Delorun's default | dsh-v0.2.2-rc.3: on. This tree: off in Delorun's CLI profiles, where delorun/packages/bundle-local/README.md sets C16's changed default product-analytics.config.enabled to false and its Privacy section turns it on after consent; upstream's own profiles keep true | built: C16 changed default, no switch ID | delorun/packages/bundle-local/tests/privacy-defaults.spec.ts and privacy-section.client.spec.tsx |
| Session-log upload, upstream's default | dsh-v0.2.2-rc.3 and this tree's upstream profiles: on by default. session-log-deepseek defaults enabled to true in packages/session/session-log-deepseek/src/index.ts at line 60, and the base bundle mounts the plugin in packages/bundle/base/cordis.patch.yml at line 43 | stock | Manual check: the two lines match this description, and neither file has a ledger entry. |
| Session-log upload, Delorun's default | dsh-v0.2.2-rc.3: on. This tree: off in Delorun's CLI profiles, where delorun/packages/bundle-local/README.md sets C16's changed default session-log-deepseek.config.enabled to false and its Privacy section turns it on after consent; @delorun/bundle-headless sets the same value in the profile delorun headless boots; upstream's own profiles, and so the recorded-session replay, keep the plugin's default true | built: C16 changed default, no switch ID | delorun/packages/bundle-local/tests/privacy-defaults.spec.ts, privacy-section.client.spec.tsx and apps/web/tests/delorun-privacy-consent.e2e.ts |
| Feedback-gated OTel session upload | dsh-v0.2.2-rc.3 and this tree's upstream profiles: the base bundle includes a feedback-gated OTel session upload for every person and provider (CLI reference). This tree's Delorun CLI profiles compose session-telemetry-otel, command-feedback, ui-message-feedback disabled or hidden, so no feedback leaves the machine; delorun/packages/bundle-local/README.md sets them as C16 changed defaults | built: C16 changed default, no switch ID | delorun/packages/bundle-local/tests/composition.integration.spec.ts (no enabled feedback exporter or feedback surface) |
web_fetch
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Loopback and non-public targets | dsh-v0.2.2-rc.3 and this tree: web_fetch fetches loopback and other non-public destinations, with no guard | stock | packages/web/web-fetch-http/tests/fetch-http.spec.ts |
| Fetch guard | dsh-v0.2.2-rc.3: no guard. This tree: delorun/packages/plugin-fetch-guard/README.md makes the HTTP fetch provider refuse loopback, link-local, private-network and cloud metadata targets before it connects; @delorun/bundle-local mounts it on in Delorun's CLI profiles and @delorun/bundle-headless in the profile delorun headless boots; upstream's profiles do not mount it | built: fetch_guard | delorun/packages/plugin-fetch-guard/tests/guard.spec.ts, provider-guard.spec.ts and parity-switches |
Consents
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Scheduled-task consent | dsh-v0.2.2-rc.3: one approved call creates turns that recur unattended. This tree: delorun/packages/plugin-schedule-consent/README.md makes creating or editing a task ask with the recurrence, the target and its preset, and refuses a due delivery when the target chat left the preset the approval named; mounted on in Delorun's CLI profiles and in the profile delorun headless boots, whose template mounts no schedule runtime or MCP client, so there it guards only one that the person's own profile patch adds | built: scheduled_task_consent | packages/schedule/tool-schedule/tests/consent.spec.ts, packages/schedule/schedule/tests/consent.spec.ts and parity-switches |
| Instruction-layer consent | dsh-v0.2.2-rc.3: a model-authored write to a skill, a preset or an AGENTS.md is approved, if at all, as a file write. This tree: delorun/packages/plugin-instruction-consent/README.md makes such a write through the file tools ask, naming the effect and showing the diff; a shell command's write is not reviewed; mounted on in Delorun's CLI profiles and in the profile delorun headless boots, where the write is refused because no one can answer | built: instruction_layer_consent | delorun/packages/plugin-instruction-consent/tests/consent.spec.ts, packages/fs/tool-fs/tests/tools.spec.ts and parity-switches |
| Approved-plugin write consent | dsh-v0.2.2-rc.3: the agent writes to the folder of an installed plugin as to any other file; this tree's approvedPluginWrites switch of @delorun/plugin-instruction-consent is on in Delorun's CLI profiles, and asks before the agent's first write in a chat to the folder of a plugin the person approved under Changes, naming the plugin, with the diff | built: approved_plugin_write_consent (switch-on scenario pending recording) | delorun/packages/plugin-instruction-consent/tests/plugin-folders.spec.ts |
| MCP add-time consent | dsh-v0.2.2-rc.3: each MCP server command runs as trusted code outside the agent sandbox. This tree: delorun/packages/plugin-mcp-consent/README.md keeps a stdio server stopped, with a refusal naming its command and arguments, until the acceptance store holds that start (the command, its arguments, folder and environment variable names, and the executable file and folder they resolve to, so a changed file asks again), which the person accepts at the home's computer in the studio or with delorun mcp accept; mounted on in Delorun's CLI profiles and in the profile delorun headless boots, whose template mounts no schedule runtime or MCP client, so there it guards only one that the person's own profile patch adds | built: mcp_add_consent | packages/mcp/mcp-client/tests/consent.spec.ts, delorun/packages/plugin-mcp-consent/tests/consent.spec.ts, delorun/packages/plugin-mcp-consent/tests/reviews.spec.ts and parity-switches |
| External-agent consent | dsh-v0.2.2-rc.3: the model can start an external agent such as Claude Code or Codex, which runs outside the sandbox on the person's account, without asking. This tree: delorun/packages/plugin-delegation-consent/README.md asks at the home's computer before each run, offers "Allow once" and "Allow for this workspace", refuses a chat on Read Only, limits each run (30 minutes by default) and refuses a plugin_manager call that brings such an agent in; mounted on in Delorun's CLI profiles and in the profile delorun headless boots, whichever answer setup's prompts question got | built: external_agent_consent (switch-on scenario pending recording) | delorun/packages/plugin-delegation-consent/tests/consent.spec.ts and parity-switches |
Confinement and containers
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Confinement rules | dsh-v0.2.2-rc.3: the sandbox confines file writes, and reads, Unix sockets and the network stay open. This tree: upstream's local sandbox provider takes a protected home, its readable entries and denied sockets, and Delorun's CLI profiles set them (delorun/docs/contracts/c01-home-layout.md): bwrap and Seatbelt deny reads and writes under the home and connections to the denied sockets, Landlock denies reads and writes under the home and no socket connection, and the Windows runner confines writes only. Upstream's profiles set none of them; delorun headless sets them through the sandbox overlay | built: sandbox_protected_reads on @deepseek-ai/dsh-sandbox-local protectedHome (switch-on scenario pending recording) | packages/sandbox/sandbox-local/tests/protected-home.spec.ts, delorun/packages/bundle-local/tests/confinement.integration.spec.ts |
| Container denial marker | dsh-v0.2.2-rc.3: a denial inside a container carries no environment marker; this tree's containerDenialMarker in packages/sandbox/sandbox-policy/src/index.ts at line 155 is off by default, and no shipped row sets it | built: container_denial_marker, with a recorded scenario | packages/sandbox/sandbox-policy/tests/policy.spec.ts |
Studio and other C16 switches
| Item | Baseline and this tree | Status | Evidence |
|---|---|---|---|
| Preview notice | dsh-v0.2.2-rc.3: upstream's Web preview notice names DeepSeek Harness. This tree's Delorun CLI profiles turn it off (welcomeNotice) and show Delorun's own notice from delorun/packages/bundle-local/README.md, which states that Delorun is a pre-release community fork | built: C16 changed default ui-settings-models.config.welcomeNotice and composition row delorun-privacy, no switch ID | delorun/packages/bundle-local/tests/notice.client.spec.tsx and composition.integration.spec.ts |
| Sidebar brand | dsh-v0.2.2-rc.3: the sidebar's default brand is upstream's mark and name (DSH Local Build with the build version). This tree's Delorun CLI profiles show the hex jack mark and the product name, through the delorun-privacy row of delorun/packages/bundle-local/README.md, which the parity composition leaves disabled; the document title is a build setting (DSH_CLIENT_TITLE), which Delorun's build sets and the parity build does not | built: C16 composition row delorun-privacy, no switch ID | delorun/packages/bundle-local/tests/privacy-section.client.spec.tsx (occupant registration) and parity-switches (the row stays disabled) |
| Studio additions | dsh-v0.2.2-rc.3: the stock look, with no Delorun studio package; this tree mounts the theme, sidebar, chat states, settings layout and onboarding through @delorun/bundle-studio in every Delorun CLI profile, with the switch on, and the replay mounts none of them | built: studio_additions, a feature switch on @delorun/plugin-theme | parity-switches |
| Default workspace folder | dsh-v0.2.2-rc.3: the first-use workspace goes to <Documents>/deepseek-harness/default-workspace, and to no folder where the platform reports no documents folder, as on Linux and WSL without an XDG Documents folder. This tree: delorun start resolves <documents>/Delorun/default-workspace, or <home>/Delorun/default-workspace where the platform reports none, and delorun/packages/bundle-local/README.md's workspace-controller row sets it as defaultWorkspaceDirectory; the replay leaves the row to upstream | built: default_workspace_directory, a presence switch on @deepseek-ai/dsh-api-workspace-controller (switch-on scenario pending recording) | delorun/apps/cli/tests/default-workspace.spec.ts and parity-switches |
| Workspace rename tool | dsh-v0.2.2-rc.3: no rename_workspace tool; @delorun/bundle-local mounts it through its delorun-workspace-rename row | built: rename_workspace_tool (switch-on scenario pending recording) | delorun/packages/bundle-local/tests/workspace-rename.spec.ts |
| Main chat | dsh-v0.2.2-rc.3: no main chat; this tree has @delorun/plugin-main-chat, an experimental plugin that no bundle mounts | built: main_chat (switch-on scenario pending recording) | parity-switches |
| Onboarding preset | dsh-v0.2.2-rc.3 and this tree: standard is the default preset (packages/bundle/web-app/cordis.patch.yml at line 620). Planned: ptc, as C16's changed default agent-preset-registry.config.default | planned: C16 changed default; no switch ID or work package | Manual check: line 620 sets standard, and C16's changed-defaults table names the planned value. |
plugin_manager read exemption | dsh-v0.2.2-rc.3: every plugin_manager action needs the danger-full-access escalation; this tree's readActionsExempt switch is off by default, and no shipped row sets it | built: plugin_manager_read_exemption, with a recorded scenario | packages/boot/plugin-manager/tests/tools.spec.ts |
profile_history | dsh-v0.2.2-rc.3: no history, read_config, configure, undo or restore action; this tree's profileHistory switch is off by default, and no shipped row sets it | built: profile_history, with a recorded scenario | packages/boot/plugin-manager/tests/tools.spec.ts |
| Plugin changes held for review | dsh-v0.2.2-rc.3: an agent's plugin_manager install_bundle or remove_bundle runs once its full-access approval is given; this tree's @delorun/plugin-changes switch is off by default, and on it records the call as a pending change in the profile's change log and denies it, so nothing is installed or removed until the person applies it with delorun changes | built: plugin_changes_pending (switch-on scenario pending recording) | delorun/packages/plugin-changes/tests/plugin-changes.spec.ts |
| Doctor | dsh-v0.2.2-rc.3: no doctor app; this tree's doctor switch is off by default, so the app runs no check, and no model sees it. delorun doctor is a separate Delorun command that runs its own checks and reaches no model | built: doctor (feature switch; no switch-on scenario) | packages/boot/doctor/tests/app.spec.ts |
| Update gate | dsh-v0.2.2-rc.3: no update handshake; a turn starts whenever a person sends one. This tree's Delorun CLI profiles mount delorun-update-gate from delorun/packages/bundle-local/README.md, which refuses the first step of a new turn with UPDATE_PENDING while an update or stop waits for running chats, and holds the first step of every turn until delorun has checked the booted Host; delorun headless mounts it for the check only | built: update_turn_refusal (switch-on scenario pending recording) | delorun/packages/bundle-local/tests/update-gate.spec.ts and parity-switches |
| Update check | dsh-v0.2.2-rc.3: no request for a newer release. This tree's Delorun CLI profiles mount delorun-update-check, which fetches and verifies the release channel's newest release every 24 hours by default and shows a notice; Settings → General → Updates turns it off | built: update_check (feature switch; no switch-on scenario) | delorun/packages/bundle-local/tests/update-check.spec.ts |
| Studio sign-in links | dsh-v0.2.2-rc.3: the studio's launch token can be used again. This tree's Delorun CLI profiles set oneTimeLaunchTokens on the connection row, so each link expires after 60 seconds and its first use consumes it | built: one_time_launch_tokens (feature switch; no switch-on scenario) | packages/client/connection/tests/browser-auth.host.spec.ts and parity-switches |
| Remote access | dsh-v0.2.2-rc.3: no reach service, and upstream's own authenticator. This tree's Delorun CLI profiles mount delorun-home-auth and delorun-reach; every reach option stays off until the person turns one on with delorun reach on tailscale | built: reach (feature switch; no switch-on scenario) | delorun/packages/reach/tests/service.spec.ts and parity-switches |
Where to go next
The glossary defines the terms this page uses. The divergence index lists the upstream files behind each difference, and the parity baseline records upstream's own test results. For the same differences in plain words, read Delorun and stock DeepSeek Harness.