Configuration

August 31, 2026 · View on GitHub

For anyone who wants to change a setting. Most people never need to.

Two ways to set a value

WhereHowNotes
Settings → Tacit (UI)flip the switch / pick the model / type the capwrites only the keys you changed to ~/.dsh/storages/tacit/config.patch.json
Profile patch (YAML)add an id-targeted row to ~/.dsh/profiles/web/cordis.patch.ymlany key, incl. the ones with no UI control; takes effect after restarting npx @deepseek-ai/dsh web
# ~/.dsh/profiles/web/cordis.patch.yml
- id: tacit
  config:
    model: deepseek-v4-pro
    autoDailyBudget: 50
    enrichPrompts: true

Precedence: UI patch > YAML > built-in defaults. A key set once in the UI keeps winning over YAML until you change it again in the UI (patch keys are never removed).

All keys

KeyDefaultAllowedWhat it doesUI
modeldeepseek-v4-flashdeepseek-v4-flash, deepseek-v4-promodel used for every Tacit callAnalysis model
autoAnalyzetruebooleananalyze messy / corrected turns automaticallyAuto-analyze messy turns
learnFromGoodtruebooleanalso analyze a clean turn that follows a messy one (what you included the second time); counts against the daily capAlso learn from a clean prompt right after a messy turn
autoDailyBudget300–1000cap on automatic analyses per local calendar day; 0 disables themDaily cap on automatic analyses
autoMinSteps151–500a finished turn with at least this many model steps counts as messy (auto-analysis only)
steerAgenttruebooleaninject the learned directives into every new conversation's system promptInject learned directives into the system prompt
directiveEvery31–100new analyses between two directive distillations
directiveTrialTurns101–500finished turns a candidate directive stays on trial
directiveWorseBy0.150–1retire a candidate when its trial correction rate exceeds the baseline by more than this (or its messy-turn rate by more than twice this)
reviewCandidatesfalsebooleana freshly distilled directive stays queued until you press Start trial on itReview new directives before their trial
bootstrapConcurrency11–4analyses run at once during Learn from my last 20 turns; same calls and cost, less waiting
costHistoryDays307–365days of detailed usage runs kept; older day files are deletedKeep detailed usage history (days)
costWarnDailyUsd00–10000visual warning at 80 %/100 % of this daily Tacit spend; 0 disablesWarn above this daily spend (USD)
costWarnMonthlyUsd00–10000same as costWarnDailyUsd, over a calendar month; 0 disablesWarn above this monthly spend (USD)
enrichPromptsfalsebooleanopt-in: one small call before each send appends learned context (never rewrites your words); uncappedAdd learned context before each send
liveSuggestionstruebooleanshow the ✨ Improve prompt buttonEnable the composer Improve button
maxPatterns121–50mistake patterns kept in the profile and offered to ✨ Improve
maxKeptTurns601–1000turns retained per conversation (newest kept)
maxPromptChars4000200–100000prompt text kept per turn
maxAssistantChars4000200–100000final answer kept per turn
maxToolCallChars500100–20000tool-call arguments kept per call
maxToolCallsPerTurn501–500tool calls kept per turn

Good to know

  • Out-of-range numbers are clamped silently to the allowed range; nothing is logged.
  • 0 only means zero for autoDailyBudget, costWarnDailyUsd and costWarnMonthlyUsd. For every other numeric key 0 falls back to the default (the code uses value || default).
  • A model outside the allowlist silently becomes deepseek-v4-flash when it comes from YAML, and is rejected with 400 bad-request when set through the UI/API.
  • liveSuggestions: false hides the button only; the /api/tacit/improve route stays callable.
  • Unknown keys are dropped, not rejected — an old learningThreshold from dsh-prompt-coach is simply ignored.
  • DSH_HOME moves the whole storage root ($DSH_HOME/storages/tacit/).
  • The bootstrap size (20) is an argument of the /api/tacit/bootstrap route (limit, 1–50), not a setting; the UI always sends 20.
  • The retention selector only offers 7 / 14 / 30 / 90 / 180 / 365 days. A costHistoryDays set to another value inside 7–365 (e.g. via YAML) stays in effect, but the Data & privacy card's selector shows 30 until you pick one of its own options, which then overwrites it.
  • Changing steerAgent or any directive affects new conversations only, with one exception. Removing a directive or switching one off reaches open conversations at their next system-prompt assembly; everything else waits for the next conversation. See How it works §7.

Docs index · See also: Privacy, cost & limitations