phacility/phabricator · error · Exception
Configuration is not valid. Maniphest points configuration m
Error message
Configuration is not valid. Maniphest points configuration must be a dictionary.
What it means
ManiphestTaskPoints::validateConfiguration rejects the 'maniphest.points' config when it is not a PHP array/dict. Beyond this check, PhutilTypeSpec::checkMap only allows the keys 'enabled' (bool), 'label' (string) and 'action' (string), so a scalar or list value fails at the very first gate with this Exception.
Source
Thrown at src/applications/maniphest/constants/ManiphestTaskPoints.php:26
}
public static function getPointsLabel() {
$config = self::getPointsConfig();
return idx($config, 'label', pht('Points'));
}
public static function getPointsActionLabel() {
$config = self::getPointsConfig();
return idx($config, 'action', pht('Change Points'));
}
private static function getPointsConfig() {
return PhabricatorEnv::getEnvConfig('maniphest.points');
}
public static function validateConfiguration($config) {
if (!is_array($config)) {
throw new Exception(
pht(
'Configuration is not valid. Maniphest points configuration must '.
'be a dictionary.'));
}
PhutilTypeSpec::checkMap(
$config,
array(
'enabled' => 'optional bool',
'label' => 'optional string',
'action' => 'optional string',
));
}
}
View on GitHub (pinned to 5720a38cfe)
Solutions
- Set a dict: `bin/config set maniphest.points '{"enabled": true}'`.
- Optionally customize labels with the allowed keys only: {"enabled": true, "label": "Points", "action": "Change Points"}.
- Prefer the web Config application (maniphest.points), whose form fields produce a well-formed dict and surface validation errors inline.
Example fix
# before
$ ./bin/config set maniphest.points true
# after
$ ./bin/config set maniphest.points '{"enabled": true}' Defensive patterns
Strategy: validation
Validate before calling
function is_valid_points_config($config) {
if (!is_array($config)) return false;
foreach ($config as $k => $v) {
if (!in_array($k, array('enabled', 'label', 'action'), true)) return false;
}
if (isset($config['enabled']) && !is_bool($config['enabled'])) return false;
if (isset($config['label']) && !is_string($config['label'])) return false;
if (isset($config['action']) && !is_string($config['action'])) return false;
return true;
} Type guard
function is_points_config($c) { return is_array($c); } Prevention
- Always write maniphest.points as a JSON object, never a bare scalar.
- Apply config on a test instance (or via the web Config UI) before production.
- Keep only the three documented keys: enabled, label, action.
When it happens
Trigger: Setting maniphest.points to a scalar via bin/config (e.g. `bin/config set maniphest.points true` or a JSON string that decodes to a non-map such as '[1,2]'). The validation callback runs during the config write and throws before the value is stored.
Common situations: Admins enabling story points quickly from the CLI assume a boolean flag ('maniphest.points true') instead of a dict. Others paste a YAML/JSON fragment where the top level is a list or a quoted string, or a trailing comma turns the JSON into something that decodes to a scalar.
Related errors
- Configuration is not valid. Maniphest priority configuration
- Value for key "%s" should be a dictionary.
- Value for key "%s" should be a dictionary.
- Key "%s" is not a valid priority constant. Priority constant
- Key "%s" is not a valid priority keyword. Priority keywords
AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21).
Data as JSON: /api/errors/f32db0a04285cadd.
Report an issue: GitHub.