{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://toolctrl.local/docs/feature-manifests/schema.json", "title": "ToolCTRL Feature Manifest", "type": "object", "additionalProperties": false, "required": [ "schemaVersion", "id", "title", "classification", "status", "owner", "description", "rationale", "codeAreas", "dependencies", "consumers", "integration", "boundaries", "pruning", "validation" ], "properties": { "schemaVersion": { "type": "string", "const": "1.0" }, "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" }, "title": { "type": "string", "minLength": 1 }, "classification": { "type": "string", "enum": ["core", "plugin-candidate", "remove-candidate", "mixed"] }, "status": { "type": "string", "enum": ["active", "proposed", "review-needed"] }, "owner": { "type": "string", "description": "Planning owner or broad ownership area, not a code owner assignment." }, "description": { "type": "string" }, "rationale": { "type": "array", "items": { "type": "string" } }, "codeAreas": { "type": "array", "description": "Likely source locations. Paths may be globs or package/module names.", "items": { "type": "string" } }, "dependencies": { "type": "array", "description": "Feature manifest IDs this feature needs to function.", "items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" } }, "consumers": { "type": "array", "description": "Feature manifest IDs or feature surfaces that depend on this one.", "items": { "type": "string" } }, "components": { "type": "array", "description": "Optional list for bundle manifests such as plugin or removal candidates.", "items": { "type": "object", "additionalProperties": false, "required": ["id", "title", "rationale", "codeAreas"], "properties": { "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" }, "title": { "type": "string" }, "rationale": { "type": "string" }, "codeAreas": { "type": "array", "items": { "type": "string" } }, "notes": { "type": "string" } } } }, "integration": { "type": "object", "additionalProperties": false, "required": [ "ownership", "surfaces", "configuration", "workers", "externalProviders", "permissions", "auditEvents", "billingImpacts", "uat" ], "properties": { "ownership": { "type": "string", "enum": ["tenant-owned", "admin-managed", "hybrid", "system-only"] }, "surfaces": { "type": "object", "additionalProperties": false, "required": ["adminRoutes", "tenantRoutes", "publicRoutes", "apiRoutes"], "properties": { "adminRoutes": { "type": "array", "items": { "type": "string" } }, "tenantRoutes": { "type": "array", "items": { "type": "string" } }, "publicRoutes": { "type": "array", "items": { "type": "string" } }, "apiRoutes": { "type": "array", "items": { "type": "string" } } } }, "configuration": { "type": "object", "additionalProperties": false, "required": ["admin", "tenant", "environment", "secrets"], "properties": { "admin": { "type": "array", "description": "Admin-owned settings, provider credentials, policy, and defaults.", "items": { "type": "string" } }, "tenant": { "type": "array", "description": "Tenant-owned settings visible or editable in tenant surfaces.", "items": { "type": "string" } }, "environment": { "type": "array", "description": "Required environment variables or deployment configuration.", "items": { "type": "string" } }, "secrets": { "type": "array", "description": "Secret values and where they are owned. Do not store secret values here.", "items": { "type": "string" } } } }, "workers": { "type": "object", "additionalProperties": false, "required": ["required", "queues", "jobs", "notes"], "properties": { "required": { "type": "boolean" }, "queues": { "type": "array", "items": { "type": "string" } }, "jobs": { "type": "array", "items": { "type": "string" } }, "notes": { "type": "array", "items": { "type": "string" } } } }, "externalProviders": { "type": "array", "items": { "type": "string" } }, "permissions": { "type": "array", "items": { "type": "string", "pattern": "^[a-z][A-Za-z0-9]*(\\.(?:[A-Za-z][A-Za-z0-9]*|\\*))+$" } }, "auditEvents": { "type": "array", "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)+$" } }, "billingImpacts": { "type": "array", "items": { "type": "string" } }, "uat": { "type": "array", "description": "Operator-verifiable acceptance checks for planning and implementation.", "items": { "type": "string" } } } }, "boundaries": { "type": "object", "additionalProperties": false, "required": ["mustKeep", "mayMoveToPlugin", "mustNotTouch"], "properties": { "mustKeep": { "type": "array", "items": { "type": "string" } }, "mayMoveToPlugin": { "type": "array", "items": { "type": "string" } }, "mustNotTouch": { "type": "array", "description": "Areas excluded from the current phase or known to be owned by parallel work.", "items": { "type": "string" } } } }, "pruning": { "type": "object", "additionalProperties": false, "required": ["phase", "action", "notes"], "properties": { "phase": { "type": "string" }, "action": { "type": "string", "enum": ["keep", "extract-plugin", "remove", "review"] }, "notes": { "type": "array", "items": { "type": "string" } } } }, "validation": { "type": "object", "additionalProperties": false, "required": ["source", "lastReviewed"], "properties": { "source": { "type": "array", "items": { "type": "string" } }, "lastReviewed": { "type": "string", "format": "date" } } } } }