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

  1. Set a dict: `bin/config set maniphest.points '{"enabled": true}'`.
  2. Optionally customize labels with the allowed keys only: {"enabled": true, "label": "Points", "action": "Change Points"}.
  3. 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

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


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/f32db0a04285cadd. Report an issue: GitHub.