Skip to content

Releases: GooDAnDReaDY/dsh-smart-restart

v0.1.15

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 28 Oct 08:32

Bug Fixes

  • Safe Property & Service Resolution (#49):
    • Implemented safeGet(ctx, prop) in lib/chat-command.js using defensive ctx.get(prop, false) with proxy-trap isolation.
    • Replaced direct ctx.middleware check with safeGet(ctx, 'middleware'), fixing cannot get property "middleware" without inject crash under strict Cordis Context Proxy runtimes (DSH 0.2.1-rc.4).
    • Protected approval service lookup in lib/index.js via safeGet(ctx, 'approval').
    • Added safe internal logging facade (logger.warn/info/debug) to prevent uncaught proxy access errors on ctx.logger.
  • Regression Tests:
    • Added strict Cordis v4 proxy suite in test/activation.test.mjs testing activation with present, absent, and forbidden services.

v0.1.14

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 22 Oct 11:53

0.1.14

Features

  • Direct chat command for safe DSH restart without SSH (#44): Added slash command /restart (and aliases !restart, /dsh-restart) for instant restart directly from conversation without opening terminal or SSH. Dual-path architecture: registered via @deepseek-ai/dsh-commands and backed by a resilient fallback chat middleware. Supports interactive confirmation prompts (/restart --confirm, -y), simulation mode (/restart --dry-run), custom delay (/restart --delay=10s), reason tags (/restart --reason="..."), cancellation (/restart cancel, /cancel-restart), and instant health inspection (/restart status). The calling chat session is automatically captured as the post-boot delivery target, and the post-restart health verdict and package diff report are delivered right back into the same conversation.

v0.1.13

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 22 Oct 11:48

0.1.13

Features

  • Direct chat command for safe DSH restart without SSH (#44): Added slash command /restart (and aliases !restart, /dsh-restart) for instant restart directly from conversation without opening terminal or SSH. Dual-path architecture: registered via @deepseek-ai/dsh-commands and backed by a resilient fallback chat middleware. Supports interactive confirmation prompts (/restart --confirm, -y), simulation mode (/restart --dry-run), custom delay (/restart --delay=10s), reason tags (/restart --reason="..."), cancellation (/restart cancel, /cancel-restart), and instant health inspection (/restart status). The calling chat session is automatically captured as the post-boot delivery target, and the post-restart health verdict and package diff report are delivered right back into the same conversation.

v0.1.12

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 21 Oct 15:37

0.1.12

Features

  • Reliability Dashboard & Safe Restart in WebUI (#42):
    • Added REST endpoints GET /dsh-smart-restart/status and POST /dsh-smart-restart/restart with CSRF & peer validation (isTrustedRequest).
    • Extended RestartGuardCard with health verdict badge (Healthy, Degraded, Loop guard active), subsystem checks breakdown (services, unit, port, versions), and recent restarts history table.
    • Interactive Safe Restart trigger with grace period delay and reason configuration.
  • Grace Period Countdown Banner & Emergency Cancellation (#43):
    • WebUI live countdown banner with ticking seconds and emergency cancel action.
    • Added HTTP endpoint POST /dsh-smart-restart/cancel and agent tool dsh_restart_cancel.
    • Halts scheduled timer, clears pending intent.json, and notifies active agent session.

v0.1.11

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 21 Oct 14:10

0.1.11

Features

  • Rich situational snapshot on restart (#40): dsh_restart now accepts an optional structured context object capturing active working state (cwd, branch, worktree, files, tasks, memoryTag, plus arbitrary extra keys). Defaults cwd to process.cwd() when omitted. Context is persisted into intent.json across restarts, reported in post-boot agent notifications under - context: ..., and exposed through dsh_restart_status tool for immediate resumption of work without manual reorientation.
  • Diff attribution between boots (#41): marker.json now records an inventory snapshot of installed packages (dependencies and devDependencies from package.json / profile configs). On boot, diffPackages() calculates packages added, removed, or upgraded since the previous marker. Package changes are attributed in last-report.json, exposed via dsh_restart_status.lastDiff, and formatted into the post-boot report under - changes: ....

v0.1.10: Preflight Validation and Graceful Drain

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 21 Oct 12:37

Release v0.1.10

Features

  • Pre-flight configuration and environment validation before restart (#38): validates \package.json\ (JSON syntax), \cordis.patch.yml\ / \cordis.yml\ (YAML tab indentation & delimiter balance), systemd unit syntax, and network port conflicts before initiating restart. If any check fails, the restart is aborted, and an actionable diagnostic alert is delivered directly to the chat session via \deliverTo.
  • Simulation mode (\dryRun: true) (#38): \dsh_restart\ supports \dryRun: true\ to execute all preflight checks without terminating the harness.
  • Graceful drain guard for active agent tasks (#39): inspects running agent turns in \ctx.agents\ and waits for in-flight tasks to finish before terminating the harness (\drainActiveAgents). Configurable via \drainTimeoutMs\ (default \15000\ ms) in plugin config and WebUI settings card. Drain metrics (\drained, \waitedMs, \�ctiveCount) are recorded into \intent.json\ and reported in tool response.

Published to npm: @goodandready/dsh-smart-restart@0.1.10\

v0.1.9 [DSH v0.2.0-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 15 Oct 13:46

English

Security

  • Host approval primitive for harness restart (#36): dsh_restart tool no longer treats { confirm: true } from the calling LLM agent as final authorization to restart the harness. Added requireApproval: Schema.boolean().default(true).volatile() to config and registered a tools/pre-execute waterfall hook returning { kind: 'ask', reason: ... }. Host approval is requested via ctx.approval.request() before triggering systemctl or process signals.
  • Systemd unit name validation & detection check (#36): systemctlRestartArgs now enforces strict unit name syntax matching /^[A-Za-z0-9@_.-]+\.service$/ and validates configured units against the running unit detected from /proc/self/cgroup (allowedUnit). Invalid or unauthorized unit specifications fail closed.
  • State directory path traversal protection (#36): resolveSafeStateDir() prevents directory traversal outside $DSH_HOME via ../ sequences, ensuring persistence files remain sandboxed in $DSH_HOME/.restart-guard.
  • Delay clamping to prevent 32-bit timer overflow (#36): clampDelayMs() bounds restart delays between 500ms and Node.js 32-bit integer limit 2147483647 ms, preventing immediate timer fires caused by overflow.

Fixed

  • Preflight validation for devDependencies satisfying peerDependencies (#35): added Check #13 (devDep вЉ† peerRange) to dsh-plugin-preflight, ensuring development dependencies always satisfy declared peer compatibility bounds.
  • Primary agent fallback formalization (#35): clarified and verified target: 'primary' contract, cleanly falling back from ctx.agents.roots()[0] to ctx.agents.list()[0] when delivering post-restart verdicts.

Verification

  • npm test: 40/40 pass (100%).
  • dsh-plugin-preflight: FAIL=0, WARN=2.
  • Verified on DSH v0.2.0-rc.2 (isolated MiniPC test contour & MiniAI production contour).

дё­ж–‡

安全

  • Harness 重启的主机批准原语(#36пј‰пјљdsh_restart е·Ґе…·дёЌе†Ќе°†и°ѓз”Ё LLM ж™єиѓЅдЅ“зљ„ { confirm: true } 视为重启 harness 的最终授权。配置中新增 requireApproval: Schema.boolean().default(true).volatile()пјЊе№¶жіЁе†Њдє†иї”е›ћ { kind: 'ask', reason: ... } зљ„й«�дј�е…€зє§ tools/pre-execute waterfall 钩子。在触发 systemctl 或进程信号之前,通过 ctx.approval.request() 统一请求主机授权。
  • Systemd 单元名称语法验证与检测比对(#36пј‰пјљsystemctlRestartArgs 严格强制单元名称语法符合 /^[A-Za-z0-9@_.-]+\.service$/пјЊе№¶е°†й…ЌзЅ®зљ„еЌ•е…ѓдёЋд»Ћ /proc/self/cgroup 检测到的正在运行的单元(allowedUnit)进行校验,未经授权或非法的单元请求将以 fail-closed ж–№ејЏж‹’з»ќгЂ‚
  • зЉ¶жЂЃз›®еЅ•и·Їеѕ„йЃЌеЋ†й�ІжЉ¤пј€#36пј‰пјљresolveSafeStateDir() й�Іж­ўйЂљиї‡ ../ еєЏе€—йЃЌеЋ†и¶…е‡є $DSH_HOME,确保持久化文件严格限制在 $DSH_HOME/.restart-guard дё­гЂ‚
  • й�Іж­ў 32 дЅЌе®љж—¶е™Ёжєўе‡єзљ„е»¶иїџй’ідЅЌпј€#36пј‰пјљclampDelayMs() е°†й‡ЌеђЇе»¶иїџй™ђе€¶ењЁ 500ms е€° Node.js 32 位有符号整数上限 2147483647 ms 之间,避免溢出导致定时器被截断为 1ms 立即触发。

дї®е¤Ќ

  • devDependencies ж»Ўи¶і peerDependencies 范围的 preflight йЄЊиЇЃпј€#35пј‰пјљењЁ dsh-plugin-preflight 中添加了检查项 #13пј€devDep вЉ† peerRange),确保开发依赖项始终满足声ж�Ћзљ„对等兼容范围。
  • **Primary ж™єиѓЅдЅ“дє¤д»�е›ћйЂЂи§„иЊѓеЊ–**пј€#35пј‰пјљж�ЋзЎ®е№¶йЄЊиЇЃдє† target: 'primary' 契约,在交д»�й‡ЌеђЇеђЋиЈЃе†іжЉҐе‘Љж—¶пјЊеЅ“ ctx.agents.roots()[0] дёєз©єж—¶дј�й›…е›ћйЂЂи‡і ctx.agents.list()[0]гЂ‚

йЄЊиЇЃ

  • npm testпјљ40/40 йЂљиї‡пј€100%пј‰гЂ‚
  • dsh-plugin-preflightпјљFAIL=0, WARN=2гЂ‚
  • ењЁ DSH v0.2.0-rc.2 дёЉйЄЊиЇЃйЂљиї‡пј€MiniPC 独立测试环境与 MiniAI з”џдє§зЋЇеўѓпј‰гЂ‚

Р СѓСЃСЃРєРёР№

Безопасность

  • Хостовый примитив подтверждения перезапуска harness (#36): инструмент dsh_restart больше РЅРµ считает аргумент { confirm: true } РѕС‚ вызывающего LLM-агента достаточным основанием для перезапуска. Р’ схему конфигурации добавлен параметр requireApproval: Schema.boolean().default(true).volatile(), Рё зарегистрирован перехватчик tools/pre-execute waterfall, возвращающий { kind: 'ask', reason: ... }. Перед отправкой сигналов процесса или вызовом systemctl запрашивается авторизация через ctx.approval.request(...).
  • Синтаксическая валидация systemd unit Рё проверка cgroup (#36): systemctlRestartArgs проверяет РёРјСЏ юнита регулярным выражением /^[A-Za-z0-9@_.-]+\.service$/ Рё сравнивает его СЃ allowedUnit, извлечённым РёР· /proc/self/cgroup. Попытки перезапуска сторонних служб отклоняются.
  • Защита РѕС‚ path traversal РІ каталоге состояния (#36): resolveSafeStateDir() блокирует выход Р·Р° пределы $DSH_HOME через последовательности ../, гарантируя безопасное сохранение маркеров РІ $DSH_HOME/.restart-guard.
  • Ограничение задержки РѕС‚ переполнения 32-битного таймера Node.js (#36): clampDelayMs() ограничивает задержку диапазоном РѕС‚ 500 РјСЃ РґРѕ 2147483647 РјСЃ (максимум для signed 32-bit int), исключая СЃР±СЂРѕСЃ РІ 1 РјСЃ РїСЂРё больших числах.

�справлено

  • Preflight-проверка соответствия devDependencies диапазонам peerDependencies (#35): добавлена проверка #13 (devDep вЉ† peerRange) РІ dsh-plugin-preflight.
  • Семантика доставки target: 'primary' (#35): формализован контракт доставки отчёта: РїСЂРё отсутствии сессии доставка выполняется РІ активный корень ctx.agents.roots()[0], Р° РїСЂРё его отсутствии — РІ ctx.agents.list()[0].

Проверка

  • npm test: 40/40 pass (100%).
  • dsh-plugin-preflight: FAIL=0, WARN=2.
  • Проверено РЅР° DSH v0.2.0-rc.2 (изолированный стенд MiniPC Рё боевой контур MiniAI).

v0.1.8

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 07 Oct 18:53

English

Fixed

  • DevDependencies upgraded to ^0.2.0-rc.2 (#25): @deepseek-ai/dsh-tools, @deepseek-ai/dsh-llm, @deepseek-ai/dsh-session, and @deepseek-ai/dsh-home-paths bumped to ^0.2.0-rc.2, aligning dev toolchain with modern core APIs while preserving peer compatibility with ^0.1.7-rc.2 || ^0.2.0-rc.1.
  • Client settings form unavailable state handling (#26): RestartGuardCard logs a warning when settings scope is missing, guards against null scope, and renders a localized unavailable notice (unavailable) instead of attempting unsaveable form interaction.
  • Core chevron down icon request with graceful SVG fallback (#27): client queries IconChevronDownOutline14 from @deepseek-ai/dsh-client-ui-primitives adhering to DSH design guidelines, rotating 180° when open, with an inline SVG fallback if the primitive is unavailable.
  • Cleaned up redundant title expression (#28): eliminated dead ternary in client card header, cleanly referencing t('title').
  • Locale registration cleanup in ctx.effect (#29): locale bundles (en, zh) are now registered within ctx.effect, returning the unregistration disposer to prevent lingering locale state on plugin reload.
  • Theme design token alignment (#30): replaced non-standard --dsw-alias-label-error with design token var(--dsw-alias-state-error-primary).

Verification

  • npm test: 35/35 pass (100%).
  • dsh-plugin-preflight: FAIL=0, WARN=2.
  • Verified on DSH v0.2.0-rc.2 (isolated MiniPC test contour & MiniAI production contour).

中文

修复

  • devDependencies 升级至 ^0.2.0-rc.2(#25):@deepseek-ai/dsh-tools、@deepseek-ai/dsh-llm、@deepseek-ai/dsh-session 与 @deepseek-ai/dsh-home-paths 升级至 ^0.2.0-rc.2,开发工具链与现代核心对齐,同时维持 peerDependencies 兼容性(^0.1.7-rc.2 || ^0.2.0-rc.1)。
  • 客户端设置表单不可用状态处理(#26):当设置作用域缺失时 RestartGuardCard 记录警告日志(ctx.logger.warn),处理空作用域并展示本地化不可用提示,避免执行无效表单保存。
  • 请求核心 Chevron 图标并提供 SVG 回退(#27):客户端从 @deepseek-ai/dsh-client-ui-primitives 请求 IconChevronDownOutline14,展开时旋转 180°,并在基元不可用时优雅降级为内联 SVG。
  • 清理冗余标题三元表达式(#28):移除了客户端卡片头部死三元判断,直接简洁调用 t('title')。
  • 在 ctx.effect 中管理本地化清理(#29):语言包(en、zh)在 ctx.effect 中注册并返回销毁函数,防止插件热重载时残留本地化状态。
  • 主题设计令牌对齐(#30):将非标准的 --dsw-alias-label-error 替换为规范设计令牌 var(--dsw-alias-state-error-primary)。

验证

  • npm test:35/35 通过(100%)。
  • dsh-plugin-preflight:FAIL=0, WARN=2。
  • 在 DSH v0.2.0-rc.2 上验证通过(MiniPC 独立测试环境与 MiniAI 生产环境)。

Русский

Исправлено

  • Обновление devDependencies до ^0.2.0-rc.2 (#25): @deepseek-ai/dsh-tools, @deepseek-ai/dsh-llm, @deepseek-ai/dsh-session и @deepseek-ai/dsh-home-paths обновлены до ^0.2.0-rc.2, синхронизируя окружение разработки с современным ядром DSH при сохранении обратной совместимости в peerDependencies.
  • Обработка недоступного состояния формы настроек в клиенте (#26): RestartGuardCard логирует предупреждение (ctx.logger.warn) при отсутствии скоупа настроек и выводит локализованное сообщение unavailable вместо попытки рендера неработоспособной формы.
  • Запрос ядровой иконки шеврона с SVG-фолбэком (#27): клиент запрашивает IconChevronDownOutline14 из @deepseek-ai/dsh-client-ui-primitives с плавным поворотом на 180° при раскрытии и инлайн-SVG запасным вариантом.
  • Удаление мертвого тернарного выражения заголовка (#28): в заголовке клиентской карточки убран избыточный мертвый тернарник, обращение к заголовку стандартизировано как t('title').
  • Очистка словарей локализации в ctx.effect (#29): словари (en, zh) регистрируются внутри ctx.effect с возвратом функции отписки для предотвращения утечки состояния при перезагрузках.
  • Выравнивание дизайн-токена темы оформления (#30): устаревший и несуществующий --dsw-alias-label-error заменен на стандартный токен var(--dsw-alias-state-error-primary).

Проверка

  • npm test: 35/35 pass (100%).
  • dsh-plugin-preflight: FAIL=0, WARN=2.
  • Проверено на DSH v0.2.0-rc.2 (изолированный стенд MiniPC и боевой контур MiniAI).

v0.1.7: Core runtime reliability, boot marker versions & delivery loop guard

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 07 Oct 18:13

English

Fixed

  • Boot marker version detection & readBoot integration (#18, #31): readBoot() now populates dshVersion (from options or process.env.DSH_VERSION) and pluginVersion, and is invoked when writing marker.json to record the exact runtime versions that produced the boot marker.
  • Post-restart report delivery for primary session (#19): resolveAgent() now gracefully falls back to ctx.agents.roots()[0] or ctx.agents.list()[0] when target: 'primary' or when sessionId is empty, ensuring the restart verdict and resumed work are delivered.
  • Intent preservation without session ID (#20): intentState() now recognizes intents with recorded reason or resume even if no caller sessionId was resolved, and cleans up intent.json post-delivery so stale intents do not linger.
  • Safe delivery retry ticks (#21): wrapped timer ticks and agent delivery in try/catch and added error logging, preventing unhandled exceptions from terminating background timer loops.
  • Crash loop restart budget preservation (#22): history.json now records boot timestamps only when an actual restart occurred (boot.wasRestart === true), preventing cold boots and plugin reloads from exhausting the crash loop restart budget.
  • Probe timeout cleanup (#23): probe() health checks now register timers through safeSetTimeout() and reliably clear timeout handles on resolution, eliminating dangling timers in the event loop.

Verification

  • npm test: 30/30 pass.
  • dsh-plugin-preflight: FAIL=0, WARN=3.
  • Verified on DSH v0.2.0-rc.2 (isolated test contour & production contour).

中文

修复

  • 启动标记版本检测与 readBoot 集成(#18, #31):readBoot() 现在填充 dshVersion(从选项或 process.env.DSH_VERSION)和 pluginVersion,并在写入 marker.json 时调用,以记录生成启动标记的准确运行时版本。
  • 主会话重启后报告交付(#19):当 target: 'primary' 或 sessionId 为空时,resolveAgent() 优雅地回退到 ctx.agents.roots()[0] 或 ctx.agents.list()[0],确保重启判定和恢复工作得以交付。
  • 无会话 ID 的意图保留(#20):intentState() 现在即使未解析到调用方 sessionId 也能识别包含记录的 reason 或 resume 的意图,并在交付后清理 intent.json,防止过期意图残留。
  • 安全的交付重试定时器(#21):在 try/catch 中包装定时器 tick 和 agent 交付,并增加警告日志,防止未处理异常终止后台定时器循环。
  • 保护崩溃循环重启配额(#22):history.json 现在仅在实际重启(boot.wasRestart === true)时记录启动时间戳,防止冷启动和插件重载消耗崩溃循环重启配额。
  • 探测超时清理(#23):probe() 健康检查现在通过 safeSetTimeout() 注册定时器,并在解析时可靠清除超时句柄,消除事件循环中的游离定时器。

验证

  • npm test:30/30 通过。
  • dsh-plugin-preflight:FAIL=0, WARN=3。
  • 已在 DSH v0.2.0-rc.2(隔离测试环境和生产环境)上验证。

Русский

Исправлено

  • Определение версий маркера загрузки и интеграция readBoot (#18, #31): readBoot() теперь заполняет dshVersion (из опций или process.env.DSH_VERSION) и pluginVersion, и вызывается при записи marker.json для фиксации точных версий среды выполнения, создавших маркер.
  • Доставка отчёта после перезапуска для primary-сессии (#19): resolveAgent() теперь корректно обращается к ctx.agents.roots()[0] или ctx.agents.list()[0], когда target: 'primary' или sessionId пуст, обеспечивая доставку вердикта и контекста возобновления работы.
  • Сохранение intent без идентификатора сессии (#20): intentState() теперь сохраняет intent с записанными reason или resume, даже если sessionId вызывающей стороны не был определён, и очищает intent.json после доставки.
  • Безопасные retry-тики доставки (#21): таймерные тики и вызовы доставки агенту обёрнуты в try/catch с логированием предупреждений, что исключает сбои фонового таймера из-за необработанных исключений.
  • Защита бюджета перезапусков loop guard (#22): history.json теперь фиксирует метки времени только при реальном перезапуске (boot.wasRestart === true), не сжигая бюджет при холодных стартах или перезагрузках плагина.
  • Очистка таймера в probe() (#23): проверки здоровья probe() теперь регистрируют таймеры через safeSetTimeout() и сбрасывают их по завершении проверки, устраняя утечки таймеров в event loop.

Проверка

  • npm test: 30/30 пройдено.
  • dsh-plugin-preflight: FAIL=0, WARN=3.
  • Проверено на DSH v0.2.0-rc.2 (изолированный тестовый контур и продакшн).

v0.1.6 [DSH v0.2.0-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 07 Oct 14:22

English

Fixed

  • Settings unwrapping order (Unwrap -> Validate -> Unwrap): apply() now unwraps rawConfig before Config() schema validation and unwraps the result: plainConfig(Config(plainConfig(rawConfig || {}))). This prevents Volatile box copy failures or fallbacks to schema defaults when the loader supplies pre-boxed configs.
  • Unified settings namespace in client seat registration: plugins.item seat registration now uses the bare host-plane namespace id: NS (goodandready-smart-restart), matching cordis.patch.yml and preventing composite <package>#<row> mismatches.
  • Config form scope error logging: Eliminated silent empty catch block during client-side config forms / settings scope resolution; errors are now logged via ctx.logger.warn.

Verification

  • npm test: 25/25 pass.
  • dsh-plugin-preflight: FAIL=0, WARN=3.
  • Verified on DSH v0.2.0-rc.2 (isolated test contour & production contour).

中文

修复

  • 设置解包顺序 (Unwrap -> Validate -> Unwrap):apply() 现在在 Config() 模式验证之前解包 rawConfig,并解包返回结果:plainConfig(Config(plainConfig(rawConfig || {})))。避免加载器提供预装箱配置时 Volatile 复制失败或回退到模式默认值。
  • 客户端插件槽位注册中的统一设置命名空间:plugins.item 槽位注册现在使用裸主机平面命名空间 id: NS (goodandready-smart-restart),与 cordis.patch.yml 保持一致,防止复合键不匹配。
  • 配置表单作用域错误日志:消除了客户端配置表单/设置作用域解析期间的静默空 catch 块;错误现在通过 ctx.logger.warn 记录。

验证

  • npm test:25/25 通过。
  • dsh-plugin-preflight:FAIL=0, WARN=3。
  • 已在 DSH v0.2.0-rc.2(隔离测试环境和生产环境)上验证。

Русский

Исправлено

  • Порядок распаковки настроек (Unwrap -> Validate -> Unwrap): apply() теперь распаковывает rawConfig до вызова валидации схемы Config(), а затем распаковывает результат: plainConfig(Config(plainConfig(rawConfig || {}))). Это предотвращает сбои при копировании боксов Volatile и исключает скрытый откат настроек к дефолтным значениям.
  • Единый namespace настроек в регистрации клиентского слота: регистрация слота plugins.item теперь использует канонический хостовый id: NS (goodandready-smart-restart), совпадающий с cordis.patch.yml, исключая несовпадение составного ключа.
  • Логирование ошибок резолва скоупа: устранен пустой блок catch (_) {} при резолве configForms / settingsScope, добавлено логирование ctx.logger.warn.

Верификация

  • npm test: 25/25 успешно.
  • dsh-plugin-preflight: FAIL=0, WARN=3.
  • Проверено на DSH v0.2.0-rc.2 (изолированный тестовый сервер и боевой контур).