Per-space approval configuration (three-tier model)
Description
Context and problem
Today, key Approval Path settings (such as manual approval initiation) are global and apply uniformly across the entire instance. Administrators cannot differentiate the app's behaviour between individual Confluence spaces or Jira projects. This constrains larger organisations where different teams have different approval-process needs.
Business goal
Allow settings that are currently global to be configured at the level of an individual space (the unified term for a Confluence space / Jira project), starting with manual initiation and designed to grow to additional configuration fields over time. Behaviour must be identical across both products.
Three-tier model
Configuration is organised into three tiers of decreasing scope:
-
Default config: one per instance, equivalent to today's global setting.
-
Named configs: any number, each assigned to a set of spaces. A named config replaces the default for its assigned spaces.
-
Space override: lets a single space further narrow its settings.
Guiding principle: merging is restrictive (logical AND), so a lower tier can only disable functionality, never enable it. When a higher tier disables a field, the override becomes moot.
Configurable fields (first phase)
Whether Approval Path is enabled in the space (when off: no panel and approval creation blocked by every path), whether manual approval initiation is allowed, and whether the Activity tab is visible.
Customer value
Global admins can manage policies centrally and assign them to groups of spaces, while space admins can narrow settings locally within the allowed boundaries. This gives large organisations flexibility without losing instance-level control.
Scope
Data layer (new configuration tables, migration from the current global setting), backend logic (config resolution plus a single creation gate covering all paths: manual UI, REST v1/v2, workflow post-function, Forge automation), management interfaces (a global config manager and a space settings panel), and disabled-state handling in the main view and macro.
Acceptance criteria
-
A named config assigned to a space correctly replaces the default.
-
A space override can only narrow, never enable when the parent is off.
-
Disabling a space results in a "disabled" state in the reference view and macro, and rejects approval creation via every path.
-
Hiding the Activity tab works per space, and tab selection always lands on a valid visible tab.