Start with the problem you are solving, not a list of screens. Which people will use the system, how often, and how is the job done today? An experienced team who grasps the purpose will suggest a simpler way to reach it; someone handed only a feature list prices your assumptions along with the work.
Define what is included as concrete flows: who does what, and what happens next. Just as important, state explicitly what you are not building. A written out-of-scope list prevents more argument later than any other single page. Also mark which items are decided and which are still open — honest teams price those differently, and concealing the open questions helps no one.
Write down the hard constraints. This means the platforms and services involved, the data you already hold and its condition, security and compliance rules, user volumes, supported browsers or devices and infrastructure that is already decided. If a deadline is real, say what depends on it: a hire dedicated team will often resequence the work to meet it, but not if the date is a secret.
Write down what the word done means for php vs java spring the important items. Testable acceptance criteria need not use formal language: a short list stating what a user should be able to do is sufficient. This single habit compresses acceptance testing by a surprising margin and eliminates the most common source of disputes.
Finally, say what you expect back. Request a breakdown by feature or ai assisted software development module, the assumptions used, the main risks and a low number and a high number. Take a broad range as useful information rather than evasion: it tells you the part of the brief that needs work. From there clarify that area and request a revised number — the second estimate is much more reliable.