Check a couple properties, we have had this issue.
For the component that should fail the job, look at
FailPackageOnfailure (set to TRUE)
FailParentOnFailure (set to true)
MaximumErrorCount (set to 1)
I learned the hard way that these properties need to be used together. If the top 2 are false and max error is > 0, failures can occur and not fail the job.
In attempting to clone another's work, be sure to check out contraints between components and that you have all the variables they had onboard, and configs.
I often use simple validation in an Execute SQL task and fail the job depending on what happens there, and send myself "fail mail" so I know what happened. I simply set a variable to some failure value in the component and let the constraint fail the job for me vs moving to next step.