--- name: plugin-contract-governance description: "Partial Skill: invoke by name only — the SDD plugin contract for what a plugin implements. Loaded by the conductor and by plugin authors, not user-triggered." user-invocable: false --- # SDD Plugin Contract Governance What an SDD plugin must implement and what each part loads. The conductor resolves delegates against this contract; a plugin author builds to it. The universal-plugin format itself is `plugin-design` (`governance show universal-plugin`); this skill is the SDD-role layer on top. ## The five delegate roles (closed set) A plugin covers a set of artifact-types by providing agents for these role keys. Any role may be `null` (degenerates to the SDD default) or omitted (falls back to the convention name `-`). A **producer** role may also name a model-tuned agent to run at its own model/effort — the model-tuning escape valve; naming any agent (plugin delegate or model-tuned) means the conductor **spawns** it. | Role key | Acts | SDD default | |---|---|---| | `spec-producer` | writes the `spec.md` body + the `.feature` | conductor loads `spec-producer-governance`, authors inline (`sdd:sdd-automaton`) | | `solution-producer` | writes `.solution.md` (the durable, ungated design fork) | conductor loads `solution-producer-governance`, authors inline (`sdd:sdd-automaton`) | | `spec-judge` | judges `spec.md` + the `.feature` at the spec gate | `sdd-spec-judge` — spawned cold agent | | `impl-producer` | builds the artifact **and** its verification | conductor loads `impl-producer-governance`, dispatches a generic builder (`sdd:sdd-automaton`) | | `impl-judge` | runs the verification against the frozen `.feature` | `sdd-impl-judge` — spawned cold agent | **Producers run inline (or via a mechanical builder), judges spawn cold** ("conductor writes, cold judges grade"): an SDD-default spec/solution-producer is a governance the conductor loads and runs in its own warm main-session context (recorded `produced-by.: sdd:sdd-automaton`); the SDD-default impl-producer is mechanical and spawned via a generic builder; an SDD-default judge is a cold agent the conductor spawns, because a grader must not share the author's context. A plugin delegate — or a model-tuned producer agent named for the slot — is always spawned. Any of the spawns above may instead be realized through a general-purpose dispatch capability's `subagent | channel` seam (ADR-0023, referenced by intent only) — an alternative realization of the same spawn, not a change to which roles spawn or how they are graded. ## Which governances each role loads Bars are the Model-B `(actor, gate)` governances (matched by the `resolve-governances` skill; the actor bars are the shipped `sdd:{oracle,builder,architect}-{spec,impl}-governance` skills); a producer self-aligns to exactly the bars its judge grades. The lens sets are spec gate `{oracle, builder, architect}`, impl gate `{builder, architect}`, solution `{architect}` (ungated). **Read each row against that sentence.** A producer row that does not carry its whole lens set is a transcription slip, not a narrowing. | Role | Loads | |---|---| | spec-producer | `spec-format`, `suite-format`, `ownership`, the resolved `oracle-spec` + `builder-spec` + `architect-spec` bars | | solution-producer | `ownership`, the resolved `architect-spec` bar | | spec-judge | `spec-format`, `suite-format`, `lifecycle`, `gate-validation`, the resolved `oracle-spec` + `builder-spec` + `architect-spec` bars | | impl-producer | `ownership`, the resolved `builder-impl` + `architect-impl` bars | | impl-judge | `ownership`, `gate-validation`, the resolved `builder-impl` + `architect-impl` bars | For an **SDD-default producer** role, the conductor additionally loads the matching `spec-producer-governance` / `solution-producer-governance` / `impl-producer-governance` — the procedure it runs — which itself references the bars above; a plugin delegate carries its own procedure and loads these bars directly. The `sdd` gateway loads **no** governance (it only classifies and routes). The gate skill `spec-gate` loads `lifecycle`, `ownership`, `gate-validation`, `combat-log` (+ `spec-format` / `suite-format` at the spec gate). A plugin's agents inherit the universal loads — e.g. `aced`/`quill` spec-producers load `sdd:spec-format-governance` + `sdd:ownership-governance`, and their judges load `sdd:gate-validation-governance`. ## Registry shape The conductor reads **only** `.agents/universal-plugin.json` (top-level `sdd-plugins[]`) — it does not scan plugin directories. Each entry: ```json { "name": "", "version": "", "squads": [ { "artifact-types": ["", "..."], "roles": { "spec-producer": "", "solution-producer": "", "spec-judge": "", "impl-producer": "", "impl-judge": "" }, "governances": { "oracle-spec": "", "builder-spec": "", "builder-impl": "", "architect-spec": "", "architect-impl": "" } } ] } ``` A plugin declares one or more **squads**, each serving a **set of artifact-types** with one production chain; a type appears in at most one squad per plugin (the plugin's served set = the union of its squads' `artifact-types`). Resolution: match each file's **`artifact-type`** (the squad key, **not** the folder name) against each plugin's `squads[]` — the squad whose `artifact-types` contains it serves the file (e.g. ACED's one squad covers `skill`, `subagent`, `command`, `agents-section`). An absent or unmatched `artifact-type` → all roles degenerate to SDD defaults. One matching squad → resolve each role and governance key (name = use it; `null` = SDD default; missing role key = `-`). Two or more plugins claiming the type → return `STATUS: needs-input` for the skill to ask which plugin owns it; the choice is recorded as `.agents/sdd/` resolution state (**distinct from `produced-by`**), decisive on resume.