Commit Graph
100 Commits
Author SHA1 Message Date
imccyu 703c8f659c perf(docs): prefetch CLI help concurrently and memoize doc-graph probes
gen-cli-help launched its twelve source-mode dsh --help processes one
after another, each spending most of its time waiting on profile boot
I/O; they now start concurrently within the default worker budget, each
with its own temporary DSH_HOME, and the existing comparison consumes
them in the original order. gen-doc-graphs memoizes ts.sys file, directory,
realpath, and directory-listing probes for one run. Generated pages are
byte-identical; CLI help drops from about 52 s to 7 s and doc graphs from
about 47 s to 33 s.

Refs #5852
2026-10-12 11:06:54 +08:00
imccyu 67b875a5bf perf(docs): list each repository directory once per file walk
uniqueRepoFiles read every directory once per pattern and ** level and
resolved every file with realpath. One walk now lists each directory
once across patterns, resolves only paths reached through symbolic
links, and lets doc refs skip non-leading lib directories, whose files
it always excluded. markdown wrap, doc refs, and package paths return
the same file lists with about half the directory reads.

Refs #5852
2026-10-12 11:06:53 +08:00
imccyu 1e24617aad perf(docs): parse each Markdown document once in documentation gates
markdown links parsed anchor targets twice more and probed existence
without a cache; translation pairing reparsed every document after link
normalization and globbed four times; the README model-experience and
limitations checks parsed each README three times; type equivalence
parsed all 1,835 documents; Session format references reparsed each pair
four times. Each gate now parses a document once: links and anchors come
from one tree, pairing reuses the original tree when every rewritten
destination keeps the block structure and falls back to a full reparse
otherwise, the README checks share one tree, a text prefilter skips
documents that cannot hold a source-equivalence fence, and the
persistence renderer passes its trees on. Outputs are byte-identical on
the repository, and seeded faults are reported identically.

Refs #5852
2026-10-12 11:06:53 +08:00
imccyu 6fbfbb044e test(typert): run type-model.spec against an in-memory workspace
Each of the 61 cases copied the fixture onto disk and ran a full analysis
whose four TypeScript programs reloaded the DOM library, @types/node, and
zod v4; about 22,000 file-system probes per analysis dominated on a
network filesystem. The spec now mocks the node:fs calls the analyzer
makes and the ts.sys host for an in-memory workspace, stubs zod and
@types/node except in the Emitter case that runs real zod, drops the DOM
library from the fixture, and shares the pristine analysis read-only.
The file drops from about 316 s to 15 s with the same 61 cases and
assertions; the snapshot's external zod path no longer names a pnpm
store version.

Refs #5852
2026-10-12 11:06:52 +08:00
imccyu 989a52d427 build(hooks): stop regenerating third-party notices on pre-commit
Browser inputs make every package source file a generator input, so the
pre-commit job ran the 16-second generator on nearly every commit while
few commits change its output. gen-third-party-notices.spec.ts already
asserts the committed bytes in the test lane, including the required
node 24 / coverage pull-request lane, and names the regeneration command
when they are stale. The generated preamble, the notices decision, and
the development guide now describe that ownership.

Refs #5852
2026-10-12 11:06:51 +08:00
imccyu a8fd8da98a perf(docs): resolve repository-reference candidates with one object listing
verify-repository-references asked git cat-file for each of about 26,000
abbreviated hexadecimal candidates, which took 135 s on a network
filesystem. One --batch-all-objects listing (about 1.2 million objects,
0.6 s) now feeds an in-memory prefix search; a candidate still counts
only when its prefix names exactly one available object and that object
is a commit. The gate drops from 166.8 s to 15.7 s, and both
implementations classify 27,050 real and synthetic candidates
identically.

Refs #5852
2026-10-12 11:06:50 +08:00
imccyu ed7bf8cc42 perf(gates): cap local default worker counts
os.availableParallelism() reports host CPUs rather than a container's
CPU quota (256 against a 64-CPU quota here), so local defaults spawned
255 Vitest forks (55 GiB peak RSS) and oversubscribed every scheduler.
scripts/parallelism.ts keeps the CPU count in CI and caps other runs at
12, or 48 for Vitest forks and the local coverage budget; documentation
and hygiene aggregates run up to 8 gates instead of 4. Explicit
DSH_GATE_CONCURRENCY, DSH_OXLINT_THREADS, DSH_COVERAGE_MAX_WORKERS, and
--maxWorkers still win.

Refs #5852
2026-10-12 11:06:50 +08:00
imccyu 04af9a1df7 perf(build): generate Typert contracts without bundling for typecheck and lint
Type checks only need Host declarations and Typert-generated
declarations, but typecheck, lint, lint:fix, doc-typecheck, and the CI
typert-contracts gate rebuilt the whole Host tsdown pass, Desktop bundle
included, to obtain them. A source-only scripts/generate-typert.ts now
runs the same generator and artifact writer as the tsdown plugin, beside
Host package compilation: Typert reads only sources once the missing
@deepseek-ai/dsh-client-file-upload/types path alias exists, and
rejectBuildOutputs fails the pass when a workspace lib/ declaration
enters its program. typecheck runs as a build.ts scope that checks both
aggregates in build mode after their own face compiles.

Refs #5852
2026-10-12 11:06:49 +08:00
imccyu d8d942c82a Merge pull request #6020 from deepseek-harness/worktree-chatflow2
fix(ui-chat): keep notice-woken Turns in the human exchange
2026-10-12 11:00:20 +08:00
imccyu 7526c914c4 test(scripts): refresh the translation prompt snapshot for the exchange term
The assembled translation prompt embeds docs/i18n/terminology.md, so the
new exchange row changes the recorded request.
2026-10-12 10:35:06 +08:00
imccyu 453a79206c fix(ui-chat): address review on notice-woken exchanges
Share locationCoordinates between the Chat Builder and GroupTreeSegments,
find the last opening Turn with a loop instead of spreading every key,
and pass the resolved Location through chatNode so message Nodes resolve
it once. The notice e2e now waits for observable barriers (each Step's
row, the notice Turn's start, the notice row) instead of fixed sleeps,
asserts the settled tail through polling plus a later-frame recheck
instead of one absolute blank threshold, and fails on console warnings.
Record exchange in the terminology table and keep Goal Round in English.
2026-10-12 10:35:05 +08:00
imccyu c62f26aaa1 fix(ui-chat): keep notice-woken Turns in the human exchange
Under "On next message" folding, a Turn woken by a notice (settled
subagent, goal round, schedule, background job) advanced the bottom Turn
and folded the finished Turn without an own-input driver, so the generic
fold room left a following reader looking at blank space.

Chat Nodes now declare a group-tree position (`groupTree`, ordered
`exchange` > `turn` > `process`). Human input claimed in Step 1 marks its
Turn as opening an exchange; notices and later steering carry no
position. `GroupTreeSegments` splits the loaded Turns at opening Turns,
and `bottomSource` covers the whole latest exchange, so notice-woken
Turns no longer fold earlier ones while the next human message folds the
exchange through the own-input path. Only `exchange` is read today; the
`turn` and `process` positions are reserved for the existing kind lists.
2026-10-12 10:35:05 +08:00
imccyu 743560522b Merge pull request #6013 from deepseek-harness/worktree-fixsystemprompt
fix(web): keep process-specific values out of the system prompt
2026-10-12 02:23:32 +08:00
imccyu 0f95e16315 Merge pull request #5824 from deepseek-harness/feat/user-text-secret-mask
feat(ui-secret-mask): mask credentials in sent user text
2026-10-12 02:18:12 +08:00
imccyu 94d4007bfd docs(ui-secret-mask): document exported format constants and methods 2026-10-12 02:05:16 +08:00
imccyu 1681948e3f refactor(ui-secret-mask): split formats, lazy tables, masks, and the scanner into modules 2026-10-12 01:58:06 +08:00
imccyu 30e31bd762 docs(ui-secret-mask): re-record README translation pairing 2026-10-12 01:43:59 +08:00
imccyu 2b229d4c0e fix(web): address review round on harness dev context
- WebServer.port reads number | undefined instead of masking the unbound
  listener with an assertion; tests that dial it narrow the bound port.
- LegacyPrompt stays module-private; the web-app type import is a
  devDependency only, since the emitted declarations never reference it.
- Copy: --public-url help names runtime context again, the public
  deployments guide, web-app JSDoc, Config.publicUrl consumers, the Agent
  Note matching rule, and three Known Limitations in the package README.
2026-10-12 01:42:45 +08:00
imccyu 035d78d4c8 fix(ui-secret-mask): confine key-block mask searches to the block 2026-10-12 01:24:38 +08:00
imccyu 993b13571b fix(ui-secret-mask): lint-clean indexed reads and add the English note 2026-10-12 01:13:11 +08:00
imccyu a93958c7d0 feat(ui-secret-mask): mask credentials in sent user text 2026-10-12 00:46:21 +08:00
imccyu ba1a9356db fix(web): advertise one Web GUI URL through the webApp service
The web-runtime row provides webApp.getAdvertisedUrl(): the row's
configured publicUrl, otherwise the listener origin. harness-dev-context
reads it instead of webStartup.publicUrl, so a profile override of
publicUrl reaches the model as it already reaches DSH_WEB_URL and the
startup URL. The new package no longer injects webServer or webStartup,
and the startup flag provider returns to its master behavior.
2026-10-12 00:34:29 +08:00
imccyu adfa92bca1 fix(web): address review on harness dev context
- WebServer exposes getOrigin() instead of an origin getter, and it fails
  loud before listen binds a port.
- The earlier Web-surface paragraph is a frozen literal, so later guidance
  edits cannot stop earlier Sessions from matching; the projection reads a
  prompt version with the loop's single-text-block rule.
- web-app drops its unused dsh-system-prompt dependency and stale
  prompt-section wording in its description, README, patch comment,
  --public-url help, and the round-trip test title.
2026-10-11 23:25:24 +08:00
imccyu b10a605e6b test(web): add harness dev context lines to recorded web sessions
Each recorded runtime-context snapshot with optional contexts gains the
tokenized checkout and Web GUI URL lines, matching the refresh output of
the code-language scenario, where only that message changed. The
minimal-preset snapshot suppresses optional context and stays unchanged.
2026-10-11 23:25:22 +08:00
imccyu f885016322 test(web): refresh code-language session for harness dev context 2026-10-11 23:25:22 +08:00
imccyu fc2ef643fb docs: regenerate package, module, and seam catalogs for harness-dev-context 2026-10-11 23:25:21 +08:00
imccyu ab560474a2 test(web): tokenize harness dev context lines in recorded sessions 2026-10-11 23:25:21 +08:00
imccyu d5b48ad0ba docs(graphs): classify the webStartup service 2026-10-11 23:25:20 +08:00
imccyu 36779dcf09 fix(web): keep process-specific values out of the system prompt
The harness checkout path and Web GUI URL now reach the model as runtime
context from the new dsh-harness-dev-context plugin, so a process started
on another port, checkout, or installation no longer rewrites a Session's
logged system prompt. A Session whose prompt already embeds the earlier
value-bearing paragraphs keeps them verbatim through a host-only session
projection.

dsh-host-webserver gains WebServer.origin and bindUrlHost(); web-app keeps
only DSH_WEB_URL, the startup URL, and the browser handoff, and its root
declares the webStartup service type. app-boot drops
addHarnessSourceSection and HARNESS_SOURCE_SECTION.
2026-10-11 23:25:19 +08:00
imccyu 9cac4beb05 Merge pull request #6005 from deepseek-harness/worktree-tsprofile
perf(build): parallelize build, split build:artifacts/build:check, and cut tsdown and client check time
2026-10-11 23:03:37 +08:00
imccyu f6b0c5af59 build: rename build:src and build:test to build:artifacts and build:check
build:artifacts produces every artifact, including the tsdown bundles,
the Desktop bundle, and Web, so naming it after sources undersold it;
build:check checks scripts, benchmarks, and website code besides tests.
The build.ts scopes, aggregate step ids, the Python builder flag
(--build-artifacts), workflows, callers, docs, and the build-split Agent
Note follow the new names. The note also records the naming
alternatives.

Refs #5852
2026-10-11 22:16:47 +08:00
imccyu 1a8448ad27 docs: say which build command to run when, and drop the upgrade-guide aside
- docs/development.md gains a situation-to-command table for build:src,
  build:test, build, typecheck, lint and doc-typecheck (Chinese pair
  updated).
- Note A states the typertPlugin() compatibility facts without discussing
  an upgrade guide.

Refs #5852
2026-10-11 19:43:49 +08:00
imccyu f0460bab4c docs(notes): record final build measurements and address review wording
- Note B: final medians of two interleaved samples (build 317.1 -> 169.1 s,
  build:src developer view -51.6%, lint prerequisite 159.8 -> 90.9 s), the
  CI lanes that run the parallel build, and their concurrency settings.
- Both notes: medians with sample counts instead of raw sample lists.
- Note A: why the typertPlugin() hook changes need no upgrade guide; final
  serial stage times.
- Typert Remote note: the top-level build now runs the scripts/build.ts
  step graph; build:lib and build:lib:host keep their remaining callers.
- docs/development.md agreement fix; packages/client/AGENTS.md rule 8 names
  the manifest globs the gate checks.

Refs #5852
2026-10-11 19:16:57 +08:00
imccyu 1e6deb4f16 test(typert): place the worker fixture on a real package leaf
verify-package-paths reads root-relative packages/* strings in tests and
rejected the fixture's packages/generator, which names the real
packages/typert/generator leaf in the wrong group. The fixture now mirrors
that layout.

Refs #5852
2026-10-11 18:50:25 +08:00
imccyu f34c3a1ce2 docs(notes): record the lossless build speed-ups and the build command split
- 2026-10-11-lossless-build-speedups: the React type packages declared only
  at the root, the five Typert discovery/worker changes with the transform
  filter, and the client tsdown preset manifest read; each item states its
  purpose, change, measured effect, why outputs are unchanged, and its
  trade-offs.
- 2026-10-11-build-src-test-split: build:src / build:test / build, the
  dependency graph and scheduling, callers and CI lanes, which command
  detects which error, measurements, and the intentional trade-offs.
- 2026-10-05-pr-artifact-typechecks: one-line adjustments where this change
  replaces --artifacts-only with build:src and renames the Python flag.

Refs #5852
2026-10-11 18:19:23 +08:00
imccyu 129c915498 build: split build:src and build:test, and schedule build in parallel
pnpm run build ran every step in one serial chain, including the two
noEmit aggregate programs (tests, scripts, benchmarks, website) that no
artifact step consumes, so the Host aggregate check alone delayed tsdown by
about 66 s.

- build:src (scripts/build.ts --scope src) builds every artifact in the
  existing order and writes the client build record; it replaces the
  removed --artifacts-only flag and the libraries CLI mode.
- build:test (--scope test) type-checks only the Host and Client aggregate
  programs with tsc -p, concurrently, without compiling references or
  checking prerequisites.
- build runs both as one dependency graph through run-gates' new
  runAggregate: each aggregate check starts once its face's packages are
  compiled, and Client compilation stays after the Host bundle that writes
  the Typert /remote declarations. DSH_GATE_CONCURRENCY=1 serializes it;
  DSH_GATE_FAIL_FAST=1 stops the remaining steps at the first failure.
  Passing steps print one PASS line (DSH_GATE_VERBOSE=1 shows their output).
- PR artifact builds (e2e, release, preview, Node 22 compatibility) and the
  Python builder (--build-src) use build:src; dev:web and dev:desktop use
  build:src. test:*, bench, typecheck and the required consumer/Windows
  lanes keep the complete build.
- lint, lint:fix, doc-typecheck and the Typert contracts gate prepare with
  host-libraries (Host package compilation + Host bundle) instead of
  build:lib:host; their own checks never read the aggregate root or the
  Desktop bundle.

Parallel and serial build produce byte-identical lib/, Web dist and client
build record; a test-only type error fails build and build:test while
build:src passes.

Refs #5852
2026-10-11 18:19:23 +08:00
imccyu e4410b2764 perf(client): read each tsdown preset's own package manifest
The client tsdown presets found a package's own manifest by name: a glob of
every packages/*/*/package.json, parsed until the name matched. tsdown's
native config loader imports each package config without module cache, so
the module-level cache never hit and all 82 configs repeated the glob
(40-125 ms each) synchronously on tsdown's main thread, where it delayed
every other package build. It was 34.5% of the client pass's main thread.

- clientBundle, staticLinked and clientLibrary take the package directory
  (import.meta.dirname at every call site) and read <dir>/package.json
  once; the package name, loader id and externals come from that manifest.
- A missing, unreadable or nameless manifest throws an actionable error.
- The glob, the name search and the module-level caches are removed.

tsdown client pass 12.78 s -> 8.73 s (median of 3 interleaved runs each,
-31.7%); all 11,566 lib outputs byte-identical; all 82 configs resolve the
same externals and banners.

Refs #5852
2026-10-11 18:19:23 +08:00
imccyu 1c6078dca6 perf(build): declare React type packages only at the workspace root
TypeScript builds a synthetic signature for every JSX intrinsic element and
computes a module specifier for @types/react (index and jsx-runtime) per
importing file. computeModuleSpecifiers visits every symlinked location of
that file and scans all 491 tsconfig paths for each; pnpm gave 65 packages
their own node_modules/@types/react link. Client test-aggregate Check
followed 26.9 + 0.494 * N seconds for N locations.

- Remove @types/react and @types/react-dom from all 67 workspace manifests
  and declare them once in the root devDependencies; packages keep declaring
  the react and react-dom they import (ui-slots gains react).
- verify-package-dependencies rejects either package in any workspace
  manifest and requires the root declaration, so a new package cannot add
  the link back.
- packages/client/AGENTS.md states the rule.

Client aggregate Check 59.1 s -> 26.5 s; the 76 client-only package
projects 54-57 s -> ~44 s wall. File set (2,613) and diagnostics unchanged.

Refs #5852
2026-10-11 18:19:21 +08:00
imccyu c1a4ce0117 perf(typert): discover declared contributors only and generate off the bundler thread
The Host tsdown pass ran Typert synchronously inside the first package's
writeBundle, blocking every other workspace build's JavaScript hooks for
about 12 s. Discovery dominated that time: it expanded the Host aggregate's
2,064 include entries, parsed all 362 referenced tsconfigs (Client ones
included), and walked 322 packages although only 28 declare a Typert export.

- Select packages by their manifest exports before any source walk.
- Parse face aggregates without expanding their file lists.
- Parse package tsconfigs lazily, only for analyzed packages; tsc -b keeps
  validating every referenced tsconfig.
- Resolve the workspace root as the nearest ancestor holding both
  tsconfig.host.json and packages/.
- Run workspace generation in a Worker Thread started at the first
  buildStart; writeBundle awaits it once and fails the build with
  TypertWorkerError on any worker failure.
- Filter the decorator transform hook by id so only TypeScript modules
  cross into JavaScript.

tsdown host median 22.6 s -> ~10 s; all 743 hashed lib outputs are
byte-identical except the generator's own bundle.

Refs #5852
2026-10-11 18:16:20 +08:00
imccyu 9cb2041b29 Merge pull request #5979 from deepseek-harness/messageslot
refactor(web): compose message and text-transform content
2026-10-11 15:23:08 +08:00
imccyu 60a4c8e077 fix(web): make whitespace trimming linear and polish content contracts 2026-10-11 14:18:10 +08:00
imccyu f66d19b078 refactor(web): reconcile user text with cached forward candidates 2026-10-11 12:52:06 +08:00
imccyu ed629da5da fix(web): trim unused user text features and cover rendering 2026-10-11 02:03:27 +08:00
imccyu a46d5b143f refactor(web): separate image slots by domain 2026-10-11 01:04:23 +08:00
imccyu 14bee91fac test(web): refresh complete queued question reply snapshot 2026-10-10 22:47:34 +08:00
imccyu ba452cf919 docs: mark message image factory decision implemented 2026-10-10 22:43:55 +08:00
imccyu d6a5aa5cab fix(web): address user text CI checks and coverage 2026-10-10 22:43:55 +08:00
imccyu 40c6a37ad0 test(web): adapt user content fixtures to text node factories 2026-10-10 22:43:55 +08:00
imccyu bd1b8ad18e fix(test): route user text specs to the client compiler 2026-10-10 22:43:54 +08:00
imccyu 1301b26846 refactor(web): transform user text through business node slots 2026-10-10 22:43:54 +08:00
imccyu b52864330d refactor(web): extract reusable user content factory 2026-10-10 22:43:54 +08:00
imccyu 2c684c51c9 refactor(web): compose native message image factories 2026-10-10 22:43:53 +08:00
imccyu 3daec753f8 Merge pull request #5983 from deepseek-harness/worktree-chatmisc
fix(chat): hide empty reasoning and improve command and file details
2026-10-10 22:39:53 +08:00
imccyu 68be430f62 fix(chat): handle cancelled folds and concurrent content growth 2026-10-10 22:22:45 +08:00
imccyu b3a7271720 fix(chat): coordinate visible process folding with input scrolling 2026-10-10 17:15:00 +08:00
imccyu 9f435e1592 fix(chat): show background shell launch commands 2026-10-10 16:05:27 +08:00
imccyu 0d52c0d6a2 fix(chat): align wrapped status and refine preview regression cases 2026-10-10 16:05:27 +08:00
imccyu ed160fa60c fix(chat): hide empty reasoning and improve command and file details 2026-10-10 16:05:26 +08:00
imccyu d6be036d67 Merge pull request #5982 from deepseek-harness/worktree-spacebrowser
feat(ui-workspace): expose session ids and unify toast presentation
2026-10-10 15:25:23 +08:00
imccyu d0c885d7b7 fix(ui-workspace): share archive toast filter action 2026-10-10 15:13:22 +08:00
imccyu 0dcebe4419 fix(ui-workspace): declare toast registrations explicitly 2026-10-10 14:59:26 +08:00
imccyu 0c72c1cd3e docs(client): allow factories for reusable components 2026-10-10 14:59:25 +08:00
imccyu d5f19c7978 test(ui-chat): narrow restored configuration before loading 2026-10-10 14:50:17 +08:00
imccyu 70050ff276 docs(workspace): sync missing-directory membership reference 2026-10-10 14:50:16 +08:00
imccyu 61112eab8f fix(ui-chat): persist work details collapse timing 2026-10-10 14:22:02 +08:00
imccyu 7d14714601 fix(workspace): retain session membership for missing directories 2026-10-10 14:16:42 +08:00
imccyu b2dd2bf75b fix(ui-workspace): copy session id directly from menu 2026-10-10 13:13:47 +08:00
imccyu 668b7f9746 fix(ui-workspace): show full session id as selectable text 2026-10-10 11:22:21 +08:00
imccyu f409d99b0c docs(ui-workspace): refresh inline session id pairing 2026-10-10 03:39:51 +08:00
imccyu 3cae1619a5 fix(ui-workspace): place session id copy action inline 2026-10-10 03:33:29 +08:00
imccyu 76d086754a fix(ui-workspace): update toast coverage and generated expectations 2026-10-10 03:11:57 +08:00
imccyu c3ce020b12 refactor(ui-workspace): render notices through keyed toast factory 2026-10-10 02:35:58 +08:00
imccyu 8423a388ec fix(ui-workspace): unify shortcut fork toast notifications 2026-10-10 00:59:01 +08:00
imccyu 38c700f08e feat(ui-workspace): view and copy session id from menu 2026-10-10 00:29:01 +08:00
imccyu 1a83d013f5 docs: raise the root AGENTS.md ceiling for the standing orders
The root file passes the 1,960-word ceiling on the branch alone but exceeds it
once master's newest standing order is merged in, which is what `node 24 /
static` reports. Raise the ceiling to 2,080 and update the documented target in
the same change, per the "a too-low ceiling is a budget bug" rule.
2026-10-09 23:04:58 +08:00
imccyu 32aba5ea37 docs: address review comments on the rules directory
- package-surface: split the two plugin forms (a function plugin named-exports
  the Loader four, a service plugin default-exports its class), keep Host
  Service Definition exports and the Client `/client` export discipline, replace
  the wrong example that quoted live production code, state that the static
  client libraries and `packages/util/*` are closed to new members, and drop
  census numbers that rot on the next package.
- client-components: use the real Slot API — the inject face with the reserved
  `hooks` compartment, the parent's derived `renderSlot`, `registerFactory`
  scope declarations with local components at `renderFactorySlot` — drop the
  string seat, pass the injected `useResource` explicitly with a protocol key,
  and describe persistence as the spec's framework-run `persist` key.
- conversation-and-session: rewrite the reasoning example on the real
  `conversation.chat.reasoning.body` seat and the published `reasoning.content`
  Factory, and drop status annotations and future-tense spec-speak.
- remote-and-api: scope the JSON requirement to the wire payload so
  `@Remote({ mode: 'stream' })`, lookup arguments, and a trailing `AbortSignal`
  stay valid; drop a leaked Chinese parenthetical from the English page.
- general: measure through `benchmarks/` (`test:bench`, `check:ci:bench`,
  `test:bench:memory`) instead of an invented command, state the baseline
  without presuming a hook, and drop a leaked exception line.
- api-gateway: link the Remote and API rules instead of restating them.
- development.zh and AGENTS: drop an orphan anchor and widen the standing
  order's trigger to the directory's scope.

The earlier "retired routing skill" claim was wrong and is dropped: that skill
was never committed, so the diff deletes nothing under `.agents/skills/`.
2026-10-09 23:03:57 +08:00
imccyu 73dbbb751c docs: give architecture review rules a per-artifact home
Move `docs/defensive-patterns.md` into `docs/defensive-patterns/`, one page per
artifact plus a README router, and state each rule as its requirement, the
condition a reviewer judges it by, its boundary and approver, and a correct and
a wrong example.

- `general.md` (the moved page): the existing bug-class rules plus timing,
  value representation, shared-state ownership, decentralization, performance
  evidence, and migrations.
- `package-surface.md`, `remote-and-api.md`, `client-components.md`,
  `conversation-and-session.md`: the review requirements for those artifacts,
  linking type definitions and semantics to `docs/subsystems/` instead of
  restating them.
- `README.md`: the habits behind the rules and the route from artifact to page.
- `dsh-code-review` reads the owning pages before judging a diff; the
  `dsh-architecture-discipline` routing skill is retired in favour of the
  directory, and every inbound reference is repaired.
- Chinese counterparts, pairing records, and the documentation tier table are
  updated together.
2026-10-09 23:03:56 +08:00
imccyu 311fc54705 Merge pull request #5955 from deepseek-harness/fix-chat-height-reset
fix(ui-chat): reset layout on mode changes and running session returns
2026-10-09 16:13:23 +08:00
imccyu 7ee4b46782 fix(ui-chat): reset layout on mode changes and running session returns 2026-10-09 15:51:46 +08:00
imccyu d6692ac626 Merge pull request #5305 from deepseek-harness/worktree-flownew
feat(web): 增加工作过程收起时机实验开关
2026-10-09 14:03:54 +08:00
imccyu 37d9dadd4e fix(ui-chat): retain fold surplus as bottom space 2026-10-09 13:35:20 +08:00
imccyu 9db5308d9b fix(ui-chat): combine fold displacement with input following 2026-10-09 13:35:19 +08:00
imccyu f1dcb15b9c fix(ui-chat): tolerate subpixel rounding at the content floor 2026-10-09 13:35:18 +08:00
imccyu 7a504ac3e0 fix(ui-chat): settle fold following and apply review cleanups 2026-10-09 13:35:18 +08:00
imccyu bde4bc78a6 fix(ui-chat): avoid pathological flow selector matching 2026-10-09 13:35:17 +08:00
imccyu 00d9dd1b81 fix(ui-chat): preserve flow layout through slot anchors 2026-10-09 13:35:16 +08:00
imccyu a0a9aef5ec feat(ui-chat): add independent collapse timing and viewport-scoped flow 2026-10-09 13:35:16 +08:00
imccyu 68d37a3755 Merge pull request #5904 from deepseek-harness/messageslot
refactor(web): compose reasoning content through a shared slot factory
2026-10-09 10:40:50 +08:00
imccyu 7dce22d2f2 fix(test): name the reasoning fixture render result type 2026-10-09 02:08:05 +08:00
imccyu 9018cf697d fix(test): preserve reasoning slot types in fixtures 2026-10-09 02:01:58 +08:00
imccyu 70caea2ee3 style(test): align reasoning fixtures with lint rules 2026-10-09 01:59:37 +08:00
imccyu 6576ff5bf1 test(web): align translation replay with plugin-owned controls 2026-10-09 01:57:14 +08:00
imccyu a561924313 test(web): migrate reasoning fixtures and refresh slot catalogs 2026-10-09 01:56:26 +08:00
imccyu 3385180b9b refactor(web): compose reasoning content through a shared slot factory 2026-10-09 01:43:17 +08:00
imccyu b492219bd2 Merge pull request #5508 from deepseek-harness/worktree-waitmigration
feat(session): guard migration in sidebar fork and subagent catalogs
2026-10-08 19:47:55 +08:00
imccyu dc22e172f4 feat(session): show header migration status before expansion 2026-10-08 16:47:45 +08:00
imccyu fb1b6a33ba test(session): cover migration-safe forks and projection reads 2026-10-08 16:45:26 +08:00
imccyu c1df683f8c feat(client): guide migration-required forks and subagent discovery 2026-10-08 16:45:26 +08:00
imccyu a2dd724c60 feat(session): expose format status and defer frontend-triggered migration 2026-10-08 16:45:25 +08:00
imccyu ba28ceb9e4 docs(session): describe explicit history preparation and migration guidance 2026-10-08 16:45:25 +08:00