I would use a bpm on Quote.GetNewQuoteDtl to handle both of those. The first step would be a condition to check for the existence of a ProjectID on the QuoteHed, and if it’s there assign that ProjectID to the new QuoteDtl line.
Throw a message on the false side of the condition to tell the user that they need to add a ProjectID.
Be sure to use the Raise Exception on the false side so it stops the method and doesn’t create the line.
Thinking this through more you’ll also have to use 2 BPMs, this one as a pre-processing, then on the true side of your condition Enable Post Directive and assign your project ID to a CallContextBPMData field. Then create a post-processing bpm to pull the projectID from the CallContextBPMData field and assign it to QuoteDtl.ProjectID.