Back to home

Yuer6327

NoLetMe

No description

Stars
0
Language
TypeScript
Created
Aug 16, 2026
Updated
Aug 16, 2026

Introduction

NoLetMe · dsh reasoning-trajectory panel

A DeepSeek Harness (dsh) web plugin that adds a real-time reasoning-keyword statistics panel to the right edge of the conversation page.

While the model streams, NoLetMe watches its reasoning blocks and counts keywords that fingerprint how it is thinking:

分类关键词依据
🟢 高效推理 · 直接行动We need… Let's… We should… We can… We will… + 首行 Good./Great./Excellent.minimal-like 高分轨迹
🟠 低效犹豫 · 第一人称试探Let me… I think… I'm not sure… I wonder… I guess… maybe perhapsstandard-like 低分轨迹
⚪ 中性转述 · 复述任务The user wants… The user asked… this task… the request…Standard 目录开场框架

It is a native-feeling overlay: the panel reuses the harness design system (--dsw-alias-* semantic tokens, the DetailsPanel header/body idiom, CSS Modules, light/dark and reduced-motion preserved) and mounts through the official shell.overlay slot — nothing in the shipped UI is replaced or patched.

Background

The keyword list is grounded in the public investigation of the DeepSeek V4 Pro GA 0813 post-training overfitting event: the RL checkpoints trained on DeepSeek Harness's Minimal preset (the "exact RL prompt and schemas" two-tool scaffold) collapse on the wider Standard catalog — 99/96 in Minimal vs 91/92 in Standard/PTC on Project2 V4.1b. Trajectory word counts separate the two modes cleanly: we/let's with zero let me (minimal), vs let me in the hundreds (standard).

Full evidence and the event write-up: docs/research.md.

Install

Prerequisite: a dsh CLI (dsh --version), and a profile to install into.

cd /path/to/this/repo/..            # where NoLetMe/ lives
dsh plugin --profile demo add ./NoLetMe
dsh web --profile demo              # or just: dsh --profile demo

The bundle layer (cordis.patch.yml) inserts the dsh-noletme row; the dsh.client block in package.json tells the web shell to serve the browser bundle. The panel appears top-right in the web UI.

Install directly from GitHub (the prepare script builds lib/ on install):

dsh plugin --profile demo add github:Yuer6327/NoLetMe

pnpm ≥10 blocks a git dependency's prepare script until allowlisted — copy the exact package key pnpm prints into the profile's pnpm-workspace.yaml:

allowBuilds:
  dsh-noletme: true

then re-run the add.

Development overlay (no install)

Build once, then run with a patch overlay that points at the package:

pnpm install && pnpm build
dsh web --patch 'D:/OneDrive/桌面/play/codes/dsh-plugin/NoLetMe/cordis.patch.yml'

For a raw source overlay the row in cordis.patch.yml can name the package directory directly:

- insert:
    - id: noletme
      name: 'D:/OneDrive/桌面/play/codes/dsh-plugin/NoLetMe'

Build

pnpm install      # devDependencies: tsdown, lightningcss, typescript, react types
pnpm typecheck    # optional; tsc --noEmit
pnpm build        # tsdown → lib/index.js (node half) + lib/client.js (browser bundle)

The browser bundle is a window.__ModuleLoader__.load(...) closure-factory artifact (same shape as the harness's own clientBundle preset): platform modules resolve through the frozen module table, everything else inlines, and *.module.css compiles to a hashed class map with auto-injected styles.

Usage

  • The panel sits top-right, floating over the conversation frame.
  • Expanded card: live status strip (streaming dot, reasoning blocks / chars, visible replies), trajectory-mode badge, per-category share bars, raw research metrics (we · let's · let me · I), the keyword breakdown, and a hesitation-pressure health note.
  • Click the header chevron to collapse into a small mode pill (state is remembered). Click the pill to expand again.
  • Stats are per-session and reset when you switch sessions. No data leaves your browser.

Architecture

src/
├── index.ts            # Node (host) half — no-op, satisfies the Loader
└── client/
    ├── index.ts        # browser bundle entry (apply/inject)
    ├── apply.ts        # registers the shell.overlay entry
    ├── slots.ts        # inject-face + composed-props contracts
    ├── session-source.ts # current-session ConversationSnapshot observable
    ├── keywords.ts     # the research-backed taxonomy
    ├── stats.ts        # counting engine (longest-match walk, per-block cache)
    ├── NoLetMePanel.tsx / .module.css
    └── locales.ts      # zh + en dictionaries
  • Reasoning streams arrive as reasoning-delta chunks; the session layer accumulates them into ConversationSnapshot.partial (published at most once per animation frame). Finalized turns land in snapshot.nodes. The panel folds both, caching counts per block object so each stream delta only recounts the block that actually changed.
  • shell.overlay is the layout's frame-wide additive seat; the panel is a click-through-opt-in floating card that mirrors the DetailsPanel styling.

License

MIT