review: the persona becomes the system-prompt plugin's deployment config

Review round 2 (tianyicui inline comments):

- dsh-system-prompt itself registers the harness:identity (-100) and
  deployment:persona (0) sections — they must survive a swapped loop
  plugin, so they leave dsh-agent-loop; the persona text is the plugin's
  own validated 'persona' config. The model/cwd variables STAY on the
  loop: runtime facts of the agents it drives.
- AgentOptions.systemPrompt is deleted with all its forwarding plumbing:
  the app configs' systemPrompt keys become 'persona' routed through
  dsh-agent-core (schema = z.intersect of the owners'), the ACP bridge
  and tool-subagent stop carrying persona configuration, and subagent
  children now render the deployment persona like every other agent.
- Example personas drop transport/interface trivia (ACP, CLI) — facts
  irrelevant to the model.
- Root CONTEXT.md removed (not idiomatic); its persona definition was
  wrong under the new ownership anyway.
- Docs, READMEs, the prompt-variables RFC, and generated catalogs
  updated; new loop test pins the assemble-waterfall escape valve
  (an emptied assembly sends NO system field).
This commit is contained in:
Tianyi Cui
2026-07-05 23:23:46 +08:00
parent 2304f7a245
commit 3f83a4ee96
55 changed files with 389 additions and 284 deletions

View File

@@ -49,7 +49,7 @@ export interface CreateAgentOptions {
* for a fresh (spawn) child.
*/
seed?: SessionEvent[]
/** Per-agent options (model, system prompt). */
/** Per-agent options (model, ). */
agentOptions?: AgentOptions
}
@@ -62,7 +62,7 @@ export interface ResumeAgentOptions {
agentId: AgentId
/** The persisted session id to load and resume on. */
resumeSessionId: SessionId
/** Per-agent options (model, system prompt). */
/** Per-agent options (model, ). */
agentOptions?: AgentOptions
}

View File

@@ -60,9 +60,8 @@ declare module '@deepseek-ai/dsh-system-prompt' {
interface AssembleContext {
/**
* The agent this assembly is for. The agent loop passes it on every
* per-step `assemble({ agent })`; section text and variable providers
* project per-agent facts from it (`options.systemPrompt` → the persona
* section, `options.model` → `{{model}}`, `session.header.cwd` →
* per-step `assemble({ agent })`; variable providers project per-agent
* facts from it (`options.model` → `{{model}}`, `session.header.cwd` →
* `{{cwd}}`). Optional because a bare `assemble()` (tests, diagnostics)
* has no agent — providers must tolerate its absence.
*/
@@ -71,23 +70,14 @@ declare module '@deepseek-ai/dsh-system-prompt' {
}
/**
* Options an agent is created with.
* Options an agent is created with. The persona is NOT here — it is the
* deployment's `persona` config on the dsh-system-prompt plugin, shared by
* every agent in the context.
* Merge-extensible: plugins declare extra fields via declaration merging.
*/
export interface AgentOptions {
/** Model name (must have a registered adapter at call time). */
model?: string
/**
* The agent's persona: a deployment-authored prompt-TEMPLATE fragment,
* rendered as the order-0 section of the assembled system prompt (before
* all tool guidance). It may reference registered `{{variables}}` (e.g.
* `{{model}}`, `{{cwd}}`); it is one section of the full prompt, never the
* whole. Template, not free-form text: every complete `{{…}}` group IS
* interpreted, strictly — an unknown or malformed reference fails the turn
* loudly — and there is no escape syntax for literal `{{…}}` prose yet (a
* deliberate deferral; see the prompt-variables RFC).
*/
systemPrompt?: string
}
export interface SendOptions {