{"record":{"id":"e1bc6234feb262a6","repo":"xai-org/x-algorithm","slug":"never-heard-of-c-before-is-this-a-new-model-vers","errorCode":null,"errorMessage":"Never heard of $c before! Is this a new model version?","messagePattern":"Never heard of \\$c before! Is this a new model version\\?","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"simclusters/simclusters_v2/summingbird/stores/UserKnownForReadableStore.scala","lineNumber":73,"sourceCode":"\ncase class Query(userId: Long, modelVersion: ModelVersion = ModelVersion.Model20m145kUpdated)\n\ncase class UserKnownForReadableStore(\n  knownForStoreDec11: ReadableStore[Long, ClustersUserIsKnownFor],\n  knownForStoreUpdated: ReadableStore[Long, ClustersUserIsKnownFor],\n  knownForStore2020: ReadableStore[Long, ClustersUserIsKnownFor])\n    extends ReadableStore[Query, ClustersUserIsKnownFor] {\n\n  override def get(query: Query): Future[Option[ClustersUserIsKnownFor]] = {\n    query.modelVersion match {\n      case ModelVersion.Model20m145kDec11 =>\n        knownForStoreDec11.get(query.userId)\n      case ModelVersion.Model20m145kUpdated =>\n        knownForStoreUpdated.get(query.userId)\n      case ModelVersion.Model20m145k2020 =>\n        knownForStore2020.get(query.userId)\n      case c =>\n        throw new IllegalArgumentException(\n          s\"Never heard of $c before! Is this a new model version?\")\n    }\n  }\n}\n","sourceCodeStart":55,"sourceCodeEnd":78,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/simclusters/simclusters_v2/summingbird/stores/UserKnownForReadableStore.scala#L55-L78","documentation":"UserKnownForReadableStore.get dispatches on the ModelVersion enum and this is the catch-all branch: any ModelVersion constant not explicitly cased (Dec11, Updated, 2020) reaches `case c` and throws. It guards against serving known-for data for an unimplemented model version.","triggerScenarios":"Calling UserKnownForReadableStore.get with a query whose modelVersion is a newly added enum constant (anything other than Model20m145kDec11, Model20m145kUpdated, Model20m145k2020), or a version introduced by a newer simclusters release.","commonSituations":"Adding a new ModelVersion to the shared enum without extending this store's match; cross-team enum extension where serving code lags; deserializing a request containing a version constant that this build does not know.","solutions":["Use one of the explicitly handled versions (Dec11, Updated, 2020)","Add a case for the new ModelVersion constant backed by an appropriate knownFor store and rebuild","Check the ModelVersion enum in your classpath versus the version that produced the request","Guard at the API boundary: reject requests with unhandled model versions before they reach this store"],"exampleFix":"// before\ncase ModelVersion.Model20m145k2020 => knownForStore2020.get(query.userId)\ncase c => throw new IllegalArgumentException(s\"Never heard of $c before!\")\n// after\ncase ModelVersion.Model20m145k2020 => knownForStore2020.get(query.userId)\ncase ModelVersion.Model44m25k => knownForStore44m.get(query.userId)","handlingStrategy":"validation","validationCode":"val handled = Set(ModelVersion.Model20m145kDec11, ModelVersion.Model20m145kUpdated, ModelVersion.Model20m145k2020)\nrequire(handled.contains(query.modelVersion))","typeGuard":"def isServedVersion(v: ModelVersion): Boolean = v match {\n  case ModelVersion.Model20m145kDec11 | ModelVersion.Model20m145kUpdated | ModelVersion.Model20m145k2020 => true\n  case _ => false\n}","tryCatchPattern":"try { store.get(query) } catch { case e: IllegalArgumentException if e.getMessage.contains(\"new model version\") => Future.None }","preventionTips":["Compile with -Xlint to warn on non-exhaustive matches","Add exhaustive-match tests over ModelVersion.values","Version-lock clients and servers on the simclusters release"],"tags":["scala","simclusters","model-version","pattern-match"],"backgroundTag":"unsupported-model-version","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}