Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Local evaluation buckets percentage splits with the server key, so results differ from Flagsmith

Abierto Apto para principiantes
#109 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
75/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
ruby
Área
backend

Línea de trabajo

Empieza con Client#get_identity_model en lib/flagsmith.rb, especialmente con la construcción de la clave compuesta enlazada en el issue, y sigue cómo se hace disponible la clave API del entorno en la evaluación local. Compara la clave resultante con la expectativa client_key_account_two de la reproducción. Actualiza las pruebas específicas para la evaluación local de Percentage Splits y ejecútalas; el trabajo está hecho cuando el SDK coincide con el resultado del split del dashboard.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

In local evaluation mode, the client builds the identity's composite key from the environment_key it was configured with:

https://github.com/Flagsmith/flagsmith-ruby-client/blob/f92f66df821b8a21565a412d5c2331c62e364b24/lib/flagsmith.rb#L343-L345

Local evaluation requires a server-side key, so environment_key is always ser.…. The composite key ends up as ser.<env key>_<identifier>, and that's what PERCENTAGE_SPLIT conditions hash, together with the segment ID.

Flagsmith itself appears to hash splits with the environment's client-side key, the api_key field of the environment document, giving <env key>_<identifier>. The two keys produce different percentages, so the SDK puts a different set of identities in every partial percentage split than the Flagsmith dashboard shows for the same identity and traits.

We found this when an identity that the dashboard showed in a 5% split segment evaluated as outside it in our app. Hashing <env key>_<identifier> gave 1.36 (in the percentage-based segment). Hashing ser.<env key>_<identifier>, what the SDK uses, gave 5.23 (outside the segment).

Reproduction
require "flagsmith"

document = {
  id: 1,
  api_key: "client_key",
  project: {
    id: 1, name: "Project", hide_disabled_flags: false,
    organisation: {id: 1, name: "Org", feature_analytics: false, stop_serving_flags: false, persist_trait_data: true},
    segments: [{
      id: 1, name: "60% rollout",
      rules: [{type: "ALL", rules: [], conditions: [{operator: "PERCENTAGE_SPLIT", value: "60", property_: "$.identity.key"}]}],
      feature_states: [{django_id: 2, featurestate_uuid: "segment-state", enabled: true, feature_state_value: nil,
                        feature: {id: 1, name: "rollout", type: "STANDARD"}, multivariate_feature_state_values: []}]
    }]
  },
  feature_states: [{django_id: 1, featurestate_uuid: "default-state", enabled: false, feature_state_value: nil,
                    feature: {id: 1, name: "rollout", type: "STANDARD"}, multivariate_feature_state_values: []}],
  identity_overrides: []
}

environment = Flagsmith::Engine::Environment.build(document)
handler = Object.new
handler.define_singleton_method(:environment) { environment }

client = Flagsmith::Client.new(
  environment_key: "ser.server_key",
  offline_mode: true,
  offline_handler: handler,
  enable_local_evaluation: true
)

client.get_identity_flags("account_two").is_feature_enabled("rollout")
# => false. Hashing "client_key_account_two" gives 57.05, which is inside the 60% split;
#    the SDK hashes "ser.server_key_account_two", which gives 62.53.
Expected

The SDK should match the dashboard and the other evaluation paths by building the composite key from environment.api_key.

Affected versions

4.1.1 and 4.3.0 (latest on RubyGems). It's also present in v5.0.0 and on main. In v5, Mappers::Identity.build_environment_context sets key: identity.composite_key, so the correct fallback in Segments::Evaluator.get_enriched_context, which builds "#{context[:environment][:key]}_#{identifier}" from the environment's api_key, never runs.

Suggested fix

In Client#get_identity_model, pass environment_api_key: environment.api_key instead of environment_key. We're running that change as a monkeypatch.

Lenguaje dominante
Ruby
Estrellas
12
Forks
6
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Flagsmith/flagsmith-ruby-client

Todos los issues de Flagsmith/flagsmith-ruby-client

Issues similares

Más issues de Ruby

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.