{"content":"Development journal for commit 5751fb2c (fix(dsh-plugin): read the agents service through ctx.get so the plugin tree loads).\n\ndsh web failed to boot after the agent-mode skill turns round: createHostAgentTurnRunner in dsh-plugin/src/index.ts read ctx.agents directly, but the plugin deliberately keeps 'agents' OUT of its cordis inject list (asserted verbatim in plugin-shape.test.mjs), so the read hit the inject fence — 'cannot get property agents without inject' — and took down the whole loader entry. The plugin already has the established optional-service helper for exactly this: agentsRegistryOf(ctx) (twin-tools.ts, used by twin delegate, schedule scheduler, and the group-task worker) reads ctx.get('agents') first and falls back to a try/catch direct read for plain-object test contexts. createHostAgentTurnRunner now uses it and is exported for tests. Regression test: a fenced ctx whose agents getter throws the cordis error resolves to undefined (no runner), and a ctx.get-provided registry yields a runner — plugin-shape.test.mjs. The undefined-runner path is already handled downstream: the host LLM executor posts an explicit 'agents service' error for skill-scoped turns instead of silently degrading to a plain completion.\n\nVerification:\ncd dsh-plugin && npm run build && npm run typecheck && node --test tests/plugin-shape.test.mjs tests/host-llm-executor.test.mjs tests/twin-tools.test.mjs tests/group-task-worker.test.mjs tests/schedule-scheduler.test.mjs && node --test tests/*.test.mjs\n\nFiles:\ndsh-plugin/src/index.ts\ndsh-plugin/tests/plugin-shape.test.mjs","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}