2. Interrupt routines. The program flow will rely on interrupts to time the triggering of code blocks at known time intervals. The “main” function will setup the µC and enable the required interrupts.
So, apart from the setup stuff you mentioned, your main only contains an empty while loop?
As each conversion ends the end of conversion interrupt will fire and the value in the ADC result register will be put into the current location in an array.
Is this something you programmed it that way or is this a library function, you are using?
For as long as the array location used is not the last location the ADC will be restarted, and the array location incremented before exiting the routine. Once the array is full the ADC will no longer be started.
The ADC must be first started externally with the array location reset to “0” and the desired channel selected. To check if the array is full and ready to read a new set of values from, test the current array location in use.
What's the reason behind this?
Limiting memory Usage? Only having a limited amount of data per cycle (cycle here meaning the time between your timer interrupts)? Averaging of a fixed number of data point? Something different?
2.2 The core program functions will be carried out in a timer interrupt routine. Timer 1 is 16 bits and allows for significant time lapses between calls that will allow sufficient time for the entire routine to be serviced before it is time to be called again. A prescaler of 8 will be used giving a resolution of 1µs. The top count will be 8000 giving an interval of 8ms.
Sounds perfectly alright to me.

3. Tasks and features of the main schedule.
3.1 tasks_calls: this is a 32 bit variable that will increment every time the main tasks are called by a counter overflow interrupt. It will be a measure in units of 8ms of the time since starting the program.
Is this simply for measuring how long your uC has been running for or do you need this for something else too?
Except for the part with the arrays which, depending on why it is implemented in that way, might be done in another fashion, the structure of your program seems very reasonable.
So I have a variable that needs to be used in two different files, I can't keep the compiler happy. Where should I put this variable, neither of the files is main.
In my experience, the way to get nice, clean code is passing those variable/values. This is the territory where you most likely will encounter pointers and the difference between call-by-value(passing an actual value itself) and call-by-reference(passing a pointer to said value). Please let me know if you need more explanations about this.
a small reminder and clear syntax examples just make life a little easier. one character wrong and all sorts of errors come up in compilation. I am not a machine reading the book I am a human, one that likely has ADHD and coding scares the shit out of me.
I can sympathise with that. For me it's hardware that I'm for some reason really afraid of. As soon as it involves hardware, it's a real struggle for me to even start a project.