{"record":{"id":"bf397c3ba40f5a51","repo":"xai-org/x-algorithm","slug":"must-read-at-least-some-data","errorCode":null,"errorMessage":"Must read at least some data!","messagePattern":"Must read at least some data!","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"simclusters/simclusters_v2/scalding/evaluation/EvaluationReferenceDataExtraction.scala","lineNumber":93,"sourceCode":"  }\n}\n\nobject AdhocTimelinesDataExtraction extends TwitterExecutionApp {\n\n  @Override\n  def job: Execution[Unit] = {\n    Execution.withArgs { args =>\n      implicit val dateRange: DateRange =\n        DateRange.parse(args.list(\"date\"))(DateOps.UTC, DateParser.default)\n\n      val outputDir = args(\"output_dir\")\n      val readRecTweet = args.boolean(\"rectweet\")\n      val readRecap = args.boolean(\"recap\")\n      val sampleRate = args.double(\"sample_rate\")\n      val useTsv = args.boolean(\"output_tsv\")\n\n      if (!readRecTweet && !readRecap) {\n        throw new IllegalArgumentException(\"Must read at least some data!\")\n      }\n      val recTweets = if (readRecTweet) {\n        println(\"RecTweets are included in the dataset\")\n        TimelinesEngagementDataExtractor.readTimelinesRecTweets(\n          recTweets =\n            DailySuffixFeatureSource(TimelinesEngagementDataExtractor.RecTweetHdfsPath).read,\n          sampleRate = sampleRate)(dateRange)\n      } else {\n        TypedPipe.empty\n      }\n\n      val recaps = if (readRecap) {\n        println(\"Recaps are included in the dataset\")\n        TimelinesEngagementDataExtractor.readTimelinesRecapTweets(\n          recapTweets =\n            DailySuffixFeatureSource(TimelinesEngagementDataExtractor.RecapTweetHdfsPath).read,\n          sampleRate = sampleRate\n        )(dateRange)","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/simclusters/simclusters_v2/scalding/evaluation/EvaluationReferenceDataExtraction.scala#L75-L111","documentation":"EvaluationReferenceDataExtraction requires at least one of the --rectweet or --recap boolean flags to be true; both default to false, and reading nothing would produce an empty dataset, so the job throws immediately at argument validation.","triggerScenarios":"Running the job with neither --rectweet true nor --recap true set (they are not defaulting to true via args.boolean).","commonSituations":"Ad-hoc runs copying a minimal arg set; a scheduler template that omits both flags; renaming of the flags between versions.","solutions":["Add --rectweet true (or --recap true, or both) to the job arguments","If you need only one dataset, set exactly one flag and the corresponding reader will run","Add a usage/help check in the job wrapper that prints required flags before submission"],"exampleFix":"// before\nval readRecTweet = args.boolean(\"rectweet\")\nval readRecap = args.boolean(\"recap\")\nif (!readRecTweet && !readRecap) {\n  throw new IllegalArgumentException(\"Must read at least some data!\")\n}\n\n// after (default rectweet to true when neither is specified)\nval readRecTweet = args.boolean(\"rectweet\", default = true)\nval readRecap = args.boolean(\"recap\")\nif (!readRecTweet && !readRecap) {\n  throw new IllegalArgumentException(\"Must read at least some data!\")\n}","handlingStrategy":"validation","validationCode":"require(args.boolean(\"rectweet\") || args.boolean(\"recap\"),\n  \"At least one of --rectweet or --recap must be true\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set --rectweet true and/or --recap true in launch configs","Add a usage banner listing required flags on failure"],"tags":["scala","scalding","cli-args","validation","evaluation"],"backgroundTag":"missing-required-flag","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}