Plugin Authoring — Extending the Framework¶
Thai version: HANDBOOK.th.md · Framework repo: bemindlabs/BWOC-Framework · Glossary: ../glossary.en.md · Developer: ../developer/HANDBOOK.en.md
Source of truth. The canonical specification lives in the framework repo. On any conflict, the repo wins and this handbook has a bug. Relevant docs: PLUGINS.en.md (the full plugin spec) · SKILLS.en.md.
Table of Contents¶
- Skill or plugin?
- The plugin kinds
- Anatomy of a plugin
- The lifecycle —
bwoc plugin - Normative schemas — the contract
- Write verbs and the operator-confirm gate
- What a plugin is not
- See also
1. Skill or plugin?¶
Skills and plugins share a substrate — a TOML manifest, the backend-neutrality gate, per-workspace opt-in — and split on who turns them on.
| Skill | Plugin | |
|---|---|---|
| Audience | Agent author | Workspace operator |
| Opt-in via | <agent>/config.manifest.json |
workspace.toml [plugins] |
| Invoked by | The agent during its own operation | The framework runtime |
| Scope | Per-agent | Per-workspace |
| Example | worktree discipline, bilingual-parity check | Tier 2 memory backend, an extra LLM backend |
The rule of thumb: if an individual agent's logic calls it, it is a skill; if the workspace loads it once for everyone, it is a plugin. This chapter is about plugins; for skills, see SKILLS.en.md.
2. The plugin kinds¶
Every plugin declares exactly one kind. The kind defines which lifecycle hooks the framework calls. A plugin sets kind once — cross-kind plugins are not supported; split them.
| Kind | What it extends |
|---|---|
memory-backend |
Tier 2 memory (semantic search / vector store) |
llm-backend |
Backends beyond the six declared ones |
workflow |
External integrations (issue trackers, CI, code review) |
audit |
Inspecting the workspace against a standard (ISO/IEC 29110, 9001, 27001…) |
jira |
Bidirectional sync with Jira Cloud — the first write-capable kind |
okr |
Tracking operator-authored Objectives + Key Results |
council |
A structured decision protocol among fleet agents (see Council) |
figma |
Read-mostly Figma REST integration; design→dev bridge |
gws |
Read-mostly Google Workspace (Drive / Gmail / Calendar) |
[!note] The deciding principle for a new kind: own-kind when BWOC defines a normative schema over the integration; reuse
workflowwhen it is a passthrough with no BWOC-owned shape.figmaandjiraearn their own kinds because they carry normative mapping schemas; a thin shell-out to some CLI does not.
3. Anatomy of a plugin¶
A plugin is a directory with a manifest.toml at its root. The manifest declares identity, the kind, the verbs the plugin exposes, and a JSON-schema-lite description of the config keys the workspace may set:
name = "my-audit"
kind = "audit"
version = "0.1.0"
# Config the operator sets in workspace.toml [plugins.my-audit];
# validated against this block at load time.
[config]
storage_path = { type = "string", required = false, default = "memories/tier2" }
max_results = { type = "integer", required = true }
The operator then opts in from workspace.toml:
[plugins.my-audit]
max_results = 50
The framework validates the workspace's [plugins.<name>] table against the manifest's [config] block — a missing required key or a wrong type fails the load, not the run.
4. The lifecycle — bwoc plugin¶
Authoring and operating a plugin runs through one command family:
bwoc plugin init my-audit --kind audit # scaffold a manifest + stub
bwoc plugin verify my-audit # neutrality + manifest + schema checks
bwoc plugin install ./my-audit # register into the workspace
bwoc plugin enable my-audit # turn on for this workspace
bwoc plugin list # what's installed + enabled
bwoc plugin show my-audit # manifest + config in effect
bwoc plugin disable my-audit # turn off without removing
bwoc plugin remove my-audit # unregister
[!tip] Run
bwoc plugin verifybefore every install. It runs the same backend-neutrality gate asbwoc check— a plugin that hardcodes a vendor name or model id fails here, so you catch it before it reaches a workspace.
5. Normative schemas — the contract¶
A plugin's value is its output contract. The reporting and coordination kinds each carry a normative schema the framework validates at every invoke boundary — an unknown enum value is a plugin bug that fails the run, not a finding the operator must triage. The shipped schemas:
- Audit Findings —
{criterion_id, severity, status, evidence, remedy};severityandstatusare closed enums;evidencemust be reproducible (the Musāvāda guard — no claim without a referent). - Jira Issue Mapping, OKR Progress, Council Decision, Figma Asset Mapping, Workspace Resource — each a normative shape for its kind.
A shared rule across all of them: optional fields are omitted when absent, never serialized as null, and identifiers are stable across releases — renaming a criterion_id or keying on a mutable field is a breaking change.
6. Write verbs and the operator-confirm gate¶
Most plugin verbs read and carry no gate — they are free. A write verb — one whose invoke produces a durable side-effect outside the plugin's own address space — carries a normative operator-confirm gate:
- The gate lives at the operator boundary — the
bwoc <cli>command, not the plugin. One confirmation per write; the plugin does not re-implement or bypass it. - It shows the exact effect before acting — target, current state, and the literal command that will run (with
--so user values can't be parsed as flags). - Default is No. An interactive operator answers
y/N; a headless agent must pass an explicit--yes, set only when the operator authorized that specific action. - A refused write reports "no change" with the reason (Dhammānupassanā) — never a silent write, never a bare failure.
[!warning] Destructive, irreversible verbs (e.g.
delete) are held to a higher bar than reversible writes likestart/stop, and are introduced deliberately per-slice with their own stronger gate — not shipped just because they sit next to a reversible write.
7. What a plugin is not¶
- Not a loophole for vendor-specific framework logic. The six declared backends are first-class and live in spec. Vendor phrasing is still forbidden (Samānattatā).
- Not a place for one-off scripts. Those belong with the agent that uses them.
- Not skills with extra steps. If an agent calls it during its own operation, it is a skill.
8. See also¶
Framework source (public GitHub):
- PLUGINS.en.md — the full plugin specification: every kind, schema, and the manifest format
- SKILLS.en.md — the skill layer, for agent-author extensions
Sibling handbook chapters:
- ../developer/HANDBOOK.en.md — the crate map and how the runtime loads extensions
- ../council/HANDBOOK.en.md — the
councilkind in depth - ../okr/HANDBOOK.en.md and ../iso-audit/HANDBOOK.en.md — worked examples of
okrandauditplugins - ../glossary.en.md — every term in one table
This handbook is maintained alongside the framework. When behavior described here diverges from the framework repo, the repo is correct — please open a fix.