### Body

Currently `start_date` is mandatory parameter.
For DAGs with `schedule=None` we can relax this requirement as no scheduling calculation needed so the `start_date` parameter isn't used.

### Committer

- [X] I acknowledge that I am a maintainer/committer of the Apache Airflow project.
return (
            f"<DagRun {self.dag_id} @ {self.execution_date}: {self.run_id}, state:{self.state}, "
            f"queued_at: {self.queued_at}. externally triggered: {self.external_trigger}>"
        )
    @validates("run_id")
    def validate_run_id(self, key: str, run_id: str) -> str | None:
        if not run_id:
            return None
        regex = airflow_conf.get("scheduler", "allowed_run_id_pattern")
        if not re2.match(regex, run_id) and not re2.match(RUN_ID_REGEX, run_id):
            raise ValueError(
                f"The run_id provided '{run_id}' does not match the pattern '{regex}' or '{RUN_ID_REGEX}'"
            )
        return run_id
    def get_conf(self):
        return self._conf
    def set_conf(self, value):
        self._conf = ConfDict(value)
    @declared_attr
    def conf(self):
        return synonym("_conf", descriptor=property(self.get_conf, self.set_conf))
    @property
    def stats_tags(self) -> dict[str, str]:
        return prune_dict({"dag_id": self.dag_id, "run_type": self.run_type})
    @property
    def logical_date(self) -> datetime: