Expand description
§2 “The Bolt-on Capability Taxonomy” (docs/composable-harness/ COMPOSABLE-HARNESS-DESIGN.md) — P3 of the composable-harness migration
(design §5.2, phase P3: “A ModuleId enum (the 35 names) + resolved
activation set on Config”).
ModuleId names all 35 §2 modules exactly as the table numbers them
(1-35). ModuleActivation is the resolved activation set — “module
activation is pure config → set, testable without the loop” (§5.3 risk
2’s mitigation): ModuleActivation::from_harness computes it from a
crate::configfile::HarnessConfig alone, no crate::Agent required.
Schema-collapse note. Two of the 35 §2 rows have no independent
[capabilities.<name>] table of their own in the §3.1 schema — they are
represented as a field of a SIBLING module’s table instead:
- module 10
permissions.approvalsis[capabilities.permissions]’s ownenabledflag (theapproval = "…"mode lives in the same table as modules 11-13’s parent, not a nestedapprovalssub-table) —ModuleId::PermissionsApprovalsreadscapabilities.permissions.enabled. - module 16
mcp.serveris[capabilities.mcp].serve(a bool field, not a nested table with its ownenabled) —ModuleId::McpServerreads that field directly.
Every other module maps onto exactly the crate::configfile::MODULE_NAMES
/ crate::configfile::NESTED_MODULE_NAMES key P2 already resolves.
Structs§
- Module
Activation - The resolved activation set for all 35 modules (§5.2 P3: “a resolved
activation set on
Config”) — pureHarnessConfig→ set, no loop required (§5.3 risk 2’s testability mitigation). Also carriestools_search’s three per-tool sub-flags, sincecrate::tools::ToolRegistry::from_configneeds them to decide which ofglob/search/list_dirto register — and (P4c)tools_web’s two, forweb_fetch/web_search.
Enums§
- Module
Id - The 35 §2 capability modules, numbered exactly as the design’s module table (§2, rows 1-35).