{"record":{"id":"09b212473987aab0","repo":"ddollar/foreman","slug":"must-use-a-subclass-of-foreman-engine","errorCode":null,"errorMessage":"must use a subclass of Foreman::Engine","messagePattern":"must use a subclass of Foreman::Engine","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"lib/foreman/engine.rb","lineNumber":297,"sourceCode":"  # Get the base port for this foreman instance\n  #\n  # @returns [Fixnum] port  The base port\n  #\n  def base_port\n    (options[:port] || env[\"PORT\"] || ENV[\"PORT\"] || 5000).to_i\n  end\n\n  # deprecated\n  def environment\n    env\n  end\n\nprivate\n\n### Engine API ######################################################\n\n  def startup\n    raise TypeError, \"must use a subclass of Foreman::Engine\"\n  end\n\n  def output(name, data)\n    raise TypeError, \"must use a subclass of Foreman::Engine\"\n  end\n\n  def shutdown\n    raise TypeError, \"must use a subclass of Foreman::Engine\"\n  end\n\n## Helpers ##########################################################\n\n  def create_pipe\n    IO.method(:pipe).arity.zero? ? IO.pipe : IO.pipe(\"BINARY\")\n  end\n\n  def name_for(pid)\n    process, index = @running[pid]","sourceCodeStart":279,"sourceCodeEnd":315,"githubUrl":"https://github.com/ddollar/foreman/blob/f65ddba83932bd4670e014389d6e27ea1e20b469/lib/foreman/engine.rb#L279-L315","documentation":"Error \"must use a subclass of Foreman::Engine\" thrown in ddollar/foreman.","triggerScenarios":"Thrown at lib/foreman/engine.rb:297 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f65ddba83932bd4670e014389d6e27ea1e20b469","analyzedAt":"2026-08-21T19:15:07.709Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}