If you have realized this and no one has it, and you want the project to be successful, then you need to add a few extra hours and make a plan, and then sell it to the people who are nominally responsible for making decisions.
Real projects have "reboots." This does not mean that you are throwing away all your existing work. This means that you will find a new shell to match the details of this work. It is much simpler if your work - so far away - consists of well-understood self-consistent small components that are loosely coupled to each other. This is why people work this way because they know from experience that they will have to redo things. Almost all of the features added to programming languages over the decades are explained by the fact that we know that every piece of code that we write can be changed - it can survive, but you will probably have to deal with many unfamiliar travel environments on vacation.
So, you noticed that relevant information constantly appears throughout the project. This is not convenient if you are showing everything in one package right before you start entering the code. Writing a specification document does not solve this problem at all. Therefore, you need to change the way you work so that the project draws new information all the time - new new information from the outside is the food that moves your project forward. Try to look forward to each new amazing revelation and greet him as a friend!
What does it mean? This means that the "architectural" parts of the project are no more stable than the "small details". You should be able to change the architecture. You do not have enough information at the beginning to make a permanent decision about something.
The main problem may be the fact that you have a project for eight months. Real eight-month projects (those that succeed on time) are actually, if you look closely, many shorter projects: 16 two-week projects are ideal.
You need to put all the goals of the project (for now) in a large list in order of priority. Write each function requirement from the user's point of view. "The user must be able to blah blah blah," this kind of thing. Avoid talking about the technical problems of current design. Think about how the user will deal with the lack of a product (or what they are currently using), and talk about how their experience will be improved using a specific function.
The order of priorities is important. The goal is to be able to say: we only have time to send the first 10 items. This is better than 9 items, which in turn is better than 8, etc. But even with 8 elements, this would be better than nothing, because each element is a function that in itself will improve the user experience.
The list is called backlog.
If you compare your work with the lag, you will usually find that you are working on low-priority things because you think you will need this later. Try not to do this from now on. Low priority - low priority. What should I do if new requests with a higher priority appear between the date of sending and sending? They will almost certainly be! Although some people will demand (“It would be completely useless without function A!”), You could probably supply neither function A nor function B. But if you had to choose one, you would go with function A. And you may well need to send without function B due to lack of time. Therefore, do not compromise A in order to be “ready” for adding B later. Only prepare in advance if it will cost you practically nothing - leave the places where you can add things, make everything possible, but not if it slows you down now.
Then start work on a new version of the product (forbid work done so far where it makes sense), which takes care of the first elements of the list - the minimum minimum. Do not spend more than a week on this. A week is 6.25% of the remaining time, so in fact it is quite expensive. But at the end of this, you have an idea that you are ready to send so far. This is the only way to measure your progress from now on.
The rest of your project consists of:
Repeatedly rolls out new working versions of the product, each time adding a few more functions from the priority list. Get a small community of users to work with each version and give direct feedback to your team. Strive to make a new version every two weeks.
Inclusion of user reviews in new "stories" for the transition "to the backlog." This, of course, is related to their priority.
You do this over and over, in short iterations, until you run out of time (you probably have time to do six to eight iterations). At the end of each iteration, you have something for delivery that is “better” (has higher priority functions, contains more reviews) than what you had at the end of the previous iteration. This is progress.
Each issue at the end of the iteration has two goals: to show progress and, of course, to make the user community a little happier, but also to get more feedback in order to find out new information. Each version is a solution and a probe. This dual character continues after the first public release. A public release is a deep space probe that you send to the solar system to send photos of strange new worlds (as traces of an exception stack).
All this is scientific and rational. You make decisions about how to work based on priority. You get constant feedback based on the working version of your product, rather than guessing the feedback you received from an imaginary version of your product.
People will respond to this approach, saying that it will be terribly "ineffective." Efficiency is a relative term. Projects that don't work this way always end up that way, after all. But "at the end" is very late. There is usually a crazy panic for an additional N months after the initial deadline, when the project continues to reproduce repetitive versions of the product that are all “almost right” or “almost done”, in a crazy self-deceived parody of iterative development.
Fortunately, you can start thinking and working this way at any time. It is better to start halfway to the original date than soon after.