docs: make the service map the front door of architecture.md
The Layering ASCII diagram was cluttered, lumped THE concrete loop plugin undifferentiated into a grab-bag plugins box, omitted dsh-agent-core and the app packages, and restated the dependency rule that packages/README.md already owns — while being the first thing a reader linked from README hits. - Drop the Layering section; the tier story becomes one intro sentence and the dependency rule a one-line Service map footer linking packages/README.md#dependencies. - Split the Service map into the spine (packages/core/) vs the swappable capability seams; annotate ctx.agentLoop as THE concrete loop plugin. - Promote Cordis waterfall semantics to a top-level section placed before first waterfall use; drop '(important)' from the heading (anchor swept: AGENTS.md, gen-cordis-catalog.ts + regenerated catalog). - Promote Event taxonomy to a top-level section (anchor unchanged). - Retitle 'The vocabulary (dsh-llm)' to 'Content blocks and streaming (dsh-llm)' so the heading names its content (citation swept: llm-streaming.md). Net -29 words (1851 -> 1822); the 1890 ceiling stands, keeping the manifest's working margin.
This commit is contained in:
@@ -85,7 +85,7 @@ Real-API tests and demos read `DEEPSEEK_API_KEY` (and optional `DEEPSEEK_BASE_UR
|
||||
- **Registrations are effects**: every contribution goes through `ctx.effect()` / `ctx.on()`; a registry's `register()` returns the disposer.
|
||||
- **Typed events via declaration merging**; extensible unions use the merge-extensible-map pattern (`ContentBlockMap`, `SessionEventMap`, …). Every new event's JSDoc carries an `@mode` tag and a `@param` per payload parameter (`this`/trailing `next` exempt); every public service-class method documents each parameter and non-void return (`@param`/`@returns`) — the catalog generator hard-errors otherwise ([completeness RFC](docs/rfc/implemented/process/2026-07-04-cordis-jsdoc-completeness-gate.md)); mode semantics are in the [generated catalog](docs/cordis-catalog/events-and-services.md) header and [the catalog RFC](docs/rfc/implemented/process/2026-06-20-generated-cordis-catalog.md).
|
||||
- **Discriminated unions: `switch` on the tag**, not if-chains. Closed unions end with `default: assertNever(...)`; merge-extensible unions must NOT — handle known cases and fall through `default` with a comment.
|
||||
- **Waterfall listeners MUST call `next()`** to delegate; returning without it is the veto ([semantics](docs/architecture.md#cordis-waterfall-semantics-important)).
|
||||
- **Waterfall listeners MUST call `next()`** to delegate; returning without it is the veto ([semantics](docs/architecture.md#cordis-waterfall-semantics)).
|
||||
- **Plugins, not loop changes**: new behavior goes on the documented extension seams; changing `agent-loop` requires updating docs/architecture.md.
|
||||
- **Capability seams are three packages** — interface / implementation / consumer ([capability seams](docs/rfc/implemented/architecture/2026-06-13-capability-seams.md)); don't split preemptively.
|
||||
- **Explicit > implicit at package seams**: no optional field silently filled by a hidden `?? default` inside `run()`; defaulting is an explicit `resolve(request): Spec` step in the owning implementation (the `dsh-bash` request/spec split is the template).
|
||||
|
||||
Reference in New Issue
Block a user