protected function didApplyHeraldRules(PhabricatorLiskDAO $object, HeraldAdapter $adapter, HeraldTranscript $transcript)
 {
     // TODO: Convert these to transactions. The way Maniphest deals with these
     // transactions is currently unconventional and messy.
     $save_again = false;
     $cc_phids = $adapter->getCcPHIDs();
     if ($cc_phids) {
         $existing_cc = $object->getCCPHIDs();
         $new_cc = array_unique(array_merge($cc_phids, $existing_cc));
         $object->setCCPHIDs($new_cc);
         $object->save();
     }
     $this->heraldEmailPHIDs = $adapter->getEmailPHIDs();
     $xactions = array();
     $assign_phid = $adapter->getAssignPHID();
     if ($assign_phid) {
         $xactions[] = id(new ManiphestTransaction())->setTransactionType(ManiphestTransaction::TYPE_OWNER)->setNewValue($assign_phid);
     }
     $project_phids = $adapter->getProjectPHIDs();
     if ($project_phids) {
         $project_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new ManiphestTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $project_type)->setNewValue(array('+' => array_fuse($project_phids)));
     }
     return $xactions;
 }