Capability Import Wave 2
Scope
Wave 2 covers the extension-capability-type slices from the capability import program:
extension-toolset-presets-v1extension-context-packs-v1extension-automation-triggers-v1extension-browser-providers-v1extension-messaging-connectors-v1extension-speech-profiles-v1extension-node-adapters-v1
This wave does not claim that Hermes or OpenClaw reach is fully live already. It ships the typed manifest, registry, lifecycle, doctor, and authoring seams those later imports depend on.
Slice Log
10. extension-toolset-presets-v1
- status: complete
- intent:
- add a packageable operator-facing preset surface for curated tool bundles
- let packaged presets participate in permission and execution-boundary review
- implementation:
toolset_presetsis now a first-class manifest contribution type with a canonicalpresets/toolset/root- the extension registry now surfaces typed metadata for toolset presets
- doctor and permission evaluation now validate preset tool permissions plus derived execution-boundary and network requirements
- explicit preset
execution_boundariesnow also drive lifecycle-approval previews and network checks even when a preset declares noinclude_tools
- validation:
cd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_registry.py tests/test_extension_doctor.py tests/test_extensions_api.py -q
11. extension-context-packs-v1
- status: complete
- intent:
- add reusable packaged context bundles for profile, prompt, guardian-memory, and related imported-capability defaults
- implementation:
context_packsis now a first-class manifest contribution type with a canonicalcontext/root- scaffold, registry, and lifecycle payloads now treat context packs as typed package metadata instead of generic manifest entries
- author tooling can now scaffold context-pack placeholders directly
- validation:
cd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_scaffold.py tests/test_extension_registry.py tests/test_extensions_api.py -q
12. extension-automation-triggers-v1
- status: complete
- intent:
- add a packageable trigger contract for webhook, poll, and pub-sub style automation imports
- implementation:
automation_triggersis now a first-class manifest contribution type with a canonicalautomation/root- connector-style lifecycle payloads now expose trigger metadata, package config fields, configuration errors, and enable or disable state
- package-level and connector-level enablement now route through the shared extension lifecycle instead of requiring a dedicated automation seam
- validation:
cd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_scaffold.py tests/test_extensions_api.py -q
13. extension-browser-providers-v1
- status: complete
- intent:
- add a packageable browser-provider contract for later Browserbase, CDP, and relay imports
- implementation:
browser_providersis now a first-class manifest contribution type with a canonicalconnectors/browser/root- lifecycle payloads now expose provider kind, config fields, config state, and planned connector health through the shared extension API
- scaffold and doctor flows now understand packaged browser-provider metadata
- validation:
cd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_scaffold.py tests/test_extension_doctor.py tests/test_extensions_api.py -q
14. extension-messaging-connectors-v1
- status: complete
- intent:
- add a first-class messaging connector surface so later Telegram, Slack, and Discord imports land through the shared extension lifecycle
- implementation:
messaging_connectorsis now a first-class manifest contribution type with a canonicalconnectors/messaging/root- runtime state can now carry typed connector config and enablement for packaged messaging connectors before concrete channel implementations land
- registry and connector payloads now surface platform and config metadata for operator inspection
- validation:
cd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_registry.py tests/test_extensions_api.py -q
15. extension-speech-profiles-v1
- status: complete
- intent:
- reserve a typed extension surface for later TTS, STT, wake-word, and talk-mode imports without forcing voice primitives into core
- implementation:
speech_profilesis now a first-class manifest contribution type with a canonicalspeech/root- scaffold and registry flows now expose typed metadata for packaged speech profiles
- lifecycle payloads now treat speech profiles as passive typed contributions rather than opaque manifest entries
- validation:
cd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_scaffold.py tests/test_extensions_api.py -q
16. extension-node-adapters-v1
- status: complete
- intent:
- add a packageable node or device adapter surface so later companion-node and embodied reach imports land through typed extensions instead of raw plugins
- implementation:
node_adaptersis now a first-class manifest contribution type with a canonicalconnectors/nodes/root- lifecycle payloads now expose adapter kind, config fields, health summary, and enable or disable state through the shared connector API
- connector-pack scaffolding can now generate node-adapter placeholders with package-derived network permissions where required
- validation:
cd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_scaffold.py tests/test_extension_doctor.py tests/test_extensions_api.py -q
Shared Implementation Notes
- the manifest contract, package layout, registry enrichment, doctor, scaffold, and lifecycle API were all extended in this wave so the new contribution types behave like first-class extension surfaces instead of metadata sidecars
connector-packscaffolding is now real rather than deferred, which lets the authoring tools generate valid placeholder packages formanaged_connectors,automation_triggers,browser_providers,messaging_connectors, andnode_adapters- Wave 2 deliberately stops at typed lifecycle support for imported reach surfaces; the concrete Hermes and OpenClaw integrations that consume those types still land in later waves
Subagent Review
Review 1
- reviewer:
Hooke - scope:
- schema, layout, registry, scaffold, and docs for the new Wave 2 contribution types
- findings:
- non-UTF-8
manifest.yamlfiles could crash registry scanning instead of surfacing a structured load error - nested manifests under contribution roots could be misclassified as package manifests
- duplicate extension-id precedence ignored the registry's configured manifest-root order and could prefer the wrong package source
- docs overstated
observer_definitionsas connector-pack content even though that surface still belongs to capability-pack packaging rules
- non-UTF-8
- resolution:
- manifest loading now converts
UnicodeDecodeErrorinto a structuredExtensionManifestError - package-manifest detection now rejects manifests nested under contribution subtrees
- duplicate extension resolution now respects the registry's actual manifest-root order first and only falls back to bundled/workspace heuristics afterward
- authoring docs now clarify the distinction between capability-pack observer content and true connector-pack contribution types
- manifest loading now converts
Review 2
- reviewer:
Galileo - scope:
- full Wave 2 branch after lifecycle, doctor, and API support landed
- findings:
- suspicious-context scanning for
context_packscould still be bypassed by hiding hostile instructions inside fenced blocks connector-packscaffolding still accepted Wave 2 contribution sets that could never validate as connector packs because they contained no connector surfaces- extension docs still had pre-Wave-2 wording around scaffold scope and validation depth
- suspicious-context scanning for
- resolution:
- doctor now scans fenced content for
context_packsspecifically, while preserving the earlier false-positive protections for the rest of the prompt-bearing surfaces - scaffold now rejects
connector-packcreation requests that omit all true connector contribution types - extension overview and contribution-type docs now reflect the shipped Wave 2 scaffold and validation surface instead of the pre-wave wording
- a final follow-up spot-check was requested after these fixes landed; that re-review timed out without returning additional concrete findings before the wave was closed
- doctor now scans fenced content for
Wave 2 Exit Validation
- status: complete
- validation:
python3 -m py_compile backend/src/extensions/capability_contributions.py backend/src/extensions/connector_health.py backend/src/extensions/doctor.py backend/src/extensions/lifecycle.py backend/src/extensions/manifest.py backend/src/extensions/layout.py backend/src/extensions/permissions.py backend/src/extensions/registry.py backend/src/extensions/scaffold.pycd backend && UV_CACHE_DIR=/tmp/uv-cache uv run pytest tests/test_extension_manifest.py tests/test_extension_scaffold.py tests/test_extension_registry.py tests/test_extension_doctor.py tests/test_extensions_api.py -qcd backend && OPENROUTER_API_KEY=test-key WORKSPACE_DIR=/tmp/seraph-test UV_CACHE_DIR=/tmp/uv-cache uv run pytest -qcd frontend && npm testcd frontend && npm run buildcd docs && npm run buildgit diff --check
- result:
- focused Wave 2 backend suite:
104 passed - backend full suite:
1126 passed,4existing warnings - frontend full suite:
154 passed - frontend build: passed
- docs build: passed
- diff hygiene: clean
- focused Wave 2 backend suite: