diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000..e9477b8 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "fake-cli": { + "version": "6.1.4", + "commands": [ + "fake" + ] + }, + "paket": { + "version": "10.3.1", + "commands": [ + "paket" + ] + }, + "dotnet-fsharplint": { + "version": "0.26.10", + "commands": [ + "dotnet-fsharplint" + ] + } + } +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..cc522f0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Paket dependency manager +.paket/ +packages/ +paket-files/ + +# Ionide +.ionide/ + +# FAKE - F# Make +.fake/ + +# Released +release/*.nupkg diff --git a/.github/skills/proto/SKILL.md b/.github/skills/proto/SKILL.md new file mode 100644 index 0000000..39fc64b --- /dev/null +++ b/.github/skills/proto/SKILL.md @@ -0,0 +1,131 @@ +--- +name: proto +description: "Use when authoring or editing Protocol Buffer (.proto) files for gRPC service contracts that use the Feather core types and conventions." +--- + +# Protocol Buffers / gRPC Skill + +Conventions for writing `.proto` gRPC service contracts that interoperate with +`Feather.Grpc` and the shared core types from +[grpc.contract.core](https://github.com/FeatherTools/grpc.contract.core) +(`Spot`, `Error`, `Timestamp`, `CorrelationId`, `Instance`, `Box`, +`SerializedForChunking`, …). + +## File Structure + +``` +proto/ + / # one folder per system (camelCase) + .proto # one file per logical service/feature +``` + +Group `.proto` files by system, one file per logical service or feature. Reference the +shared core types from `grpc.contract.core` rather than redefining them. + +--- + +## File Header Template + +```protobuf +syntax = "proto3"; + +package ; // snake_case, matches folder name + +import "feather/core.proto"; +// add other imports as needed + +option csharp_namespace = ""; // PascalCase +``` + +Add `option php_namespace`, `go_package`, etc. for whichever languages you generate. + +--- + +## Naming Conventions + +- Message names: `PascalCase` +- Request messages: `Request` +- Response messages: `Response` +- Field names: `snake_case` +- Enum values: `UPPER_SNAKE_CASE` +- Service names: `Service` (or ``) + +--- + +## Standard Response Pattern + +**All responses use `oneof result { Success / Error }`:** + +```protobuf +message Response { + oneof result { + Success success = 1; + feather.Error error = 2; + } + + message Success { + = 1; + } +} +``` + +Never return bare fields at the top level of a response — always wrap them in the +`oneof result` pattern. On the F# side this maps cleanly onto +`HighLevel.Response.handle`, which produces either a `Success` or an `Error` response. + +--- + +## Service Definition + +```protobuf +service Service { + rpc (Request) returns (Response); +} +``` + +--- + +## Streaming Large Payloads + +For large or compressible payloads, stream `feather.SerializedForChunking` chunks +instead of a single message. The sender serializes and chunks the payload; the receiver +reassembles it. On the F# side this is handled by `SerializedForChunking` (plain, gzip, +raw bytes or text) — see the `Feather.Grpc` README. + +```protobuf +message SendDocumentRequest { + feather.SerializedForChunking chunk = 1; +} + +service DocumentService { + rpc SendDocument (stream SendDocumentRequest) returns (SendDocumentResponse); +} +``` + +--- + +## Security Rules in Proto + +- Do not put personal or sensitive data as plain fields — carry it as opaque `bytes` + (e.g. an encrypted envelope) and decrypt at the domain boundary. +- Auth/identity info (tokens, JWTs) is extracted by server interceptors — do NOT include + them in request messages. Add a comment `// Extracted from JWT by auth interceptor` + where relevant. + +--- + +## What does NOT belong in proto files + +Proto files represent gRPC service contracts only — request/response messages and +service definitions. Domain-internal concerns (events, stream carriers, background +messages such as `*Event` / `*Stream`) must never be added to `.proto` files, even when +they reference types that do have proto equivalents. + +--- + +## Workflow: Adding a new RPC method + +1. Add `Request` and `Response` messages (Response uses the `oneof result` pattern). +2. Add the `rpc` entry to the `service` block. +3. Regenerate stubs for your target languages. +4. Lint the proto (e.g. `protolint`) to verify formatting. diff --git a/.github/workflows/pr-check.yaml b/.github/workflows/pr-check.yaml new file mode 100644 index 0000000..294c6dd --- /dev/null +++ b/.github/workflows/pr-check.yaml @@ -0,0 +1,24 @@ +name: Pull request check + +on: [pull_request] + +jobs: + block-fixup-merge: + runs-on: ubuntu-latest + name: Block fixup commits + + steps: + - uses: actions/checkout@v6 + + - name: Block fixup commit merge + uses: 13rac1/block-fixup-merge-action@v2.0.0 + + shellcheck: # https://github.com/marketplace/actions/shellcheck + name: Shellcheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Run ShellCheck + uses: ludeeus/action-shellcheck@master + env: + SHELLCHECK_OPTS: -e SC1090 diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..58eb2d7 --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,27 @@ +name: Publish + +on: + push: + tags: + - '[0-9]+\.[0-9]+\.[0-9]+' + +jobs: + publish: + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - uses: actions/checkout@v6 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.x + + - name: Publish to NuGet.org + env: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + DOTNET_ROLL_FORWARD: latestMajor + run: ./build.sh -t publish no-lint diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..ca3a2b9 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,31 @@ +name: Tests + +on: + #push: + pull_request: + schedule: + - cron: '0 3 * * *' + +jobs: + tests: + strategy: + matrix: + os: + - name: ubuntu-latest + run: ./build.sh + runs-on: ${{ matrix.os.name }} + + steps: + - uses: actions/checkout@v6 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v5 + with: + dotnet-version: 10.x + + - name: Run tests + env: + PRIVATE_FEED_USER: ${{ github.repository_owner }} + PRIVATE_FEED_PASS: ${{ secrets.GITHUB_TOKEN }} + DOTNET_ROLL_FORWARD: latestMajor + run: ${{ matrix.os.run }} -t tests no-lint # temporary no-lint to unblock CI diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43851c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +AssemblyInfo.fs + +# Paket dependency manager +.paket/ +packages/ +paket-files/ + +# Ionide +.ionide/ + +# FAKE - F# Make +.fake/ + +# Released +release/*.nupkg diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..29d9469 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,71 @@ +# AGENTS.md + +Guidance for AI coding agents working in this repository. + +## What this is + +`Feather.Grpc` is an F# library published to NuGet (`Feather.Grpc`) providing low- and +high-level helpers for building gRPC clients and servers. It targets **.NET 10** and +sits on top of `Grpc.Net.Client` / `Grpc.Core.Api`. + +The code was extracted from a larger internal service and is now a standalone public +package. It is opinionated toward the `Feather.*` / `Alma.*` ecosystem (contracts, +error handling, cryptography, service identification). + +## Layout + +Everything compiles from `Grpc.fsproj`; compile order matters in F#, so keep the +`` order in the `.fsproj` consistent with dependencies between files. + +- `src/Utils.fs` — internal helpers (`Guid`, `DateTimeOffset`, `Gzip`, `Async`). +- `src/Grpc.fs` — low-level channel creation and `AsyncSeq` ⟷ gRPC stream conversions. +- `src/Error.fs` — `ContractError`, `GrpcError`, and computation-expression extensions. +- `src/CoreTypes.fs` — domain types and contract conversions (`Timestamp`, `CorrelationId`, `Spot`, `Instance`, `Box`). +- `src/Auth.fs` — `AuthInterceptor` / `AsyncAuthInterceptor` for server-side auth. +- `src/Metrics.fs` — `GrpcMetrics` error counters. +- `src/Serialization.fs` — `SerializedForChunking`: serialize + chunk large payloads for streaming (plain, gzip, raw parts, text). +- `src/HighLevel.fs` — high-level `Read` / `Send` / `Duplex` / `Response` orchestration built on the modules above. +- `tests/` — Expecto test suite mirroring the module structure. + +## Build & test + +Use the build script (restores tools + Paket, then runs the FAKE targets): + +```bash +./build.sh build # build the library +./build.sh -t tests # run the Expecto test suite +``` + +Dependencies are managed with **Paket**, not raw `PackageReference`. To change +dependencies edit `paket.dependencies` + `paket.references`, then let the build +script restore. Do not hand-edit lock files. + +## Conventions + +- **No abbreviations** in code or domain names. Use `Language`, not `Lang`; `Latitude`, + not `Lat`. The only exception is the proper name of an adopted standard, which is + written FULLY UPPERCASE (e.g. `JWT`, `GERSId`). +- Prefer established open standards for data representation (ISO 8601 for time, etc.) + so data migrates between tools without translation. +- Follow the existing functional style: `Result` / `AsyncResult` for errors, + `[]` modules, `AsyncSeq` for streaming. Avoid exceptions for + control flow — convert to `GrpcError` / `ContractError` at boundaries. +- Keep the contract boundary explicit: `ofContract` / `asContract` pairs convert between + `Feather.Contracts.*` proto types and domain types. +- Lint config lives in `fsharplint.json`. + +## Release + +Releasing is manual (see `README.md`): + +1. Bump `` in `Grpc.fsproj`. +2. Add an entry to `CHANGELOG.md` (there is always an `Unreleased` section at the top; + use `Add` / `Changed` / `Fix` / `Removed` subsections). Mark breaking changes with `[**BC**]`. +3. Commit the new version and tag it. + +## When editing + +- Read the target file and its neighbours first; F# is order-sensitive. +- Add or update tests in `tests/` alongside behavioural changes. +- Only make the change requested — no unsolicited refactors or extra files. +- Do not add a `.gitignore` or other scaffolding unless explicitly asked. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f426b49 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + + +## Unreleased + +## 0.0.0 - +- Initial implementation diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..4930490 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +See [AGENTS.md](./AGENTS.md) for repository guidance, build/test commands, layout, and conventions. diff --git a/Grpc.fsproj b/Grpc.fsproj new file mode 100644 index 0000000..401d9a6 --- /dev/null +++ b/Grpc.fsproj @@ -0,0 +1,40 @@ + + + + + net10.0 + Library + Feather.Grpc + 0.0.0 + FeatherTools + Library with low and high level helpers for gRPC. + MIT + https://github.com/FeatherTools/grpc + https://github.com/FeatherTools/grpc.git + git + fsharp;grpc;encoding;serialization + README.md + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..077172e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Feather + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a2b01e8 --- /dev/null +++ b/README.md @@ -0,0 +1,235 @@ +# FeatherTools Logo gRPC + +[![NuGet](https://img.shields.io/nuget/v/Feather.Grpc.svg)](https://www.nuget.org/packages/Feather.Grpc) +[![NuGet Downloads](https://img.shields.io/nuget/dt/Feather.Grpc.svg)](https://www.nuget.org/packages/Feather.Grpc) +[![Checks](https://github.com/FeatherTools/grpc/actions/workflows/tests.yaml/badge.svg)](https://github.com/FeatherTools/grpc/actions/workflows/tests.yaml) + +> Library with low and high level helpers for gRPC. + +## Install + +```sh +paket add Feather.Grpc +``` + +The conversions in this library map to the shared core proto types from +[grpc.contract.core](https://github.com/FeatherTools/grpc.contract.core) +(`Timestamp`, `CorrelationId`, `Spot`, `Instance`, `Box`, `Error`, +`SerializedForChunking`, …). Reference these in your own `.proto` definitions so +messages interoperate across services and languages. + +> **Copilot skill**: this repo ships a `proto` skill at +> [.github/skills/proto/SKILL.md](.github/skills/proto/SKILL.md) with conventions for +> authoring `.proto` service contracts (naming, the `oneof result { Success / Error }` +> pattern, streaming) that align with `Feather.Grpc`. + +## Usage + +Low- and high-level helpers for building gRPC clients and servers in F#, with +streaming, chunking of large payloads, auth, error handling and metrics. + +### Creating a client (in k8s environment) + +Build a channel to a service instance and wrap it in the generated client: + +```fsharp +open Feather.Grpc + +// Application startup +let connectCalculatorClient (environment: Map) (myService: string) = result { + let! myServiceInstance = myService |> instance environment // Result + + return myServiceInstance |> Grpc.k8sSvcChannel Grpc.Port |> Math.Calculator.CalculatorClient +} + +let! myServiceClient = "MY_SERVICE" |> connectCalculatorClient environment +``` + +### Unary calls + +`AsyncResult.ofAsyncUnaryResponse` turns a gRPC unary call into an `AsyncResult<'Response, GrpcError>`, +so it composes inside an `asyncResult { … }` block (see [Feather/Error Handling](https://github.com/FeatherTools/error-handling)). +Convert contract types at the boundary with `ofContract` / `asContract`. + +The example below is a `Calculator` service exposing a single `Divide` call. + +Proto definition — reuse the shared core types (`Spot`, `Error`) from +[grpc.contract.core](https://github.com/FeatherTools/grpc.contract.core): + +```proto +syntax = "proto3"; + +package calculator; +option csharp_namespace = "Math"; + +import "feather/core.proto"; + +message Input { int32 value = 1; } +message Output { int32 value = 1; } + +message DivideRequest { + Input base = 1; + Input divider = 2; +} + +message DivideResponse { + oneof result { + Success success = 1; + feather.core.Error error = 2; + } + + message Success { + Output output = 1; + } +} + +service Calculator { + rpc Divide (DivideRequest) returns (DivideResponse); +} +``` + +Domain library — the `ofContract` / `asContract` pairs convert between the generated +proto messages and your domain types: + +```fsharp +namespace Domain + +open Feather.Grpc + +type Input = Input of int +type Output = Output of int + +[] +module Input = + let ofContract (contract: Math.Input): Result = + // it could have some validation, ... + contract.Value |> Input |> Ok + + let asContract (Input value): Math.Input = + Math.Input(Value = value) + +[] +module Output = + let ofContract (contract: Math.Output): Result = + // it could have some validation, ... + contract.Value |> Output |> Ok + + let asContract (Output value): Math.Output = + Math.Output(Value = value) +``` + +Calculator Service implementation +```fsharp +open Feather.Grpc +open Feather.Grpc.Metrics + +// your app metrics, built once at startup via `GrpcMetrics.metrics currentInstance` +type AppMetrics = { + // ... app specific metrics ... + GrpcMetrics: GrpcMetrics +} + +type ApplicationDependencies = { + LoggerFactory: ILoggerFactory + Metrics: AppMetrics +} + +type CalculatorImplementation(app: ApplicationDependencies) = + inherit Calculator.CalculatorBase() + + override _.Divide (request: DivideRequest, context: ServerCallContext): Task = task { + let logger = app.LoggerFactory.CreateLogger("Divide") + + // pure operation, returning a success response or GrpcError + let operation request = asyncResult { + let! (Input value) = request.Base |> Input.ofContract |> Result.mapError GrpcError.ofContractError + let! (Input divider) = request.Divider |> Input.ofContract |> Result.mapError GrpcError.ofContractError + logger.LogDebug("Calculating: {value} / {divider}", value, divider) + + if divider = 0 then + // GrpcError is automatically bind to an Result.Error by predefined helper + return! GrpcError.create "DivisionByZero" (Some $"{value} / {divider}") + + let output = Output (value / divider) + + return DivideResponse.Types.Success( + Output = (output |> Output.asContract) + ) + } + + return! + request + |> operation + |> HighLevel.Response.handle app.Metrics.GrpcMetrics "Divide" logger None + (fun success -> DivideResponse(Success = success)) + (fun error -> DivideResponse(Error = error)) + } +``` + +Calling a service by its client +```fsharp +let example (myServiceClient: Calculator.CalculatorClient) (a: Domain.Input) (b: Domain.Input) = asyncResult { + let! (response: DivideResponse) = + myServiceClient.DivideAsync( + DivideRequest( + Base = Input.asContract a, + Divider = Input.asContract b + ) + ) + |> AsyncResult.ofAsyncUnaryResponse + + match response.ResultCase with + | DivideResponse.ResultOneofCase.Success -> + let! (Output value) = response.Success.Output |> Output.ofContract |> Result.mapError GrpcError.ofContractError + + return value + + | _ -> + return! response.Error |> GrpcError.ofContract // possibly division by zero +} +``` + +### Streaming large payloads + +`SerializedForChunking` serializes a DTO once and splits it into ~256 KB chunks so it +can be streamed over gRPC (plain, gzip, raw bytes or text): + +```fsharp +let ct = context.CancellationToken // core gRPC request context contains its cancellation, it should be used + +// server side: stream a value out +value +|> HighLevel.Send.ServerStream.gzipValue ct writer serialize chunkToRequest + +// client side: read the chunks back into a value +call +|> HighLevel.Read.Stream.Call.value ct handleResponse (SerializedForChunking.Dto.Gzip.fromChunks parse) +``` + +### Server auth interceptor + +```fsharp +let authenticate: AuthInterceptor = + fun context -> ... // Result + +let context = AuthInterceptor.validate authenticate serverCallContext +``` + +## Release +1. Increment version in `Grpc.fsproj` +2. Update `CHANGELOG.md` +3. Commit new version and tag it + +## Development +### Requirements +- [dotnet core](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial) + +### Build +```bash +./build.sh build +``` + +### Tests +```bash +./build.sh -t tests +``` diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..5685e28 --- /dev/null +++ b/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -eu +set -o pipefail + +dotnet tool restore +dotnet tool run paket restore + +# shellcheck disable=SC2068 +FAKE_DETAILED_ERRORS=true dotnet run --project ./build/build.fsproj -- $@ diff --git a/build/Build.fs b/build/Build.fs new file mode 100644 index 0000000..6f635db --- /dev/null +++ b/build/Build.fs @@ -0,0 +1,31 @@ +// ======================================================================================================== +// === F# / Project fake build ==================================================================== 1.7.0 = +// -------------------------------------------------------------------------------------------------------- +// Options: +// - no-clean - disables clean of dirs in the first step (required on CI) +// - no-lint - lint will be executed, but the result is not validated +// ======================================================================================================== + +open Fake.Core +open Fake.IO.FileSystemOperators +open Fake.IO.Globbing.Operators + +open ProjectBuild +open Utils + +[] +let main args = + args |> Args.init + + Targets.init { + Project = { + Name = "Feather.Grpc" + Summary = "Library with low and high level helpers for gRPC." + Git = Git.init () + } + Specs = + Spec.defaultLibrary + |> Spec.mapLibrary (fun library -> { library with NugetApi = NugetApi.KeyInEnvironment "NUGET_API_KEY" }) + } + + args |> Args.run diff --git a/build/SafeBuildHelpers.fs b/build/SafeBuildHelpers.fs new file mode 100644 index 0000000..37fa118 --- /dev/null +++ b/build/SafeBuildHelpers.fs @@ -0,0 +1,128 @@ +namespace ProjectBuild + +/// Helpers specific for SAFE stack application +module internal SafeBuildHelpers = + open Fake.Core + + let initializeContext () = + let execContext = Context.FakeExecutionContext.Create false "build.fsx" [ ] + Context.setExecutionContext (Context.RuntimeContext.Fake execContext) + + module Proc = + module Parallel = + open System + + let locker = obj () + + let colors = [| + ConsoleColor.Blue + ConsoleColor.Yellow + ConsoleColor.Magenta + ConsoleColor.Cyan + ConsoleColor.DarkBlue + ConsoleColor.DarkYellow + ConsoleColor.DarkMagenta + ConsoleColor.DarkCyan + |] + + let print color (colored: string) (line: string) = + lock locker (fun () -> + let currentColor = Console.ForegroundColor + Console.ForegroundColor <- color + Console.Write colored + Console.ForegroundColor <- currentColor + Console.WriteLine line + ) + + let onStdout index name (line: string) = + let color = colors[index % colors.Length] + + if isNull line then + print color $"{name}: --- END ---" "" + else if String.isNotNullOrEmpty line then + print color $"{name}: " line + + let onStderr name (line: string) = + let color = ConsoleColor.Red + + if isNull line |> not then + print color $"{name}: " line + + let redirect (index, (name, createProcess)) = + createProcess + |> CreateProcess.redirectOutputIfNotRedirected + |> CreateProcess.withOutputEvents (onStdout index name) (onStderr name) + + let printStarting indexed = + for (index, (name, c: CreateProcess<_>)) in indexed do + let color = colors[index % colors.Length] + let wd = c.WorkingDirectory |> Option.defaultValue "" + let exe = c.Command.Executable + let args = c.Command.Arguments.ToStartInfo + print color $"{name}: {wd}> {exe} {args}" "" + + let private restoreTerminalState () = + // Reset basic TTY state in case an interrupted child process leaves it broken. + try + use procHandle = + Diagnostics.Process.Start( + Diagnostics.ProcessStartInfo( + FileName = "stty", + Arguments = "sane", + UseShellExecute = false + ) + ) + + procHandle.WaitForExit(1000) |> ignore + with _ -> + () + + let run cs = + try + cs + |> Seq.toArray + |> Array.indexed + |> fun x -> + printStarting x + x + |> Array.map redirect + |> Array.Parallel.map Proc.run + finally + restoreTerminalState () + + let createProcess exe args dir = + // Use `fromRawCommand` rather than `fromRawCommandLine`, as its behaviour is less likely to be misunderstood. + // See https://github.com/SAFE-Stack/SAFE-template/issues/551. + CreateProcess.fromRawCommand exe args + |> CreateProcess.withWorkingDirectory dir + |> CreateProcess.ensureExitCode + + let dotnet args dir = createProcess "dotnet" args dir + + let npm args dir = + let npmPath = + match ProcessUtils.tryFindFileOnPath "npm" with + | Some path -> path + | None -> + "npm was not found in path. Please install it and make sure it's available from your path. " + + "See https://safe-stack.github.io/docs/quickstart/#install-pre-requisites for more info" + |> failwith + + createProcess npmPath args dir + + let run proc arg dir = proc arg dir |> Proc.run |> ignore + + let runParallel processes = + processes |> Proc.Parallel.run |> ignore + + let runOrDefault args = + try + match args with + | [| "-t"; target |] + | [| target |] + -> Target.runOrDefaultWithArguments target + | _ -> Target.runOrDefaultWithArguments "Run" + 0 + with e -> + printfn "%A" e + 1 diff --git a/build/Targets.fs b/build/Targets.fs new file mode 100644 index 0000000..a997082 --- /dev/null +++ b/build/Targets.fs @@ -0,0 +1,413 @@ +namespace ProjectBuild + +module internal Targets = + open System + open System.IO + + open Fake.Core + open Fake.DotNet + open Fake.IO + open Fake.IO.FileSystemOperators + open Fake.IO.Globbing.Operators + open Fake.Core.TargetOperators + + open Utils + open Github.Types + + // -------------------------------------------------------------------------------------------------------- + // 2. Targets for FAKE + // -------------------------------------------------------------------------------------------------------- + + [] + module SafeStackTargets = + open SafeBuildHelpers + + let init safe = + Target.create "SafeClean" (fun _ -> + Shell.cleanDir safe.DeployPath + run dotnet [ "fable"; "clean"; "--yes" ] safe.ClientPath // Delete *.fs.js files created by Fable + ) + + Target.create "InstallClient" (fun _ -> + run npm [ "--version" ] "." + run npm [ "install" ] "." + ) + + Target.create "Bundle" (fun _ -> + [ + "server", dotnet [ "publish"; "-c"; "Release"; "-o"; safe.DeployPath ] safe.ServerPath + "client", dotnet [ "fable"; "-o"; "output"; "-s"; "--run"; "npx"; "vite"; "build" ] safe.ClientPath + ] + |> runParallel + ) + + Target.create "Run" (fun _ -> + run dotnet [ "build" ] safe.SharedPath + [ + "server", dotnet [ "watch"; "run" ] safe.ServerPath + "client", dotnet [ "fable"; "watch"; "-o"; "output"; "-s"; "--run"; "npx"; "vite" ] safe.ClientPath + ] + |> runParallel + ) + + Target.create "RunMirrord" (fun _ -> + run dotnet [ "build" ] safe.SharedPath + Environment.setEnvironVar "RUN_IN" "mirrord" + [ + "server", createProcess "mirrord" [ "exec"; "--config-file"; "../../.mirrord/mirrord.json"; "--"; "dotnet"; "watch"; "run" ] safe.ServerPath + "client", dotnet [ "fable"; "watch"; "-o"; "output"; "-s"; "--run"; "npx"; "vite" ] safe.ClientPath + ] + |> runParallel + ) + + Target.create "WatchTests" (fun _ -> + run dotnet [ "build" ] safe.SharedTestsPath + + [ + "server", dotnet [ "watch"; "run" ] safe.ServerTestsPath + "client", dotnet [ "fable"; "watch"; "-o"; "output"; "-s"; "--run"; "npx"; "vite" ] safe.ClientTestsPath + ] + |> runParallel + ) + + Target.create "Tests" (fun _ -> + run dotnet [ "build" ] safe.SharedTestsPath + + [ + "server", dotnet [ "run" ] safe.ServerTestsPath + //"client", dotnet [ "fable"; "watch"; "-o"; "output"; "-s"; "--run"; "npx"; "vite" ] safe.ClientTestsPath + ] + |> runParallel + ) + + [ + "SafeClean" + ==> "Clean" + + "SafeClean" + ==> "AssemblyInfo" + ==> "InstallClient" + ==> "Build" + + "Tests" + ==> "Bundle" + + "Build" + ==> "Lint" + ==> "Tests" <=> "WatchTests" + + "Build" + ==> "Run" <=> "RunMirrord" + ] + + let init (definition: ProjectDefinition) = + Target.initEnvironment () + + Target.create "Info" (fun _ -> + let separator sign = Trace.traceFAKE "%s" (String.replicate 69 sign) + + Trace.traceHeader "Project info" + Trace.tracefn "Project: %s" definition.Project.Name + Trace.tracefn "Summary: %s" definition.Project.Summary + Trace.tracefn "Type: %s" definition.Specs.Type + + separator "-" + + Trace.tracefn "Git.branch: %s" (definition.Project.Git |> Option.map (fun git -> git.Branch) |> Option.defaultValue "unknown") + Trace.tracefn "Git.commit: %s" (definition.Project.Git |> Option.map (fun git -> git.Commit) |> Option.defaultValue "unknown") + Trace.tracefn "Git.repository: %s" (definition.Project.Git |> Option.bind (fun git -> git.Repository) |> Option.defaultValue "unknown") + + separator "-" + + Trace.tracefn "BuildNumber: %s" ("BUILD_NUMBER" |> envVar |> Option.defaultValue "-") + + match definition with + | { Specs = SAFEStackApplication { TemplateVersion = templateVersion } } -> + Trace.tracefn "SafeTemplateVersion: %s" templateVersion + | _ -> () + + separator "=" + ) + + Target.create "Clean" <| skipOn "no-clean" (fun _ -> + !! "./**/bin/Release" + ++ "./**/bin/Debug" + ++ "./**/obj" + ++ "./**/.ionide" + -- "./bin/console" + -- "./build/**" + |> Shell.cleanDirs + ) + + Target.create "AssemblyInfo" (fun _ -> + let getAssemblyInfoAttributes projectName = + let now = DateTime.Now + + let release = + definition.ChangeLog + |> Option.bind (fun changeLog -> + try ReleaseNotes.parse (System.IO.File.ReadAllLines changeLog |> Seq.filter ((<>) "## Unreleased")) |> Some + with _ -> None + ) + + let gitValue fallbackEnvironmentVariableNames initialValue = + initialValue + |> String.replace "NoBranch" "" + |> stringToOption + |> Option.bindNone (fun _ -> fallbackEnvironmentVariableNames |> List.tryPick envVar) + |> Option.defaultValue "unknown" + + [ + AssemblyInfo.Title projectName + AssemblyInfo.Product definition.Project.Name + AssemblyInfo.Description definition.Project.Summary + + match release with + | Some release -> + AssemblyInfo.Version release.AssemblyVersion + AssemblyInfo.FileVersion release.AssemblyVersion + | _ -> + AssemblyInfo.Version "1.0" + AssemblyInfo.FileVersion "1.0" + + AssemblyInfo.InternalsVisibleTo "tests" + + match definition.Project.Git with + | None -> + AssemblyInfo.Metadata("gitbranch", null |> gitValue [ "GIT_BRANCH"; "branch" ]) + AssemblyInfo.Metadata("gitcommit", null |> gitValue [ "GIT_COMMIT"; "commit" ]) + | Some git -> + AssemblyInfo.Metadata("gitbranch", git.Branch |> gitValue [ "GIT_BRANCH"; "branch" ]) + AssemblyInfo.Metadata("gitcommit", git.Commit |> gitValue [ "GIT_COMMIT"; "commit" ]) + + AssemblyInfo.Metadata("createdAt", now.ToString("yyyy-MM-dd HH:mm:ss")) + AssemblyInfo.Metadata("buildNumber", "BUILD_NUMBER" |> envVar |> Option.defaultValue "-") + + match definition with + | { Specs = SAFEStackApplication { TemplateVersion = templateVersion } } -> + AssemblyInfo.Metadata("SafeTemplateVersion", templateVersion) + | _ -> () + ] + + let getProjectDetails (projectPath: string) = + let projectName = IO.Path.GetFileNameWithoutExtension(projectPath) + ( + projectPath, + projectName, + IO.Path.GetDirectoryName(projectPath), + (getAssemblyInfoAttributes projectName) + ) + + definition.Sources.All + |> Seq.map getProjectDetails + |> Seq.iter (fun (_, _, folderName, attributes) -> + AssemblyInfoFile.createFSharp (folderName "AssemblyInfo.fs") attributes + ) + ) + + Target.create "Build" (fun _ -> + definition.Sources.All + |> Seq.iter (Path.getDirectory >> Dotnet.runOrFail "build") + ) + + Target.create "Lint" <| skipOn "no-lint" (fun _ -> + definition.Sources.All + ++ "build/build.fsproj" + |> Seq.iter (fun fsproj -> + match Dotnet.runInRoot (sprintf "fsharplint lint %s" fsproj) with + | Ok () -> Trace.tracefn "Lint %s is Ok" fsproj + | Error e -> raise e + ) + ) + + if not definition.Specs.IsSAFEStack then + Target.create "Tests" (fun _ -> + if definition.Sources.Tests |> Seq.isEmpty + then Trace.tracefn "There are no tests yet." + else Dotnet.runOrFail "run" "tests" + ) + + let zipRelease releaseDir runtimeIds = + if releaseDir "zipCompiled" |> File.exists + then + let zipReleaseProcess = createProcess (releaseDir "zipCompiled") + + Trace.tracefn "\nZipping released files in %s ..." releaseDir + run zipReleaseProcess "" "." + |> Trace.tracefn "Zip result:\n%A\n" + + Trace.tracefn "\nZip compiled files" + runtimeIds + |> List.iter (RuntimeId.value >> fun runtimeId -> + Trace.tracefn " -> zipping %s ..." runtimeId + let zipFile = sprintf "%s.zip" runtimeId + IO.File.Delete zipFile + Zip.zip releaseDir (releaseDir zipFile) !!(releaseDir runtimeId "*") + ) + + Target.create "Release" (fun _ -> + match definition with + | { Specs = Library { ReleaseDir = releaseDir; NugetApi = nugetApi } } -> + match "src" definition.Project.Name with + | releaseSource when releaseSource |> Directory.Exists -> + Dotnet.runOrFail "pack" releaseSource + | _ -> + Dotnet.runInRootOrFail "pack" + + Directory.ensure releaseDir + + !! "**/bin/**/*.nupkg" + |> Seq.iter (Shell.moveFile releaseDir) + + | { Specs = ConsoleApplication { RuntimeIds = runtimeIds; ReleaseSource = releaseSource; ReleaseDir = releaseDir } } -> + let releaseDir = Path.getFullName releaseDir + + Trace.tracefn "\nClean previous releases" + runtimeIds + |> Seq.collect (RuntimeId.value >> fun runtimeId -> + Trace.tracefn " - %s" runtimeId + !! (releaseDir runtimeId) + ) + |> Shell.cleanDirs + + Trace.tracefn "\nClean previous zipped releases" + !! (releaseDir "*.zip") + ++ (releaseDir "*.tar.gz") + |> Seq.map (tee (Trace.tracefn " - %s")) + |> Seq.iter File.delete + + Trace.tracefn "\nPublish current release" + + seq { + let project = releaseSource + yield! runtimeIds |> List.collect (RuntimeId.value >> fun runtimeId -> [project, runtimeId]) + } + |> Seq.iter (fun (project, runtimeId) -> + sprintf "publish -c Release /p:PublishSingleFile=true -o %s/%s --self-contained -r %s %s" releaseDir runtimeId runtimeId project + |> Dotnet.runInRootOrFail + ) + + runtimeIds |> zipRelease releaseDir + + | { Specs = Executable { ReleaseDir = releaseDir } } -> + releaseDir + |> sprintf "publish -c Release -o %s" + |> Dotnet.runInRootOrFail + + | { Specs = SAFEStackApplication _ } -> failwithf "For releasing SAFE-Stack Application, use \"bundle\" target instead." + ) + + Target.create "ZipRelease" (fun _ -> + match definition with + | { Specs = ConsoleApplication { RuntimeIds = runtimeIds; ReleaseDir = releaseDir } } -> + runtimeIds |> zipRelease releaseDir + | _ -> () + ) + + Target.create "Publish" (fun _ -> + match definition with + | { Specs = Library { NugetApi = NugetApi.NotUsed } } -> Trace.traceHeader "NugetApi is not used" + + | { Specs = Library { ReleaseDir = releaseDir; NugetApi = NugetApi.Organization organization; NugetCustomServerRepository = nugetServer } } -> + Trace.traceHeader "Pushing to organization nuget server" + + envVar "PRIVATE_FEED_PASS" + |> Option.requireSome "Environment variable PRIVATE_FEED_PASS is not set." + |> Nuget.push releaseDir (Some organization) + + match envVar "NUGET_SERVER_TOKEN", envVar "NUGET_SERVER_REPOSITORY" |> Option.orElse nugetServer with + | Some token, Some repository -> + Trace.tracefn "Trigger: Update %s readme" repository + + Github.triggerAction { + EventType = "update-readme" + CurrentProject = definition.Project.Name + Token = token + Organization = envVar "NUGET_SERVER_ORGANIZATION" |> Option.defaultValue organization + Repository = repository + } + |> Async.RunSynchronously + + | _ -> () + + | { Specs = Library { ReleaseDir = releaseDir; NugetApi = NugetApi.AskForKey; Organization = organization }} -> + Trace.traceHeader "Pushing to public nuget server" + + match UserInput.getUserInput "Are you sure - is it tagged yet? [y|n]: " with + | "y" | "yes" -> + match UserInput.getUserPassword "Nuget ApiKey: " with + | null | "" -> failwithf "You have to provide an api key for nuget." + | apiKey -> Nuget.push releaseDir organization apiKey + | _ -> () + + | { Specs = Library { ReleaseDir = releaseDir; NugetApi = NugetApi.KeyInEnvironment name; Organization = organization }} -> + Trace.traceHeader "Pushing to nuget server" + + envVar name + |> Option.iter (Nuget.push releaseDir organization) + + | _ -> () + ) + + Target.create "Watch" (fun _ -> + Dotnet.runInRootOrFail "watch run" + ) + + Target.create "WatchMirrord" (fun _ -> + Environment.setEnvironVar "RUN_IN" "mirrord" + run (createProcess "mirrord") "exec --config-file .mirrord/mirrord.json -- dotnet watch run" "." + ) + + Target.create "Run" (fun _ -> + Dotnet.runInRootOrFail "run" + ) + + Target.create "RunMirrord" (fun _ -> + Environment.setEnvironVar "RUN_IN" "mirrord" + run (createProcess "mirrord") "exec --config-file .mirrord/mirrord.json -- dotnet run" "." + ) + + // -------------------------------------------------------------------------------------------------------- + // 3. FAKE targets hierarchy + // -------------------------------------------------------------------------------------------------------- + + match definition with + | { Specs = Library _ } -> + [ + "Clean" + ==> "AssemblyInfo" + ==> "Build" + ==> "Lint" + ==> "Tests" + ==> "Release" + ==> "Publish" + ] + + | { Specs = ConsoleApplication _ } -> + [ + "Clean" + ==> "AssemblyInfo" + ==> "Build" + ==> "Lint" + ==> "Tests" + ==> "Release" + ==> "ZipRelease" + + "Build" + ==> "Watch" <=> "WatchMirrord" <=> "Run" <=> "RunMirrord" + ] + + | { Specs = Executable _ } -> + [ + "Clean" + ==> "AssemblyInfo" + ==> "Build" + ==> "Lint" + ==> "Tests" + ==> "Release" <=> "Watch" <=> "WatchMirrord" <=> "Run" <=> "RunMirrord" + ] + + | { Specs = SAFEStackApplication safe } -> + SafeStackTargets.init safe + + |> ignore diff --git a/build/Utils.fs b/build/Utils.fs new file mode 100644 index 0000000..1047ee7 --- /dev/null +++ b/build/Utils.fs @@ -0,0 +1,430 @@ +namespace ProjectBuild + +module internal Utils = + open System + open System.IO + + open Fake.Core + open Fake.DotNet + open Fake.IO + open Fake.IO.FileSystemOperators + open Fake.IO.Globbing.Operators + open Fake.Core.TargetOperators + open Fake.Tools.Git + + [] + module Args = + let init args = + args + |> Array.toList + |> Context.FakeExecutionContext.Create false "build.fsx" + |> Context.RuntimeContext.Fake + |> Context.setExecutionContext + + let run args = + match args with + | [| "-t"; target |] -> Target.runOrDefault target + | [| target |] -> Target.runOrDefaultWithArguments target + | _ -> Target.runOrDefaultWithArguments "Build" + + 0 // return an integer exit code + + let tee f a = + f a + a + + let skipOn option action p = + if p.Context.Arguments |> Seq.contains option + then Trace.tracefn "Skipped ..." + else action p + + let createProcess exe arg dir = + CreateProcess.fromRawCommandLine exe arg + |> CreateProcess.withWorkingDirectory dir + |> CreateProcess.ensureExitCode + + let run proc arg dir = + proc arg dir + |> Proc.run + |> ignore + + let orFail = function + | Error e -> raise e + | Ok ok -> ok + + let stringToOption = function + | null | "" -> None + | string -> Some string + + let envVar name = + if Environment.hasEnvironVar(name) + then Environment.environVar(name) |> Some + else None + + [] + module Option = + let mapNone f = function + | Some v -> v + | None -> f None + + let bindNone f = function + | Some v -> Some v + | None -> f None + + let requireSome error = function + | Some v -> v + | None -> failwith error + + [] + module Dotnet = + let dotnet = createProcess "dotnet" + + let run command dir = try run dotnet command dir |> Ok with e -> Error e + let runInRoot command = run command "." + let runOrFail command dir = run command dir |> orFail + let runInRootOrFail command = run command "." |> orFail + + [] + module Nuget = + let push releaseDir organization token = + let sourceName = + organization + |> Option.map (fun organization -> + let sourceName = "github" + + Trace.tracefn "[Nuget] Add organization %A as a source" organization + sprintf "nuget add source --username %s --password %s --store-password-in-clear-text --name %s \"https://nuget.pkg.github.com/%s/index.json\"" + organization token sourceName organization + |> Dotnet.runInRootOrFail + + sourceName + ) + + Trace.tracefn "[Nuget] Push packages" + sprintf "nuget push %s --source=%s --api-key=%s --skip-duplicate" + (releaseDir "*.nupkg") + (sourceName |> Option.defaultValue "https://api.nuget.org/v3/index.json") + token + |> Dotnet.runInRootOrFail + + [] + module ProjectDefinition = + type IProjectSources = + abstract member Sources: IGlobbingPattern + abstract member Tests: IGlobbingPattern + abstract member All: IGlobbingPattern + + type ProjectDefinition = + { + Project: ProjectMeta + Specs: ProjectSpec + } + + with + member this.Sources = + match this with + | { Specs = Library app } -> app :> IProjectSources + | { Specs = Executable app } -> app :> IProjectSources + | { Specs = ConsoleApplication app } -> app :> IProjectSources + | { Specs = SAFEStackApplication app } -> app :> IProjectSources + + member this.ChangeLog = + match this with + | { Specs = Library { Changelog = changeLog } } -> Some changeLog + | { Specs = Executable { Changelog = changeLog } } + | { Specs = ConsoleApplication { Changelog = changeLog } } + | { Specs = SAFEStackApplication { Changelog = changeLog } } -> changeLog + + and ProjectMeta = { + Name: string + Summary: string + Git: Git option + } + + and Git = { + Commit: string + Branch: string + Repository: string option + } + + and ProjectSpec = + | Library of LibrarySpec + | Executable of ExecutableSpec + | ConsoleApplication of ConsoleApplicationSpec + | SAFEStackApplication of SAFEStackApplicationSpec + + with + member this.Type = + match this with + | Library _ -> "Library" + | Executable _ -> "Executable" + | ConsoleApplication _ -> "Console Application" + | SAFEStackApplication _ -> "SAFE-Stack Application" + + member this.IsSAFEStack = + match this with + | SAFEStackApplication _ -> true + | _ -> false + + and LibrarySpec = + { + Changelog: string + ReleaseDir: string + LibrarySources: IGlobbingPattern + TestsSources: IGlobbingPattern + AllSources: IGlobbingPattern + /// Organization (it is used for a custom github nuget source) + Organization: string option + /// Configuration for nuget api, to push packages into + NugetApi: NugetApi + /// Repository for custom nuget server, it will be triggered for a readme update + NugetCustomServerRepository: string option + } + + interface IProjectSources with + member this.Sources = this.LibrarySources + member this.Tests = this.TestsSources + member this.All = this.AllSources + + and [] NugetApi = + | NotUsed + | AskForKey + | Organization of name: string + | KeyInEnvironment of string + + and ExecutableSpec = + { + Changelog: string option + ReleaseDir: string + ApplicationSources: IGlobbingPattern + TestsSources: IGlobbingPattern + AllSources: IGlobbingPattern + } + + interface IProjectSources with + member this.Sources = this.ApplicationSources + member this.Tests = this.TestsSources + member this.All = this.AllSources + + and ConsoleApplicationSpec = + { + Changelog: string option + ReleaseDir: string + RuntimeIds: RuntimeId list + ReleaseSource: string + ApplicationSources: IGlobbingPattern + TestsSources: IGlobbingPattern + AllSources: IGlobbingPattern + } + + interface IProjectSources with + member this.Sources = this.ApplicationSources + member this.Tests = this.TestsSources + member this.All = this.AllSources + + and SAFEStackApplicationSpec = + { + Changelog: string option + TemplateVersion: string + + SharedPath: string + ServerPath: string + ClientPath: string + + DeployPath: string + + SharedTestsPath: string + ServerTestsPath: string + ClientTestsPath: string + + ReleaseSources: IGlobbingPattern + TestsSources: IGlobbingPattern + AllSources: IGlobbingPattern + } + + interface IProjectSources with + member this.Sources = this.ReleaseSources + member this.Tests = this.TestsSources + member this.All = this.AllSources + + and RuntimeId = + | OSX + | Windows + | Linux + | ArmLinux + | AlpineLinux + | RaspberryPiHassioAddon + | Other of string + + [] + module Git = + let init () = + Some { + Commit = Information.getCurrentSHA1(".") + Branch = Information.getBranchName(".") + Repository = None + } + + [] + module Spec = + let defaultLibrary: ProjectSpec = + let sources = + !! "./*.fsproj" + ++ "src/*.fsproj" + ++ "src/**/*.fsproj" + + Library { + Changelog = "CHANGELOG.md" + ReleaseDir = "release" + LibrarySources = sources + TestsSources = !! "tests/*.fsproj" + AllSources = + sources + ++ "tests/*.fsproj" + ++ "build/*.fsproj" + Organization = None + NugetApi = NugetApi.NotUsed + NugetCustomServerRepository = None + } + + let defaultExecutable: ProjectSpec = + let release = + !! "./*.fsproj" + ++ "src/**/*.fsproj" + + Executable { + Changelog = if File.Exists "CHANGELOG.md" then Some "CHANGELOG.md" else None + ReleaseDir = "/app" + + ApplicationSources = release + TestsSources = !! "tests/**/*.fsproj" + AllSources = + release + ++ "tests/**/*.fsproj" + ++ "build/*.fsproj" + } + + let defaultConsoleApplication runtimeIds: ProjectSpec = + let sources = + !! "./*.fsproj" + ++ "src/*.fsproj" + ++ "src/**/*.fsproj" + + ConsoleApplication { + Changelog = if File.Exists "CHANGELOG.md" then Some "CHANGELOG.md" else None + ReleaseDir = "./dist" + RuntimeIds = runtimeIds + + ApplicationSources = sources + ReleaseSource = sources |> Seq.head + TestsSources = !! "tests/*.fsproj" + AllSources = + sources + ++ "tests/*.fsproj" + ++ "build/*.fsproj" + } + + let defaultSAFEStackApplication templateVersion: ProjectSpec = + let release = !! "src/**/*.fsproj" + + SAFEStackApplication { + Changelog = if File.Exists "CHANGELOG.md" then Some "CHANGELOG.md" else None + TemplateVersion = templateVersion + + SharedPath = Path.getFullName ("src" "Shared") + ServerPath = Path.getFullName ("src" "Server") + ClientPath = Path.getFullName ("src" "Client") + + DeployPath = Path.getFullName "deploy" + + SharedTestsPath = Path.getFullName ("tests" "Shared") + ServerTestsPath = Path.getFullName ("tests" "Server") + ClientTestsPath = Path.getFullName ("tests" "Client") + + ReleaseSources = release + TestsSources = !! "tests/**/*.fsproj" + AllSources = release ++ "tests/**/*.fsproj" + } + + let mapLibrary f = function + | Library spec -> f spec |> Library + | spec -> spec + + let mapExecutable f = function + | Executable spec -> f spec |> Executable + | spec -> spec + + let mapConsoleApplication f = function + | ConsoleApplication spec -> f spec |> ConsoleApplication + | spec -> spec + + let mapSAFEStackApplication f = function + | SAFEStackApplication spec -> f spec |> SAFEStackApplication + | spec -> spec + + [] + module RuntimeId = + /// Runtime IDs: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#macos-rids + let value = function + | OSX -> "osx-x64" + | Windows -> "win-x64" + | Linux -> "linux-x64" + | ArmLinux -> "linux-arm64" + | AlpineLinux -> "linux-musl-x64" + | RaspberryPiHassioAddon -> "alpine.3.16-arm64" + | Other other -> other + + [] + module Http = + open System.Net.Http + open System.Net.Http.Headers + + let post (currentProject: string) token (url: string) (data: string) = async { + use client = new HttpClient() + + let requestHeaders = client.DefaultRequestHeaders + requestHeaders.Authorization <- new AuthenticationHeaderValue("Bearer", token) + requestHeaders.Add("User-Agent", sprintf "Fake.Build/%s" currentProject) + + use request = new StringContent(data, Text.Encoding.UTF8) + request.Headers.ContentType <- new MediaTypeHeaderValue("application/json") + + let! response = client.PostAsync(url, request) |> Async.AwaitTask + response.EnsureSuccessStatusCode() |> ignore + + let headers = + response.Headers :> seq>> + |> Seq.append ( + response.Content.Headers :> seq>> + ) + |> Seq.map (fun kv -> kv.Key, kv.Value |> Seq.toList) + |> Map.ofSeq + + use! stream = response.Content.ReadAsStreamAsync() |> Async.AwaitTask + use reader = new StreamReader(stream) + + return headers, reader.ReadToEnd() + } + + [] + module Github = + [] + module Types = + type TriggerAction = { + CurrentProject: string + Token: string + Organization: string + Repository: string + EventType: string + } + + let triggerAction { CurrentProject = current; Token = token; Organization = org; Repository = repo; EventType = event } = async { + let url = + $"https://api.github.com/repos/{org}/{repo}/dispatches" + |> tee (Trace.tracefn "Github.Trigger<%s>: %s" event) + + let data = sprintf @"{""event_type"":""%s"",""client_payload"":{""from"": ""%s""}}" event current + let! _ = Http.post current token url data + + return () + } diff --git a/build/build.fsproj b/build/build.fsproj new file mode 100644 index 0000000..2d46ce8 --- /dev/null +++ b/build/build.fsproj @@ -0,0 +1,18 @@ + + + + Exe + net10.0 + false + NU1510 + + + + + + + + + + + diff --git a/build/paket.references b/build/paket.references new file mode 100644 index 0000000..d771935 --- /dev/null +++ b/build/paket.references @@ -0,0 +1,9 @@ +group Build + Fake.DotNet.Cli + Fake.IO.FileSystem + Fake.IO.Zip + Fake.Core.Target + Fake.Core.UserInput + Fake.DotNet.AssemblyInfoFile + Fake.Core.ReleaseNotes + Fake.Tools.Git diff --git a/fsharplint.json b/fsharplint.json new file mode 100644 index 0000000..4c26569 --- /dev/null +++ b/fsharplint.json @@ -0,0 +1,496 @@ +{ + "ignoreFiles": [ + "AssemblyInfo", + "AssemblyInfo.fs", + "AssemblyAttributes" + ], + "global": { + "numIndentationSpaces": 4 + }, + "typedItemSpacing": { + "enabled": true, + "config": { + "typedItemStyle": "SpaceAfter" + } + }, + "typePrefixing": { + "enabled": true, + "config": { + "mode": "Hybrid" + } + }, + "unionDefinitionIndentation": { "enabled": false }, + "moduleDeclSpacing": { "enabled": false }, + "classMemberSpacing": { "enabled": false }, + "tupleCommaSpacing": { "enabled": true }, + "tupleIndentation": { "enabled": false }, + "tupleParentheses": { "enabled": false }, + "patternMatchClausesOnNewLine": { "enabled": false }, + "patternMatchOrClausesOnNewLine": { "enabled": false }, + "patternMatchClauseIndentation": { "enabled": false }, + "patternMatchExpressionIndentation": { "enabled": false }, + "recursiveAsyncFunction": { "enabled": true }, + "redundantNewKeyword": { "enabled": true }, + "nestedStatements": { + "enabled": false, + "config": { + "depth": 8 + } + }, + "cyclomaticComplexity": { + "enabled": false, + "config": { + "maxComplexity": 40 + } + }, + "reimplementsFunction": { "enabled": true }, + "canBeReplacedWithComposition": { "enabled": true }, + "avoidSinglePipeOperator": { "enabled": false }, + "usedUnderscorePrefixedElements": { "enabled": true }, + "failwithWithSingleArgument": { "enabled": true }, + "raiseWithSingleArgument": { "enabled": true }, + "nullArgWithSingleArgument": { "enabled": true }, + "invalidOpWithSingleArgument": { "enabled": true }, + "invalidArgWithTwoArguments": { "enabled": true }, + "failwithfWithArgumentsMatchingFormatString": { "enabled": true }, + "failwithBadUsage": { "enabled": true }, + "maxLinesInLambdaFunction": { + "enabled": false, + "config": { + "maxLines": 7 + } + }, + "maxLinesInMatchLambdaFunction": { + "enabled": false, + "config": { + "maxLines": 100 + } + }, + "maxLinesInValue": { + "enabled": false, + "config": { + "maxLines": 100 + } + }, + "maxLinesInFunction": { + "enabled": false, + "config": { + "maxLines": 100 + } + }, + "maxLinesInMember": { + "enabled": false, + "config": { + "maxLines": 100 + } + }, + "maxLinesInConstructor": { + "enabled": false, + "config": { + "maxLines": 100 + } + }, + "maxLinesInProperty": { + "enabled": false, + "config": { + "maxLines": 70 + } + }, + "maxLinesInModule": { + "enabled": false, + "config": { + "maxLines": 1000 + } + }, + "maxLinesInRecord": { + "enabled": false, + "config": { + "maxLines": 500 + } + }, + "maxLinesInEnum": { + "enabled": false, + "config": { + "maxLines": 500 + } + }, + "maxLinesInUnion": { + "enabled": false, + "config": { + "maxLines": 500 + } + }, + "maxLinesInClass": { + "enabled": false, + "config": { + "maxLines": 500 + } + }, + "interfaceNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None", + "prefix": "I" + } + }, + "exceptionNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None", + "suffix": "Exception" + } + }, + "typeNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "recordFieldNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "enumCasesNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "unionCasesNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "moduleNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "literalNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "namespaceNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "memberNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "AllowPrefix" + } + }, + "parameterNames": { + "enabled": true, + "config": { + "naming": "CamelCase", + "underscores": "AllowPrefix" + } + }, + "measureTypeNames": { + "enabled": true, + "config": { + "underscores": "None" + } + }, + "activePatternNames": { + "enabled": true, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "genericTypesNames": { + "enabled": false, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "publicValuesNames": { + "enabled": true, + "config": { + "underscores": "AllowPrefix" + } + }, + "privateValuesNames": { + "enabled": true, + "config": { + "naming": "CamelCase", + "underscores": "AllowPrefix" + } + }, + "internalValuesNames": { + "enabled": true, + "config": { + "naming": "CamelCase", + "underscores": "AllowPrefix" + } + }, + "unnestedFunctionNames": { + "enabled": false, + "config": { + "naming": "PascalCase", + "underscores": "None" + } + }, + "nestedFunctionNames": { + "enabled": false, + "config": { + "naming": "CamelCase", + "underscores": "None" + } + }, + "maxNumberOfItemsInTuple": { + "enabled": false, + "config": { + "maxItems": 4 + } + }, + "maxNumberOfFunctionParameters": { + "enabled": false, + "config": { + "maxItems": 5 + } + }, + "maxNumberOfMembers": { + "enabled": false, + "config": { + "maxItems": 32 + } + }, + "maxNumberOfBooleanOperatorsInCondition": { + "enabled": false, + "config": { + "maxItems": 4 + } + }, + "favourIgnoreOverLetWild": { "enabled": true }, + "wildcardNamedWithAsPattern": { "enabled": true }, + "uselessBinding": { "enabled": true }, + "tupleOfWildcards": { "enabled": true }, + "favourTypedIgnore": { "enabled": false }, + "favourNonMutablePropertyInitialization": { "enabled": false }, + "favourReRaise": { "enabled": true }, + "favourStaticEmptyFields": { "enabled": false }, + "favourConsistentThis": { + "enabled": false, + "config": { + "symbol": "this" + } + }, + "suggestUseAutoProperty": { "enabled": false }, + "avoidTooShortNames": { "enabled": false }, + "asyncExceptionWithoutReturn": { "enabled": false }, + "unneededRecKeyword": { "enabled": true }, + "indentation": { + "enabled": false + }, + "maxCharactersOnLine": { + "enabled": false, + "config": { + "maxCharactersOnLine": 120 + } + }, + "trailingWhitespaceOnLine": { + "enabled": true, + "config": { + "numberOfSpacesAllowed": 0, + "oneSpaceAllowedAfterOperator": false, + "ignoreBlankLines": false + } + }, + "maxLinesInFile": { + "enabled": false, + "config": { + "maxLinesInFile": 1000 + } + }, + "trailingNewLineInFile": { "enabled": false }, + "noTabCharacters": { "enabled": true }, + "noPartialFunctions": { + "enabled": false, + "config": { + "allowedPartials": [], + "additionalPartials": [] + } + }, + "ensureTailCallDiagnosticsInRecursiveFunctions": { "enabled": true }, + "favourAsKeyword": { "enabled": true }, + "interpolatedStringWithNoSubstitution": { "enabled": false }, + "indexerAccessorStyleConsistency": { + "enabled": true, + "config": { + "style": "CSharp" + } + }, + "favourSingleton": { "enabled": false }, + "noAsyncRunSynchronouslyInLibrary": { "enabled": true }, + "favourNestedFunctions": { "enabled": false }, + "disallowShadowing": { "enabled": false }, + "discourageStringInterpolationWithStringFormat": { + "enabled": false + }, + "favourNamedMembers": { "enabled": false }, + "synchronousFunctionNames": { "enabled": true }, + "asynchronousFunctionNames": { + "enabled": true, + "config": { + "mode": "OnlyPublicAPIsInLibraries" + } + }, + "simpleAsyncComplementaryHelpers": { + "enabled": false, + "config": { + "mode": "OnlyPublicAPIsInLibraries" + } + }, + "hints": { + "add": [ + "not (a = b) ===> a <> b", + "not (a <> b) ===> a = b", + "not (a > b) ===> a <= b", + "not (a >= b) ===> a < b", + "not (a < b) ===> a >= b", + "not (a <= b) ===> a > b", + "compare x y <> 1 ===> x <= y", + "compare x y = -1 ===> x < y", + "compare x y <> -1 ===> x >= y", + "compare x y = 1 ===> x > y", + "compare x y <= 0 ===> x <= y", + "compare x y < 0 ===> x < y", + "compare x y >= 0 ===> x >= y", + "compare x y > 0 ===> x > y", + "compare x y = 0 ===> x = y", + "compare x y <> 0 ===> x <> y", + + "List.head (List.sort x) ===> List.min x", + "List.head (List.sortBy f x) ===> List.minBy f x", + + "List.map f (List.map g x) ===> List.map (g >> f) x", + "Array.map f (Array.map g x) ===> Array.map (g >> f) x", + "Seq.map f (Seq.map g x) ===> Seq.map (g >> f) x", + "List.nth x 0 ===> List.head x", + "List.map f (List.replicate n x) ===> List.replicate n (f x)", + "List.rev (List.rev x) ===> x", + "Array.rev (Array.rev x) ===> x", + "List.fold (@) [] x ===> List.concat x", + "List.map id x ===> id x", + "Array.map id x ===> id x", + "Seq.map id x ===> id x", + "(List.length x) = 0 ===> List.isEmpty x", + "(Array.length x) = 0 ===> Array.isEmpty x", + "(Seq.length x) = 0 ===> Seq.isEmpty x", + "x = [] ===> List.isEmpty x", + "x = [||] ===> Array.isEmpty x", + "(List.length x) <> 0 ===> not (List.isEmpty x)", + "(Array.length x) <> 0 ===> not (Array.isEmpty x)", + "(Seq.length x) <> 0 ===> not (Seq.isEmpty x)", + "(List.length x) > 0 ===> not (List.isEmpty x)", + "(Array.length x) <> 0 ===> not (Array.isEmpty x)", + "(Seq.length x) <> 0 ===> not (Seq.isEmpty x)", + + "List.concat (List.map f x) ===> List.collect f x", + "Array.concat (Array.map f x) ===> Array.collect f x", + "Seq.concat (Seq.map f x) ===> Seq.collect f x", + + "List.isEmpty (List.filter f x) ===> not (List.exists f x)", + "Array.isEmpty (Array.filter f x) ===> not (Array.exists f x)", + "Seq.isEmpty (Seq.filter f x) ===> not (Seq.exists f x)", + "not (List.isEmpty (List.filter f x)) ===> List.exists f x", + "not (Array.isEmpty (Array.filter f x)) ===> Array.exists f x", + "not (Seq.isEmpty (Seq.filter f x)) ===> Seq.exists f x", + + "List.length x >= 0 ===> true", + "Array.length x >= 0 ===> true", + "Seq.length x >= 0 ===> true", + + "x = true ===> x", + "x = false ===> not x", + "true = a ===> a", + "false = a ===> not a", + "a <> true ===> not a", + "a <> false ===> a", + "true <> a ===> not a", + "false <> a ===> a", + "if a then true else false ===> a", + "if a then false else true ===> not a", + "if x then y else y ===> y", + "not (not x) ===> x", + + "(fst x, snd x) ===> x", + + "true && x ===> x", + "false && x ===> false", + "true || x ===> true", + "false || x ===> x", + "not true ===> false", + "not false ===> true", + "fst (x, y) ===> x", + "snd (x, y) ===> y", + "List.fold f x [] ===> x", + "Array.fold f x [||] ===> x", + "List.foldBack f [] x ===> x", + "Array.foldBack f [||] x ===> x", + "x - 0 ===> x", + "x * 1 ===> x", + "x / 1 ===> x", + + "List.fold (+) 0 x ===> List.sum x", + "Array.fold (+) 0 x ===> Array.sum x", + "Seq.fold (+) 0 x ===> Seq.sum x", + "List.sum (List.map x y) ===> List.sumBy x y", + "Array.sum (Array.map x y) ===> Array.sumBy x y", + "Seq.sum (Seq.map x y) ===> Seq.sumBy x y", + "List.average (List.map x y) ===> List.averageBy x y", + "Array.average (Array.map x y) ===> Array.averageBy x y", + "Seq.average (Seq.map x y) ===> Seq.averageBy x y", + "(List.take x y, List.skip x y) ===> List.splitAt x y", + "(Array.take x y, Array.skip x y) ===> Array.splitAt x y", + "(Seq.take x y, Seq.skip x y) ===> Seq.splitAt x y", + + "List.empty ===> []", + "Array.empty ===> [||]", + + "x::[] ===> [x]", + "pattern: x::[] ===> [x]", + + "x @ [] ===> x", + "(List.singleton x) @ y ===> x :: y", + + "List.isEmpty [] ===> true", + "Array.isEmpty [||] ===> true", + + "fun _ -> () ===> ignore", + "fun x -> x ===> id", + "id x ===> x", + "id >> f ===> f", + "f >> id ===> f", + + "x = null ===> isNull x", + "null = x ===> isNull x", + "x <> null ===> not (isNull x)", + "null <> x ===> not (isNull x)", + + "Array.append a (Array.append b c) ===> Array.concat [|a; b; c|]" + ] + } +} diff --git a/global.json b/global.json new file mode 100644 index 0000000..a68b32e --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "10.0.0", + "rollForward": "latestMinor" + } +} diff --git a/paket.dependencies b/paket.dependencies new file mode 100644 index 0000000..a1c5b81 --- /dev/null +++ b/paket.dependencies @@ -0,0 +1,35 @@ +framework: net10.0 + +source https://api.nuget.org/v3/index.json +nuget FSharp.Core ~> 10.0 +nuget FSharp.Data ~> 6.0 +nuget FSharp.Control.AsyncSeq ~> 4.0 +nuget Alma.Authorization ~> 10.3 +nuget Alma.ServiceIdentification ~> 11.0 +nuget Alma.WebApplication ~> 14.0 + +# gRPC +nuget Grpc.Net.Client ~> 2.70 + +nuget Feather.Contracts ~> 1.0 +nuget Feather.Cryptography ~> 2.0 +nuget Feather.ErrorHandling ~> 2.0 + +// [ TESTS GROUP ] +group Tests + source https://api.nuget.org/v3/index.json + nuget Expecto + nuget YoloDev.Expecto.TestSdk + +// [ FAKE GROUP ] +group Build + storage none + source https://api.nuget.org/v3/index.json + nuget Fake.DotNet.Cli + nuget Fake.IO.FileSystem + nuget Fake.IO.Zip + nuget Fake.Core.Target + nuget Fake.Core.UserInput + nuget Fake.DotNet.AssemblyInfoFile + nuget Fake.Core.ReleaseNotes + nuget Fake.Tools.Git diff --git a/paket.lock b/paket.lock new file mode 100644 index 0000000..796585e --- /dev/null +++ b/paket.lock @@ -0,0 +1,675 @@ +RESTRICTION: == net10.0 +NUGET + remote: https://api.nuget.org/v3/index.json + Alma.Authorization (10.4) + Alma.Authorization.Common (>= 7.0 < 8.0) + Alma.ServiceIdentification (>= 11.0 < 12.0) + Casbin.NET (>= 2.19.2 < 3.0) + Feather.Cryptography (>= 2.1 < 3.0) + Feather.ErrorHandling (>= 2.0 < 3.0) + FSharp.Core (>= 10.0.102 < 11.0) + FSharp.Data (>= 6.6 < 7.0) + gfoidl.Base64 (>= 1.1.2 < 1.2) + JsonWebToken (>= 1.9.4 < 2.0) + Microsoft.Extensions.Logging (>= 10.0.2 < 11.0) + Portable.BouncyCastle (>= 1.9 < 2.0) + System.IdentityModel.Tokens.Jwt (>= 8.15 < 9.0) + Alma.Authorization.Common (7.0) + FSharp.Core (>= 10.0.102 < 11.0) + Alma.JsonApi (11.0) + Alma.Serializer (>= 9.0 < 10.0) + Alma.State (>= 11.0 < 12.0) + Alma.Tracing (>= 13.0 < 14.0) + Feather.ErrorHandling (>= 2.0 < 3.0) + FSharp.Core (>= 10.0.102 < 11.0) + FSharp.Data (>= 6.6 < 7.0) + Giraffe (>= 8.2 < 9.0) + Alma.Logging (12.0) + Alma.ServiceIdentification (>= 11.0 < 12.0) + Feather.ErrorHandling (>= 2.0 < 3.0) + FSharp.Core (>= 10.0.102 < 11.0) + Microsoft.Extensions.Logging (>= 10.0.2) + Microsoft.Extensions.Logging.Console (>= 10.0.2 < 11.0) + Serilog (>= 4.3 < 5.0) + Serilog.Extensions.Logging (>= 10.0 < 11.0) + Serilog.Sinks.Console (>= 6.1.1 < 7.0) + Alma.Metrics (12.0) + Alma.ServiceIdentification (>= 11.0 < 12.0) + Feather.ErrorHandling (>= 2.0 < 3.0) + FSharp.Core (>= 10.0.102 < 11.0) + Alma.Serializer (9.0) + FSharp.Core (>= 10.0.102 < 11.0) + FSharp.Data (>= 6.6 < 7.0) + Newtonsoft.Json (>= 13.0.4 < 14.0) + Alma.ServiceIdentification (11.0) + FSharp.Core (>= 10.0.102 < 11.0) + Alma.State (11.0) + Feather.ErrorHandling (>= 2.0 < 3.0) + FSharp.Core (>= 10.0.102 < 11.0) + Alma.Tracing (13.0) + Alma.Logging (>= 12.0 < 13.0) + Alma.State (>= 11.0 < 12.0) + Feather.ErrorHandling (>= 2.0 < 3.0) + FSharp.Core (>= 10.0.102 < 11.0) + FSharp.Data (>= 6.6 < 7.0) + Microsoft.AspNetCore.Http (>= 2.3.9 < 3.0) + Microsoft.Extensions.Logging (>= 10.0.2 < 11.0) + OpenTelemetry (>= 1.15 < 2.0) + OpenTelemetry.Api (>= 1.15 < 2.0) + OpenTelemetry.Exporter.Console (>= 1.15 < 2.0) + OpenTelemetry.Exporter.Jaeger (>= 1.5.1 < 2.0) + OpenTelemetry.Extensions.Propagators (>= 1.15 < 2.0) + OpenTelemetry.Instrumentation.Http (>= 1.15 < 2.0) + Alma.WebApplication (14.0) + Alma.JsonApi (>= 11.0 < 12.0) + Alma.Metrics (>= 12.0 < 13.0) + FSharp.Core (>= 10.0.102 < 11.0) + FSharp.Data (>= 6.6 < 7.0) + FsHttp (>= 15.0.3 < 16.0) + Giraffe (>= 8.2 < 9.0) + BCrypt.Net-Core (1.6) + Casbin.NET (2.21.2) + CsvHelper (>= 32.0.3) + DotNet.Glob (>= 3.1.3) + DynamicExpresso.Core (>= 2.16.1) + Microsoft.Extensions.Configuration.Ini (>= 9.0.0-preview.4.24266.19) + Microsoft.Extensions.Logging (>= 9.0.0-preview.4.24266.19) + System.Memory (>= 4.5.5) + CsvHelper (33.1) + DotNet.Glob (3.1.3) + DynamicExpresso.Core (2.19.3) + Microsoft.CSharp (>= 4.7) + Feather.Contracts (1.0) + Google.Protobuf (>= 3.33.5 < 4.0) + Grpc.Net.Client (>= 2.76 < 3.0) + Feather.Cryptography (2.3) + BCrypt.Net-Core (>= 1.6 < 2.0) + Feather.ErrorHandling (>= 2.0 < 3.0) + FSharp.Core (>= 10.0.102 < 11.0) + Feather.ErrorHandling (2.0) + FSharp.Core (>= 10.0.100 < 11.0) + FSharp.Control.AsyncSeq (4.15) + FSharp.Core (>= 4.7.2) + Microsoft.Bcl.AsyncInterfaces (>= 10.0.6) + System.Threading.Channels (>= 10.0.6) + FSharp.Core (10.1.302) + FSharp.Data (6.7) + FSharp.Core (>= 6.0.1) + FSharp.Data.Csv.Core (>= 6.7) + FSharp.Data.Html.Core (>= 6.7) + FSharp.Data.Http (>= 6.7) + FSharp.Data.Json.Core (>= 6.7) + FSharp.Data.Runtime.Utilities (>= 6.7) + FSharp.Data.WorldBank.Core (>= 6.7) + FSharp.Data.Xml.Core (>= 6.7) + FSharp.Data.Csv.Core (8.2) + FSharp.Core (>= 6.0.1) + FSharp.Data.Runtime.Utilities (>= 8.2) + FSharp.Data.Html.Core (8.2) + FSharp.Core (>= 6.0.1) + FSharp.Data.Csv.Core (>= 8.2) + FSharp.Data.Json.Core (>= 8.2) + FSharp.Data.Runtime.Utilities (>= 8.2) + FSharp.Data.Http (8.2) + FSharp.Core (>= 6.0.1) + FSharp.Data.Json.Core (8.2) + FSharp.Core (>= 6.0.1) + FSharp.Data.Http (>= 8.2) + FSharp.Data.Runtime.Utilities (>= 8.2) + FSharp.Data.Runtime.Utilities (8.2) + FSharp.Core (>= 6.0.1) + FSharp.Data.Http (>= 8.2) + FSharp.Data.WorldBank.Core (8.2) + FSharp.Core (>= 6.0.1) + FSharp.Data.Http (>= 8.2) + FSharp.Data.Json.Core (>= 8.2) + FSharp.Data.Runtime.Utilities (>= 8.2) + FSharp.Data.Xml.Core (8.2) + FSharp.Core (>= 6.0.1) + FSharp.Data.Http (>= 8.2) + FSharp.Data.Json.Core (>= 8.2) + FSharp.Data.Runtime.Utilities (>= 8.2) + FSharp.SystemTextJson (1.4.36) + FSharp.Core (>= 4.7) + System.Text.Json (>= 6.0.10) + FsHttp (15.0.3) + FSharp.Core (>= 5.0.2) + gfoidl.Analyzers (0.2) + gfoidl.Base64 (1.1.2) + gfoidl.Analyzers (>= 0.2) + Giraffe (8.3) + FSharp.Core (>= 6.0) + FSharp.SystemTextJson (>= 1.3.13) + Giraffe.ViewEngine (>= 1.4) + Microsoft.IO.RecyclableMemoryStream (>= 3.0.1) + System.Text.Json (>= 8.0.6) + Giraffe.ViewEngine (1.4) + FSharp.Core (>= 5.0) + Google.Protobuf (3.35.1) + Grpc.Core.Api (2.80) + Grpc.Net.Client (2.80) + Grpc.Net.Common (>= 2.80) + Microsoft.Extensions.Logging.Abstractions (>= 8.0) + Grpc.Net.Common (2.80) + Grpc.Core.Api (>= 2.80) + JsonWebToken (1.9.4) + gfoidl.Base64 (>= 1.1.1) + Microsoft.AspNetCore.Http (2.3.11) + Microsoft.AspNetCore.Http.Abstractions (>= 2.3.10) + Microsoft.AspNetCore.WebUtilities (>= 2.3.10) + Microsoft.Extensions.ObjectPool (>= 8.0.11) + Microsoft.Extensions.Options (>= 8.0.2) + Microsoft.Net.Http.Headers (>= 2.3.10) + Microsoft.AspNetCore.Http.Abstractions (2.3.11) + Microsoft.AspNetCore.Http.Features (>= 2.3.10) + System.Text.Encodings.Web (>= 8.0) + Microsoft.AspNetCore.Http.Features (5.0.17) + Microsoft.Extensions.Primitives (>= 5.0.1) + System.IO.Pipelines (>= 5.0.2) + Microsoft.AspNetCore.WebUtilities (10.0.10) + Microsoft.Net.Http.Headers (>= 10.0.10) + Microsoft.Bcl.AsyncInterfaces (10.0.10) + Microsoft.Bcl.Cryptography (10.0.10) + Microsoft.CSharp (4.7) + Microsoft.Extensions.Configuration (10.0.10) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Microsoft.Extensions.Configuration.Abstractions (10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Microsoft.Extensions.Configuration.Binder (10.0.10) + Microsoft.Extensions.Configuration (>= 10.0.10) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) + Microsoft.Extensions.Configuration.EnvironmentVariables (10.0.10) + Microsoft.Extensions.Configuration (>= 10.0.10) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) + Microsoft.Extensions.Configuration.FileExtensions (10.0.10) + Microsoft.Extensions.Configuration (>= 10.0.10) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) + Microsoft.Extensions.FileProviders.Abstractions (>= 10.0.10) + Microsoft.Extensions.FileProviders.Physical (>= 10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Microsoft.Extensions.Configuration.Ini (10.0.10) + Microsoft.Extensions.Configuration (>= 10.0.10) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) + Microsoft.Extensions.Configuration.FileExtensions (>= 10.0.10) + Microsoft.Extensions.FileProviders.Abstractions (>= 10.0.10) + Microsoft.Extensions.DependencyInjection (10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (10.0.10) + Microsoft.Extensions.Diagnostics.Abstractions (10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) + Microsoft.Extensions.Options (>= 10.0.10) + Microsoft.Extensions.FileProviders.Abstractions (10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Microsoft.Extensions.FileProviders.Physical (10.0.10) + Microsoft.Extensions.FileProviders.Abstractions (>= 10.0.10) + Microsoft.Extensions.FileSystemGlobbing (>= 10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Microsoft.Extensions.FileSystemGlobbing (10.0.10) + Microsoft.Extensions.Logging (10.0.10) + Microsoft.Extensions.DependencyInjection (>= 10.0.10) + Microsoft.Extensions.Logging.Abstractions (>= 10.0.10) + Microsoft.Extensions.Options (>= 10.0.10) + Microsoft.Extensions.Logging.Abstractions (10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) + Microsoft.Extensions.Logging.Configuration (10.0.10) + Microsoft.Extensions.Configuration (>= 10.0.10) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) + Microsoft.Extensions.Configuration.Binder (>= 10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) + Microsoft.Extensions.Logging (>= 10.0.10) + Microsoft.Extensions.Logging.Abstractions (>= 10.0.10) + Microsoft.Extensions.Options (>= 10.0.10) + Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.10) + Microsoft.Extensions.Logging.Console (10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) + Microsoft.Extensions.Logging (>= 10.0.10) + Microsoft.Extensions.Logging.Abstractions (>= 10.0.10) + Microsoft.Extensions.Logging.Configuration (>= 10.0.10) + Microsoft.Extensions.Options (>= 10.0.10) + Microsoft.Extensions.ObjectPool (10.0.10) + Microsoft.Extensions.Options (10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Microsoft.Extensions.Options.ConfigurationExtensions (10.0.10) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) + Microsoft.Extensions.Configuration.Binder (>= 10.0.10) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) + Microsoft.Extensions.Options (>= 10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Microsoft.Extensions.Primitives (10.0.10) + Microsoft.IdentityModel.Abstractions (8.22) + Microsoft.IdentityModel.JsonWebTokens (8.22) + Microsoft.IdentityModel.Tokens (>= 8.22) + Microsoft.IdentityModel.Logging (8.22) + Microsoft.IdentityModel.Abstractions (>= 8.22) + Microsoft.IdentityModel.Tokens (8.22) + Microsoft.Bcl.Cryptography (>= 10.0.2) + Microsoft.Extensions.Logging.Abstractions (>= 8.0) + Microsoft.IdentityModel.Logging (>= 8.22) + Microsoft.IO.RecyclableMemoryStream (3.0.1) + Microsoft.Net.Http.Headers (10.0.10) + Microsoft.Extensions.Primitives (>= 10.0.10) + Newtonsoft.Json (13.0.4) + OpenTelemetry (1.17) + Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0) + Microsoft.Extensions.Diagnostics.Abstractions (>= 10.0) + Microsoft.Extensions.Logging.Configuration (>= 10.0) + OpenTelemetry.Api.ProviderBuilderExtensions (>= 1.17) + OpenTelemetry.Api (1.17) + OpenTelemetry.Api.ProviderBuilderExtensions (1.17) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0) + OpenTelemetry.Api (>= 1.17) + OpenTelemetry.Exporter.Console (1.17) + OpenTelemetry (>= 1.17) + OpenTelemetry.Exporter.Jaeger (1.5.1) + OpenTelemetry (>= 1.5.1) + System.Threading.Tasks.Extensions (>= 4.5.4) + OpenTelemetry.Extensions.Propagators (1.17) + OpenTelemetry.Api (>= 1.17) + OpenTelemetry.Instrumentation.Http (1.17) + Microsoft.Extensions.Configuration (>= 10.0) + Microsoft.Extensions.Options (>= 10.0) + OpenTelemetry.Api.ProviderBuilderExtensions (>= 1.17 < 2.0) + Portable.BouncyCastle (1.9) + Serilog (4.4) + Serilog.Extensions.Logging (10.0) + Microsoft.Extensions.Logging (>= 10.0) + Serilog (>= 4.2) + Serilog.Sinks.Console (6.1.1) + Serilog (>= 4.0) + System.IdentityModel.Tokens.Jwt (8.22) + Microsoft.IdentityModel.JsonWebTokens (>= 8.22) + Microsoft.IdentityModel.Tokens (>= 8.22) + System.IO.Pipelines (10.0.10) + System.Memory (4.6.3) + System.Text.Encodings.Web (10.0.10) + System.Text.Json (10.0.10) + System.Threading.Channels (10.0.10) + System.Threading.Tasks.Extensions (4.6.3) + +GROUP Build +STORAGE: NONE +NUGET + remote: https://api.nuget.org/v3/index.json + BlackFox.VsWhere (1.1) - restriction: >= netstandard2.0 + FSharp.Core (>= 4.0.0.1) - restriction: >= net45 + FSharp.Core (>= 4.2.3) - restriction: && (< net45) (>= netstandard2.0) + Microsoft.Win32.Registry (>= 4.7) - restriction: && (< net45) (>= netstandard2.0) + Fake.Core.CommandLineParsing (6.1.4) - restriction: >= netstandard2.0 + FParsec (>= 1.1.1) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.Context (6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.Environment (6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.FakeVar (6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Context (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.Process (6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.FakeVar (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + System.Collections.Immutable (>= 8.0) - restriction: >= netstandard2.0 + Fake.Core.ReleaseNotes (6.1.4) + Fake.Core.SemVer (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.SemVer (6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.String (6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.Target (6.1.4) + Fake.Core.CommandLineParsing (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Context (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.FakeVar (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Process (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Control.Reactive (>= 5.0.2) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.Tasks (6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.Trace (6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.FakeVar (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.UserInput (6.1.4) + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Core.Xml (6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.DotNet.AssemblyInfoFile (6.1.4) + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.DotNet.Cli (6.1.4) + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Process (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.DotNet.MSBuild (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.DotNet.NuGet (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Mono.Posix.NETStandard (>= 1.0) - restriction: >= netstandard2.0 + Fake.DotNet.MSBuild (6.1.4) - restriction: >= netstandard2.0 + BlackFox.VsWhere (>= 1.1) - restriction: >= netstandard2.0 + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Process (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + MSBuild.StructuredLogger (>= 2.1.815) - restriction: >= netstandard2.0 + Fake.DotNet.NuGet (6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Process (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.SemVer (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Tasks (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Xml (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Net.Http (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Newtonsoft.Json (>= 13.0.3) - restriction: >= netstandard2.0 + NuGet.Protocol (>= 6.12.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (6.1.4) + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.IO.Zip (6.1.4) + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Net.Http (6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + Fake.Tools.Git (6.1.4) + Fake.Core.Environment (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Process (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.SemVer (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.String (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.Core.Trace (>= 6.1.4) - restriction: >= netstandard2.0 + Fake.IO.FileSystem (>= 6.1.4) - restriction: >= netstandard2.0 + FSharp.Core (>= 8.0.400) - restriction: >= netstandard2.0 + FParsec (1.1.1) - restriction: >= netstandard2.0 + FSharp.Core (>= 4.3.4) - restriction: || (>= net45) (>= netstandard2.0) + System.ValueTuple (>= 4.4) - restriction: >= net45 + FSharp.Control.Reactive (6.1.2) - restriction: >= netstandard2.0 + FSharp.Core (>= 6.0.7) - restriction: >= netstandard2.0 + System.Reactive (>= 6.0.1) - restriction: >= netstandard2.0 + FSharp.Core (10.1.302) - restriction: >= netstandard2.0 + Microsoft.Bcl.AsyncInterfaces (10.0.10) - restriction: >= net472 + System.Threading.Tasks.Extensions (>= 4.6.3) - restriction: || (>= net462) (&& (>= netstandard2.0) (< netstandard2.1)) + Microsoft.Bcl.Cryptography (10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (>= net462) (>= net8.0)) (&& (>= net462) (>= net9.0)) (&& (>= net8.0) (< net9.0)) (&& (>= net8.0) (< netstandard2.1)) (&& (>= net9.0) (< netstandard2.1)) + System.Formats.Asn1 (>= 10.0.10) - restriction: || (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.1)) (&& (>= netstandard2.0) (< netstandard2.1)) + Microsoft.Build.Framework (18.8.2) - restriction: >= netstandard2.0 + Microsoft.IO.Redist (>= 6.1) - restriction: >= net472 + Microsoft.NET.StringTools (>= 18.8.2) - restriction: >= netstandard2.0 + System.Collections.Immutable (>= 10.0.4) - restriction: >= net472 + System.Memory (>= 4.6.3) - restriction: || (&& (< net10.0) (>= netstandard2.0)) (>= net472) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (&& (< net10.0) (>= netstandard2.0)) (>= net472) + System.Text.Json (>= 10.0.4) - restriction: >= net472 + System.Threading.Tasks.Extensions (>= 4.6.3) - restriction: >= net472 + System.ValueTuple (>= 4.6.1) - restriction: >= net472 + Microsoft.Build.Utilities.Core (18.8.2) - restriction: >= netstandard2.0 + Microsoft.Build.Framework (>= 18.8.2) - restriction: >= netstandard2.0 + Microsoft.IO.Redist (>= 6.1) - restriction: >= net472 + System.Collections.Immutable (>= 10.0.4) - restriction: >= net472 + System.Configuration.ConfigurationManager (>= 10.0.4) - restriction: || (>= net10.0) (>= net472) + System.Diagnostics.EventLog (>= 10.0.4) - restriction: >= net10.0 + System.Memory (>= 4.6.3) - restriction: || (&& (< net10.0) (>= netstandard2.0)) (>= net472) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (&& (< net10.0) (>= netstandard2.0)) (>= net472) + System.Security.Cryptography.ProtectedData (>= 10.0.4) - restriction: >= net10.0 + System.Text.Json (>= 10.0.4) - restriction: >= net472 + System.Threading.Tasks.Extensions (>= 4.6.3) - restriction: >= net472 + System.ValueTuple (>= 4.6.1) - restriction: >= net472 + Microsoft.IO.Redist (6.1.3) - restriction: >= net472 + System.Buffers (>= 4.6.1) - restriction: >= net472 + System.Memory (>= 4.6.3) - restriction: >= net472 + Microsoft.NET.StringTools (18.8.2) - restriction: || (>= net10.0) (>= net472) + System.Memory (>= 4.6.3) - restriction: || (&& (< net10.0) (>= netstandard2.0)) (>= net472) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (&& (< net10.0) (>= netstandard2.0)) (>= net472) + Microsoft.NETCore.Platforms (7.0.4) - restriction: || (&& (>= monoandroid) (>= netcoreapp2.0) (< netstandard1.3)) (&& (>= monoandroid) (>= netcoreapp2.1) (< netstandard1.3)) (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1)) (&& (>= monotouch) (>= netcoreapp2.0)) (&& (>= monotouch) (>= netcoreapp2.1)) (&& (>= net461) (>= netcoreapp2.0)) (&& (>= net461) (>= netcoreapp2.1)) (&& (>= netcoreapp2.0) (< netcoreapp2.1) (>= xamarinios)) (&& (>= netcoreapp2.0) (< netcoreapp2.1) (>= xamarinmac)) (&& (>= netcoreapp2.0) (< netcoreapp2.1) (>= xamarintvos)) (&& (>= netcoreapp2.0) (< netcoreapp2.1) (>= xamarinwatchos)) (&& (>= netcoreapp2.0) (>= uap10.1)) (&& (< netcoreapp2.0) (>= netcoreapp2.1)) (&& (>= netcoreapp2.1) (< netcoreapp3.0)) (&& (>= netcoreapp2.1) (>= uap10.1)) + Microsoft.Win32.Registry (5.0) - restriction: && (< net45) (>= netstandard2.0) + System.Buffers (>= 4.5.1) - restriction: || (&& (>= monoandroid) (< netstandard1.3)) (>= monotouch) (&& (< net46) (< netcoreapp2.0) (>= netstandard2.0)) (>= xamarinios) (>= xamarinmac) (>= xamarintvos) (>= xamarinwatchos) + System.Memory (>= 4.5.4) - restriction: || (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< net46) (< netcoreapp2.0) (>= netstandard2.0) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (>= uap10.1) + System.Security.AccessControl (>= 5.0) - restriction: || (&& (>= monoandroid) (< netstandard1.3)) (&& (< monoandroid) (>= netcoreapp2.0)) (>= monotouch) (&& (< net46) (< netcoreapp2.0) (>= netstandard2.0)) (>= net461) (>= netcoreapp2.1) (>= uap10.1) (>= xamarinios) (>= xamarinmac) (>= xamarintvos) (>= xamarinwatchos) + System.Security.Principal.Windows (>= 5.0) - restriction: || (&& (>= monoandroid) (< netstandard1.3)) (&& (< monoandroid) (>= netcoreapp2.0)) (>= monotouch) (&& (< net46) (< netcoreapp2.0) (>= netstandard2.0)) (>= net461) (>= netcoreapp2.1) (>= uap10.1) (>= xamarinios) (>= xamarinmac) (>= xamarintvos) (>= xamarinwatchos) + Mono.Posix.NETStandard (1.0) - restriction: >= netstandard2.0 + MSBuild.StructuredLogger (2.3.213) - restriction: >= netstandard2.0 + Microsoft.Build.Framework (>= 17.5) - restriction: >= netstandard2.0 + Microsoft.Build.Utilities.Core (>= 17.5) - restriction: >= netstandard2.0 + System.Collections.Immutable (>= 8.0) - restriction: && (< net10.0) (>= netstandard2.0) + System.Memory (>= 4.6) - restriction: && (< net10.0) (>= netstandard2.0) + System.Runtime.CompilerServices.Unsafe (>= 6.1) - restriction: && (< net10.0) (>= netstandard2.0) + Newtonsoft.Json (13.0.4) - restriction: >= netstandard2.0 + NuGet.Common (7.6) - restriction: || (>= net472) (>= net8.0) + NuGet.Frameworks (>= 7.6) - restriction: || (>= net472) (>= net8.0) + System.Collections.Immutable (>= 8.0) - restriction: >= net472 + NuGet.Configuration (7.6) - restriction: || (>= net472) (>= net8.0) + NuGet.Common (>= 7.6) - restriction: || (>= net472) (>= net8.0) + System.Security.Cryptography.ProtectedData (>= 8.0) - restriction: >= net8.0 + NuGet.Frameworks (7.6) - restriction: || (>= net472) (>= net8.0) + NuGet.Packaging (7.6) - restriction: || (>= net472) (>= net8.0) + Newtonsoft.Json (>= 13.0.3) - restriction: || (>= net472) (>= net8.0) + NuGet.Configuration (>= 7.6) - restriction: || (>= net472) (>= net8.0) + NuGet.Versioning (>= 7.6) - restriction: || (>= net472) (>= net8.0) + System.Security.Cryptography.Pkcs (>= 8.0.1) - restriction: >= net8.0 + System.Text.Json (>= 8.0.5) - restriction: >= net472 + NuGet.Protocol (7.6) - restriction: >= netstandard2.0 + NuGet.Packaging (>= 7.6) - restriction: || (>= net472) (>= net8.0) + System.Text.Json (>= 8.0.5) - restriction: >= net472 + NuGet.Versioning (7.6) - restriction: || (>= net472) (>= net8.0) + System.Buffers (4.6.1) - restriction: || (&& (>= monoandroid) (< netstandard1.3) (>= netstandard2.0)) (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1) (< netstandard2.1) (< xamarintvos) (< xamarinwatchos)) (&& (>= monotouch) (>= netcoreapp2.0)) (&& (>= monotouch) (>= netstandard2.0)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0)) (&& (>= net462) (>= netcoreapp2.0)) (&& (>= net462) (>= netstandard2.0)) (>= net472) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) (&& (>= netstandard2.0) (>= uap10.1)) (&& (>= netstandard2.0) (>= xamarintvos)) (&& (>= netstandard2.0) (>= xamarinwatchos)) (>= xamarinios) (>= xamarinmac) + System.Collections.Immutable (10.0.10) - restriction: >= netstandard2.0 + System.Memory (>= 4.6.3) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Configuration.ConfigurationManager (10.0.10) - restriction: || (>= net10.0) (>= net472) + System.Diagnostics.EventLog (>= 10.0.10) - restriction: >= net8.0 + System.Security.Cryptography.ProtectedData (>= 10.0.10) - restriction: || (&& (< net462) (>= netstandard2.0)) (>= net8.0) + System.Diagnostics.DiagnosticSource (10.0.10) - restriction: >= net472 + System.Memory (>= 4.6.3) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Diagnostics.EventLog (10.0.10) - restriction: || (>= net10.0) (&& (>= net472) (>= net8.0)) + System.Formats.Asn1 (10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (>= net462) (>= net8.0)) (&& (>= net462) (>= net9.0)) (&& (>= net8.0) (< net9.0)) (&& (>= net8.0) (< netstandard2.1)) (&& (< net8.0) (>= net9.0)) (&& (>= net9.0) (< netstandard2.1)) + System.IO.Pipelines (10.0.10) - restriction: >= net472 + System.Buffers (>= 4.6.1) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Memory (>= 4.6.3) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Threading.Tasks.Extensions (>= 4.6.3) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Memory (4.6.3) - restriction: || (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (>= net462) (>= netcoreapp2.0)) (&& (>= net462) (>= netstandard2.0)) (>= net472) (&& (< net8.0) (>= netstandard2.0)) (&& (>= netcoreapp2.0) (>= uap10.1)) (&& (>= netstandard2.0) (>= uap10.1)) + System.Buffers (>= 4.6.1) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) + System.Numerics.Vectors (>= 4.6.1) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) + System.Numerics.Vectors (4.6.1) - restriction: || (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1) (< netstandard2.1) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0) (< netstandard2.1) (< xamarintvos) (< xamarinwatchos)) (&& (>= net462) (>= netcoreapp2.0)) (&& (>= net462) (>= netstandard2.0)) (>= net472) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) (&& (>= netstandard2.0) (>= uap10.1)) + System.Reactive (6.1) - restriction: >= netstandard2.0 + System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (>= net472) (&& (< net6.0) (>= netstandard2.0)) (>= uap10.1) + System.Runtime.CompilerServices.Unsafe (6.1.2) - restriction: || (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1) (< netstandard2.1) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0) (< netstandard2.1) (< xamarintvos) (< xamarinwatchos)) (&& (>= net462) (>= netcoreapp2.0)) (&& (>= net462) (>= netstandard2.0)) (>= net472) (&& (< net8.0) (>= netstandard2.0)) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) (&& (>= netstandard2.0) (>= uap10.1)) + System.Security.AccessControl (6.0.1) - restriction: || (&& (>= monoandroid) (< netstandard1.3) (>= netstandard2.0)) (&& (< monoandroid) (>= netcoreapp2.0)) (&& (>= monotouch) (>= netstandard2.0)) (&& (< net45) (>= net461) (>= netstandard2.0)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0)) (>= netcoreapp2.1) (&& (>= netstandard2.0) (>= uap10.1)) (&& (>= netstandard2.0) (>= xamarintvos)) (&& (>= netstandard2.0) (>= xamarinwatchos)) (>= xamarinios) (>= xamarinmac) + System.Security.Principal.Windows (>= 5.0) - restriction: || (>= net461) (&& (< net6.0) (>= netstandard2.0)) + System.Security.Cryptography.Pkcs (10.0.10) - restriction: >= net8.0 + Microsoft.Bcl.Cryptography (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.1)) (&& (>= netstandard2.0) (< netstandard2.1)) + System.Formats.Asn1 (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (< net462) (>= netstandard2.0) (< netstandard2.1)) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.1)) + System.Security.Cryptography.ProtectedData (10.0.10) - restriction: || (&& (< net462) (>= net472)) (>= net8.0) + System.Security.Principal.Windows (5.0) - restriction: || (&& (>= monoandroid) (< netstandard1.3) (>= netstandard2.0)) (&& (< monoandroid) (>= netcoreapp2.0)) (&& (>= monotouch) (>= netcoreapp2.0)) (&& (>= monotouch) (>= netstandard2.0)) (&& (< net45) (>= net461) (>= netstandard2.0)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0)) (&& (>= net461) (>= netcoreapp2.0)) (&& (>= netcoreapp2.0) (>= uap10.1)) (&& (>= netcoreapp2.0) (>= xamarintvos)) (&& (>= netcoreapp2.0) (>= xamarinwatchos)) (>= netcoreapp2.1) (&& (>= netstandard2.0) (>= uap10.1)) (&& (>= netstandard2.0) (>= xamarintvos)) (&& (>= netstandard2.0) (>= xamarinwatchos)) (>= xamarinios) (>= xamarinmac) + Microsoft.NETCore.Platforms (>= 5.0) - restriction: || (&& (>= netcoreapp2.0) (< netcoreapp2.1)) (&& (>= netcoreapp2.1) (< netcoreapp3.0)) + System.Text.Encodings.Web (10.0.10) - restriction: >= net472 + System.Buffers (>= 4.6.1) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Memory (>= 4.6.3) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Text.Json (10.0.10) - restriction: >= net472 + Microsoft.Bcl.AsyncInterfaces (>= 10.0.10) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Buffers (>= 4.6.1) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.IO.Pipelines (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Memory (>= 4.6.3) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Text.Encodings.Web (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Threading.Tasks.Extensions (>= 4.6.3) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.ValueTuple (>= 4.6.2) - restriction: >= net462 + System.Threading.Tasks.Extensions (4.6.3) - restriction: || (>= net472) (&& (< net6.0) (>= netstandard2.0)) (&& (>= netstandard2.0) (>= uap10.1)) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) + System.ValueTuple (4.6.2) - restriction: || (&& (>= net45) (>= netstandard2.0)) (>= net472) + +GROUP Tests +NUGET + remote: https://api.nuget.org/v3/index.json + Azure.Core (1.60) - restriction: >= net8.0 + Microsoft.Bcl.AsyncInterfaces (>= 10.0.9) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.9) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Hosting.Abstractions (>= 10.0.9) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Identity.Client (>= 4.84.2) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Identity.Client.Extensions.Msal (>= 4.84.2) - restriction: || (>= net462) (>= netstandard2.0) + System.ClientModel (>= 1.14) - restriction: || (>= net462) (>= netstandard2.0) + System.Diagnostics.DiagnosticSource (>= 10.0.9) - restriction: || (&& (< net10.0) (>= net8.0)) (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Memory.Data (>= 10.0.9) - restriction: || (>= net462) (>= netstandard2.0) + System.Text.Encodings.Web (>= 10.0.9) - restriction: || (&& (< net10.0) (>= net8.0)) (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Text.Json (>= 10.0.9) - restriction: || (&& (< net10.0) (>= net8.0)) (>= net462) (&& (< net8.0) (>= netstandard2.0)) + Azure.Monitor.OpenTelemetry.Exporter (1.8.3) - restriction: >= net8.0 + Azure.Core (>= 1.60) - restriction: >= netstandard2.0 + OpenTelemetry.Extensions.Hosting (>= 1.15.3) - restriction: >= netstandard2.0 + OpenTelemetry.PersistentStorage.FileSystem (>= 1.0.3) - restriction: >= netstandard2.0 + Expecto (11.1) + FSharp.Core (>= 7.0.200) - restriction: >= netstandard2.0 + Mono.Cecil (>= 0.11.6 < 1.0) - restriction: >= netstandard2.0 + System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: && (< net8.0) (>= netstandard2.0) + FSharp.Core (10.1.302) - restriction: >= netstandard2.0 + Microsoft.ApplicationInsights (3.1.2) - restriction: >= net8.0 + Azure.Monitor.OpenTelemetry.Exporter (>= 1.8) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Bcl.AsyncInterfaces (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Configuration (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Primitives (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Abstractions (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Primitives (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Binder (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Configuration (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.EnvironmentVariables (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Configuration (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.DependencyInjection (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.DependencyInjection.Abstractions (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Diagnostics.Abstractions (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Options (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + System.Diagnostics.DiagnosticSource (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + Microsoft.Extensions.FileProviders.Abstractions (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Primitives (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Hosting.Abstractions (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Diagnostics.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.FileProviders.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Logging.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Logging (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.DependencyInjection (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Logging.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Options (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Logging.Abstractions (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + System.Diagnostics.DiagnosticSource (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + Microsoft.Extensions.Logging.Configuration (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Configuration (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Binder (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Logging (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Logging.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Options (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Options (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Primitives (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Options.ConfigurationExtensions (10.0.10) - restriction: >= net8.0 + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Configuration.Binder (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Options (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Primitives (>= 10.0.10) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.Extensions.Primitives (10.0.10) - restriction: >= net8.0 + Microsoft.Identity.Client (4.87) - restriction: >= net8.0 + Microsoft.IdentityModel.Abstractions (>= 8.14) - restriction: || (>= net462) (>= netstandard2.0) + System.Diagnostics.DiagnosticSource (>= 6.0.1) - restriction: || (>= net462) (&& (>= net8.0) (< net8.0-android) (< net8.0-ios)) (&& (< net8.0) (>= netstandard2.0)) + Microsoft.Identity.Client.Extensions.Msal (4.87) - restriction: >= net8.0 + Microsoft.Identity.Client (>= 4.87) - restriction: >= netstandard2.0 + System.Security.Cryptography.ProtectedData (>= 4.5) - restriction: >= netstandard2.0 + Microsoft.IdentityModel.Abstractions (8.22) - restriction: >= net8.0 + Microsoft.Testing.Extensions.Telemetry (2.3.3) - restriction: >= net8.0 + Microsoft.ApplicationInsights (>= 2.23) - restriction: >= netstandard2.0 + Microsoft.Testing.Platform (>= 2.3.3) - restriction: >= netstandard2.0 + Microsoft.Testing.Extensions.TrxReport.Abstractions (2.3.3) - restriction: >= net8.0 + Microsoft.Testing.Platform (>= 2.3.3) - restriction: >= netstandard2.0 + Microsoft.Testing.Extensions.VSTestBridge (2.3.3) - restriction: >= net8.0 + Microsoft.Testing.Extensions.Telemetry (>= 2.3.3) - restriction: >= netstandard2.0 + Microsoft.Testing.Extensions.TrxReport.Abstractions (>= 2.3.3) - restriction: >= netstandard2.0 + Microsoft.Testing.Platform (>= 2.3.3) - restriction: >= netstandard2.0 + Microsoft.TestPlatform.ObjectModel (>= 18.4) - restriction: >= netstandard2.0 + Microsoft.Testing.Platform (2.3.3) - restriction: >= net8.0 + Microsoft.Testing.Platform.MSBuild (2.3.3) - restriction: >= net8.0 + Microsoft.Testing.Platform (>= 2.3.3) - restriction: >= netstandard2.0 + Microsoft.TestPlatform.ObjectModel (18.8.1) - restriction: >= net8.0 + System.Reflection.Metadata (>= 8.0) - restriction: || (>= net462) (>= netstandard2.0) + Mono.Cecil (0.11.6) - restriction: >= netstandard2.0 + OpenTelemetry (1.17) - restriction: >= net8.0 + Microsoft.Extensions.Configuration.EnvironmentVariables (>= 8.0) - restriction: && (>= net8.0) (< net9.0) + Microsoft.Extensions.Configuration.EnvironmentVariables (>= 9.0) - restriction: && (< net10.0) (>= net9.0) + Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0) - restriction: || (>= net10.0) (>= net462) (&& (< net8.0) (>= netstandard2.1)) (&& (>= netstandard2.0) (< netstandard2.1)) + Microsoft.Extensions.Diagnostics.Abstractions (>= 8.0) - restriction: && (>= net8.0) (< net9.0) + Microsoft.Extensions.Diagnostics.Abstractions (>= 9.0) - restriction: && (< net10.0) (>= net9.0) + Microsoft.Extensions.Diagnostics.Abstractions (>= 10.0) - restriction: || (>= net10.0) (>= net462) (&& (< net8.0) (>= netstandard2.1)) (&& (>= netstandard2.0) (< netstandard2.1)) + Microsoft.Extensions.Logging.Configuration (>= 8.0) - restriction: && (>= net8.0) (< net9.0) + Microsoft.Extensions.Logging.Configuration (>= 9.0) - restriction: && (< net10.0) (>= net9.0) + Microsoft.Extensions.Logging.Configuration (>= 10.0) - restriction: || (>= net10.0) (>= net462) (&& (< net8.0) (>= netstandard2.1)) (&& (>= netstandard2.0) (< netstandard2.1)) + OpenTelemetry.Api.ProviderBuilderExtensions (>= 1.17) - restriction: || (>= net462) (>= netstandard2.0) + OpenTelemetry.Api (1.17) - restriction: >= net8.0 + System.Diagnostics.DiagnosticSource (>= 10.0) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + OpenTelemetry.Api.ProviderBuilderExtensions (1.17) - restriction: >= net8.0 + Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0) - restriction: && (>= net8.0) (< net9.0) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0) - restriction: && (< net10.0) (>= net9.0) + Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0) - restriction: || (>= net10.0) (>= net462) (&& (< net8.0) (>= netstandard2.0)) + OpenTelemetry.Api (>= 1.17) - restriction: || (>= net462) (>= netstandard2.0) + OpenTelemetry.Extensions.Hosting (1.17) - restriction: >= net8.0 + Microsoft.Extensions.Hosting.Abstractions (>= 8.0) - restriction: && (>= net8.0) (< net9.0) + Microsoft.Extensions.Hosting.Abstractions (>= 9.0) - restriction: && (< net10.0) (>= net9.0) + Microsoft.Extensions.Hosting.Abstractions (>= 10.0) - restriction: || (>= net10.0) (>= net462) (&& (< net8.0) (>= netstandard2.0)) + OpenTelemetry (>= 1.17) - restriction: || (>= net462) (>= netstandard2.0) + OpenTelemetry.PersistentStorage.Abstractions (1.1.1) - restriction: >= net8.0 + OpenTelemetry.PersistentStorage.FileSystem (1.1.1) - restriction: >= net8.0 + OpenTelemetry.PersistentStorage.Abstractions (>= 1.1.1) - restriction: || (>= net462) (>= netstandard2.0) + System.ClientModel (1.14) - restriction: >= net8.0 + Microsoft.Extensions.Configuration.Abstractions (>= 10.0.3) - restriction: >= netstandard2.0 + Microsoft.Extensions.Hosting.Abstractions (>= 10.0.3) - restriction: >= netstandard2.0 + Microsoft.Extensions.Logging.Abstractions (>= 10.0.3) - restriction: >= netstandard2.0 + System.Diagnostics.DiagnosticSource (>= 10.0.3) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Memory.Data (>= 10.0.3) - restriction: >= netstandard2.0 + System.Text.Json (>= 10.0.3) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Collections.Immutable (10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (>= net462) (>= net8.0)) (&& (>= net462) (>= net9.0)) (&& (>= net8.0) (< net9.0)) + System.Diagnostics.DiagnosticSource (10.0.10) - restriction: || (&& (< net10.0) (>= net8.0)) (&& (< net10.0) (>= net9.0)) (&& (>= net462) (>= net8.0)) (&& (>= net462) (>= net9.0)) (&& (>= net8.0) (< net8.0-android) (< net8.0-ios)) (&& (>= net8.0) (< net9.0)) + System.IO.Pipelines (10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (>= net462) (>= net8.0)) (&& (>= net462) (>= net9.0)) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= net9.0)) + System.Memory.Data (10.0.10) - restriction: >= net8.0 + System.Text.Json (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Reflection.Metadata (10.0.10) - restriction: >= net8.0 + System.Collections.Immutable (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Runtime.CompilerServices.Unsafe (6.1.2) - restriction: || (&& (>= net462) (>= netstandard2.0)) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) + System.Security.Cryptography.ProtectedData (10.0.10) - restriction: >= net8.0 + System.Text.Encodings.Web (10.0.10) - restriction: || (&& (< net10.0) (>= net8.0)) (&& (< net10.0) (>= net9.0)) (&& (>= net462) (>= net8.0)) (&& (>= net462) (>= net9.0)) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= net9.0)) + System.Text.Json (10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (&& (>= net462) (>= net8.0)) (&& (>= net462) (>= net9.0)) (&& (>= net8.0) (< net9.0)) + System.IO.Pipelines (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Text.Encodings.Web (>= 10.0.10) - restriction: || (&& (< net10.0) (>= net9.0)) (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Threading.Tasks.Extensions (4.6.3) - restriction: && (< net8.0) (>= netstandard2.0) + System.Runtime.CompilerServices.Unsafe (>= 6.1.2) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0) (< netstandard2.1)) + YoloDev.Expecto.TestSdk (0.16) + Expecto (>= 10.2.3) - restriction: >= net8.0 + FSharp.Core (>= 7.0.200) - restriction: >= net8.0 + Microsoft.Testing.Extensions.VSTestBridge (>= 2.3) - restriction: >= net8.0 + Microsoft.Testing.Platform.MSBuild (>= 2.3) - restriction: >= net8.0 diff --git a/paket.references b/paket.references new file mode 100644 index 0000000..fde7f79 --- /dev/null +++ b/paket.references @@ -0,0 +1,10 @@ +FSharp.Core +FSharp.Data +FSharp.Control.AsyncSeq +Grpc.Net.Client +Alma.Authorization +Alma.ServiceIdentification +Alma.WebApplication +Feather.Contracts +Feather.Cryptography +Feather.ErrorHandling diff --git a/src/Auth.fs b/src/Auth.fs new file mode 100644 index 0000000..cc8a7d9 --- /dev/null +++ b/src/Auth.fs @@ -0,0 +1,27 @@ +namespace Feather.Grpc + +open Grpc.Core +open Feather.ErrorHandling + +type AuthError = + | Unauthenticated of string + | Unauthorized of string + +type AuthInterceptor<'Context> = (ServerCallContext -> Result<'Context, AuthError>) +type AsyncAuthInterceptor<'Context> = (ServerCallContext -> AsyncResult<'Context, AuthError>) + +[] +module AuthInterceptor = + let private raiseOnError = function + | Ok ctx -> ctx + | Error (Unauthenticated msg) -> raise (RpcException(Status(StatusCode.Unauthenticated, msg))) + | Error (Unauthorized msg) -> raise (RpcException(Status(StatusCode.PermissionDenied, msg))) + + let validate (authInterceptor: AuthInterceptor<'Context>) = + authInterceptor >> raiseOnError + + let validateAsync (authInterceptor: AsyncAuthInterceptor<'Context>) context = + async { + let! result = authInterceptor context + return raiseOnError result + } diff --git a/src/CoreTypes.fs b/src/CoreTypes.fs new file mode 100644 index 0000000..5639421 --- /dev/null +++ b/src/CoreTypes.fs @@ -0,0 +1,90 @@ +namespace Feather.Grpc + +open System +open Grpc.Core +open Feather.ErrorHandling +open Alma.Authorization.Common +open Alma.Authorization + +type Timestamp = Timestamp of DateTimeOffset + +[] +module Timestamp = + let now () = + DateTimeOffset.UtcNow + |> Timestamp + + let value (Timestamp timestamp) = timestamp + + let ofContract (contract: Feather.Contracts.Timestamp): Result = + try contract.UnixTimestamp |> DateTimeOffset.FromUnixTimeMilliseconds |> Timestamp |> Ok + with e -> Error (ContractError.ofExn e) + + let asContract (Timestamp timestamp): Feather.Contracts.Timestamp = + Feather.Contracts.Timestamp (UnixTimestamp = timestamp.ToUnixTimeMilliseconds()) + +type CorrelationId = CorrelationId of Guid + +[] +module CorrelationId = + let create (): CorrelationId = + CorrelationId (Guid.NewGuid()) + + let ofJWTId jwt = + match JWT.Raw jwt with + | JWT.HasPayloadValue "jti" (JWT.JWTValue.String jti) -> + jti + |> Guid.tryParse + |> Option.map CorrelationId + | _ -> None + + let uuid (CorrelationId id): Guid = + id + + let value = uuid >> string + + let asContract (CorrelationId id): Feather.Contracts.CorrelationId = + Feather.Contracts.CorrelationId (Id = id.ToString()) + + let ofContract (contract: Feather.Contracts.CorrelationId): Result = + contract.Id + |> Guid.tryParse + |> Option.map CorrelationId + |> Result.ofOption (ContractError.ofError $"Invalid CorrelationId: {contract.Id}") + +open Alma.ServiceIdentification + +[] +module Spot = + let ofContract (contract: Feather.Contracts.Spot): Result = + Create.Spot(string contract.Zone, string contract.Bucket) + |> Result.mapError (ContractError.ofFormattedError (sprintf "Invalid Spot(%A, %A): %A" contract.Zone contract.Bucket)) + + let asContract (spot: Spot): Feather.Contracts.Spot = + Feather.Contracts.Spot (Zone = (spot.Zone |> Zone.value), Bucket = (spot.Bucket |> Bucket.value)) + +[] +module Instance = + let ofContract (contract: Feather.Contracts.Instance): Result = + contract.Instance_ + |> Create.Instance + |> Result.mapError (ContractError.ofFormattedError (sprintf "Invalid Instance: %A")) + + let asContract instance: Feather.Contracts.Instance = + Feather.Contracts.Instance (Instance_ = (instance |> Instance.concat "-")) + +[] +module Box = + let ofContract (contract: Feather.Contracts.Box): Result = + result { + let! instance = contract.Instance |> Instance.ofContract |> Result.mapError (ContractError.map (sprintf "Box.Instance: %s")) + let! spot = contract.Spot |> Spot.ofContract |> Result.mapError (ContractError.map (sprintf "Box.Spot: %s")) + + return Create.Box(instance, spot) + } + + let asContract (box: Box): Feather.Contracts.Box = + Feather.Contracts.Box( + Instance = (box |> Box.instance |> Instance.asContract), + Spot = (box |> Box.spot |> Spot.asContract) + ) diff --git a/src/Error.fs b/src/Error.fs new file mode 100644 index 0000000..07ed979 --- /dev/null +++ b/src/Error.fs @@ -0,0 +1,146 @@ +namespace Feather.Grpc + +open System +open Grpc.Core +open Feather.ErrorHandling + +type ContractError = + | InvalidData of string option + + with + override this.ToString() = + match this with + | InvalidData None -> "Invalid data" + | InvalidData (Some details) -> sprintf "Invalid data: %s" details + +[] +module ContractError = + let ofExn (exn: exn): ContractError = + InvalidData (Some <| sprintf "%s: %s" (exn.GetType().FullName) exn.Message) + + let ofError (error: string): ContractError = + InvalidData (Some error) + + let ofFormattedError (format: 'Error -> string) e: ContractError = + InvalidData (Some (format e)) + + let map f = function + | InvalidData details -> InvalidData (details |> Option.map f) + + let format (contractError: ContractError) = contractError.ToString() + +type GrpcError = + { + Name: string + Message: string option + } + + with + override this.ToString() = + match this with + | { Name = name; Message = Some message } -> sprintf "GrpcError[%s]: %s" name message + | { Name = name } -> sprintf "GrpcError[%s]" name + +[] +module GrpcError = + let create name message = { + Name = name + Message = message + } + + let asContract (err: GrpcError): Feather.Contracts.Error = + Feather.Contracts.Error( + Name = err.Name, + Message = (err.Message |> Option.defaultValue "") + ) + + let ofContract (contract: Feather.Contracts.Error): GrpcError = + { + Name = try contract.Name with _ -> "Contracts.Error.Null" + Message = + try + match contract.Message with + | null | "" -> None + | msg -> Some msg + with _ -> None + } + + let ofExn (error: exn) = { + Name = error.GetType() |> string + Message = Some error.Message + } + + let ofErrorWithMessage message (error: obj) = { + Name = error.GetType() |> string + Message = Some message + } + + let ofContractError (contractError: ContractError) = + contractError + |> ContractError.format + |> Some + |> create "ContractError" + + let ofError (error: obj) = + match error with + | :? exn as exn -> ofExn exn + | :? ContractError as contractError -> ofContractError contractError + | :? Feather.Contracts.Error as contract -> ofContract contract + | error -> + { + Name = error.GetType() |> string + Message = None + } + + let ofFormattedError f error = + { ofError error with Message = Some (f error) } + + let map f (err: GrpcError): GrpcError = + { err with Name = f err.Name } + + let mapMessage f (err: GrpcError): GrpcError = + { err with Message = err.Message |> Option.map f } + + let format (grpcError: GrpcError) = grpcError.ToString() + +[] +module GrpcErrorExtensions = + + // Having Result<_> members as extensions gives them lower priority in + // overload resolution between Result<_> and Async>. + type ResultBuilder with + member __.ReturnFrom (grpcError: GrpcError) : Result<'Success, GrpcError> = + grpcError |> Result.Error + + member this.Bind(grpcError: GrpcError, f: 'SuccessA -> Result<'SuccessB, GrpcError>): Result<'SuccessB, GrpcError> = + this.Bind (grpcError |> Result.Error, f) + + // Having Result<_> members as extensions gives them lower priority in + // overload resolution between Result<_> and Async>. + type AsyncResultBuilder with + member __.ReturnFrom (grpcError: GrpcError) : AsyncResult<'Success, GrpcError> = + grpcError |> AsyncResult.ofError + + member this.Bind(grpcError: GrpcError, f: 'SuccessA -> AsyncResult<'SuccessB, GrpcError>): AsyncResult<'SuccessB, GrpcError> = + this.Bind (grpcError |> AsyncResult.ofError, f) + +[] +module AsyncResult = + let ofAsyncUnaryResponse (xR: AsyncUnaryCall<'Response>): AsyncResult<'Response, GrpcError> = + asyncResult { + try return! xR.ResponseAsync + with ex -> return! AsyncResult.ofError ex + } + |> AsyncResult.mapError GrpcError.ofExn + +[] +module AsyncUnaryResponseExtensions = + + // Having Result<_> members as extensions gives them lower priority in + // overload resolution between Result<_> and Async>. + type AsyncResultBuilder with + member __.ReturnFrom (xR: AsyncUnaryCall<'Response>) : AsyncResult<'Response, GrpcError> = + xR |> AsyncResult.ofAsyncUnaryResponse + + member this.Bind(grpcError: AsyncUnaryCall<'ResponseA>, f: 'ResponseA -> AsyncResult<'ResponseB, GrpcError>): AsyncResult<'ResponseB, GrpcError> = + this.Bind (grpcError |> AsyncResult.ofAsyncUnaryResponse, f) diff --git a/src/Grpc.fs b/src/Grpc.fs new file mode 100644 index 0000000..c38e448 --- /dev/null +++ b/src/Grpc.fs @@ -0,0 +1,84 @@ +namespace Feather.Grpc + +open Grpc.Core + +[] +module Grpc = + open System + open System.Net.Http + open Alma.WebApplication + open Grpc.Net.Client + + let [] Port = 9090 + + let jwtAuthHeaders (Alma.Authorization.Common.JWT token) = + let m = Metadata() + m.Add("authorization", sprintf "Bearer %s" token) + m + + let channelWithHttpClient httpClient grpcPort url = + let grpcUrl url = sprintf "%s:%d" url grpcPort |> Uri + let serviceGrpcUrl = url |> grpcUrl + + let httpClient = httpClient |> Option.defaultWith (fun () -> new HttpClient(new HttpClientHandler())) + httpClient.BaseAddress <- serviceGrpcUrl + + GrpcChannel.ForAddress(serviceGrpcUrl, GrpcChannelOptions(HttpClient = httpClient)) + + let private grpcChannel grpcPort url = + let grpcUrl url = sprintf "%s:%d" url grpcPort |> Uri + let serviceGrpcUrl = url |> grpcUrl + + GrpcChannel.ForAddress(serviceGrpcUrl) + + let k8sSvcChannel grpcPort serviceInstance = + serviceInstance + |> Instance.k8sLocalServiceUrl + |> grpcChannel grpcPort + + let localChannel grpcPort = + "http://localhost" + |> grpcChannel grpcPort + + let localIpChannel grpcPort = + "http://127.0.0.1" + |> grpcChannel grpcPort + + open FSharp.Control + + [] + let DefaultChunkSize = 256 * 1024 // 256 KB + + // -- AsyncSeq conversions (pure, no context) -- + + /// IAsyncStreamReader → AsyncSeq (requires explicit cancellation token) + let toAsyncSeq (ct: System.Threading.CancellationToken) (reader: IAsyncStreamReader<'a>): AsyncSeq<'a> = + reader.ReadAllAsync ct + + /// AsyncSeq → write to IServerStreamWriter (requires explicit cancellation token) + let ofAsyncSeq (ct: System.Threading.CancellationToken) (writer: IServerStreamWriter<'a>) (items: AsyncSeq<'a>): Async = + items + |> AsyncSeq.iterAsync (fun item -> + writer.WriteAsync(item, ct) |> Async.AwaitTask + ) + + // -- Context-aware helpers (wrap the above, enforcing cancellation via ServerCallContext) -- + + /// Read all messages from a gRPC server stream into an AsyncSeq. + /// Cancellation should be driven by the ServerCallContext so callers can't forget the token. + let readAll cancellation (reader: IAsyncStreamReader<'a>): AsyncSeq<'a> = + reader |> toAsyncSeq cancellation + + /// Write every item in an AsyncSeq to a gRPC server writer. + /// Cancellation should be driven by the ServerCallContext. + let writeAll cancellation (writer: IServerStreamWriter<'a>) (items: AsyncSeq<'a>): Async = + items |> ofAsyncSeq cancellation writer + + let sendAsyncSeq (ct: System.Threading.CancellationToken) (writer: IClientStreamWriter<'a>) (items: AsyncSeq<'a>): Async = + items + |> AsyncSeq.iterAsync (fun item -> + writer.WriteAsync(item, ct) |> Async.AwaitTask + ) + + let sendAll cancellation (writer: IClientStreamWriter<'a>) (items: AsyncSeq<'a>): Async = + items |> sendAsyncSeq cancellation writer diff --git a/src/HighLevel.fs b/src/HighLevel.fs new file mode 100644 index 0000000..f72ca1d --- /dev/null +++ b/src/HighLevel.fs @@ -0,0 +1,263 @@ +namespace Feather.Grpc + +module HighLevel = + open FSharp.Control + open Grpc.Core + open Feather.ErrorHandling + open Feather.Grpc + + module Response = + open Microsoft.Extensions.Logging + open Metrics + + let handle grpcMetrics (action: string) (logger: ILogger) spot (responseSuccess: 'Success -> 'Response) responseError (operation: AsyncResult<'Success, GrpcError>) = task { + logger.LogDebug $"Processing {action} operation" + match! operation with + | Ok success -> return responseSuccess success + | Error error -> + logger.LogError("{action} operation failed, {error}", action, error) + error |> grpcMetrics.IncrementGrpcErrorCount spot + + return responseError (error |> GrpcError.asContract) + } + + let handleDuplex grpcMetrics (action: string) (logger: ILogger) spot responseError (writer: IServerStreamWriter<'Response>) operation = task { + logger.LogDebug $"Processing {action} operation" + match! operation with + | Ok () -> return () + | Error error -> + logger.LogError("{action} failed, {error}", action, error) + error |> grpcMetrics.IncrementGrpcErrorCount spot + + do! writer.WriteAsync(responseError (error |> GrpcError.asContract)) + } + + module Read = + module Unary = + let value = AsyncResult.ofAsyncUnaryResponse + + module Stream = + module AsyncSeq = + let value fromStream (f: 'Request -> 'Chunk) (toDomain: 'Dto -> Result<'Value, ContractError>) (stream: AsyncSeq<'Request>) = asyncResult { + let! input = + stream + |> AsyncSeq.map f + |> fromStream + |> AsyncResult.mapError GrpcError.ofContractError + + return! + input + |> SerializedForChunking.unwrap + |> toDomain + |> Result.mapError GrpcError.ofContractError + } + + let valueAndChunks fromStream (f: 'Request -> 'Chunk) (toDomain: 'Dto -> Result<'Value, ContractError>) (stream: AsyncSeq<'Request>) = asyncResult { + let! input = + stream + |> AsyncSeq.map f + |> fromStream + |> AsyncResult.mapError GrpcError.ofContractError + + let! value = + input + |> SerializedForChunking.unwrap + |> toDomain + |> Result.mapError GrpcError.ofContractError + + return input, value + } + + module Request = + let asSeq cancellation (request: IAsyncStreamReader<'Request>): AsyncSeq<'Request> = + request |> Grpc.readAll cancellation + + let firstAndContinue cancellation (request: IAsyncStreamReader<'Request>) = asyncResult { + let! hasFirst = + request.MoveNext cancellation + |> AsyncResult.ofTaskCatch GrpcError.ofExn + + if not hasFirst then + return! GrpcError.create "NoContent" (Some "No content received in SaveFileContent request") |> Error + + let firstRequest = request.Current + + return + firstRequest, + asyncSeq { + yield firstRequest + yield! request |> Grpc.toAsyncSeq cancellation + } + } + + let dto cancellation fromStream (requestToChunk: 'Request -> 'Chunk) (toDomain: 'Dto -> Result<'Value, ContractError>) (request: IAsyncStreamReader<'Request>) = + request + |> asSeq cancellation + |> AsyncSeq.value fromStream requestToChunk toDomain + + let value cancellation fromStream (requestToChunk: 'Request -> 'Chunk) (request: IAsyncStreamReader<'Request>) = + dto cancellation fromStream requestToChunk Ok request + + let gzipValue cancellation (parse: string -> Result<'Value, ContractError>) (requestToChunk: 'Request -> _) = + value cancellation (SerializedForChunking.Dto.Gzip.fromStream parse) requestToChunk + + let dtoAndChunks cancellation fromStream (requestToChunk: 'Request -> 'Chunk) (toDomain: 'Dto -> Result<'Value, ContractError>) (request: IAsyncStreamReader<'Request>) = + request + |> asSeq cancellation + |> AsyncSeq.valueAndChunks fromStream requestToChunk toDomain + + module Response = + let private chunksToValue fromChunks responseChunks = asyncResult { + let! chunks = + responseChunks + |> List.rev + |> Result.sequence + + return! + chunks + |> fromChunks + |> AsyncResult.mapError GrpcError.ofContractError + |> AsyncResult.map SerializedForChunking.unwrap + } + + let private ignoreValue responseChunks = + responseChunks + |> List.rev + |> Result.sequence + |> Result.map ignore + + let value cancellation (handleResponse: 'Response -> Result<'Chunk, GrpcError>) (fromChunks: 'Chunk list -> AsyncResult, ContractError>) (response: IAsyncStreamReader<'Response>) = asyncResult { + let! responseChunks = + response + |> Grpc.readAll cancellation + |> AsyncSeq.fold (fun acc response -> handleResponse response :: acc) [] + |> AsyncResult.ofAsyncCatch GrpcError.ofExn + + return! chunksToValue fromChunks responseChunks + } + + let private handleAsync cancellation (handleResponse: 'Response -> AsyncResult<'Chunk, GrpcError>) (response: IAsyncStreamReader<'Response>) = + response + |> Grpc.readAll cancellation + |> AsyncSeq.foldAsync (fun acc response -> async { + let! chunkResult = handleResponse response + + return chunkResult :: acc + }) [] + |> AsyncResult.ofAsyncCatch GrpcError.ofExn + + let valueAsync cancellation (handleResponse: 'Response -> AsyncResult<'Chunk, GrpcError>) (fromChunks: 'Chunk list -> AsyncResult, ContractError>) (response: IAsyncStreamReader<'Response>) = asyncResult { + let! responseChunks = handleAsync cancellation handleResponse response + return! chunksToValue fromChunks responseChunks + } + + let ignoreValueAsync cancellation (handleResponse: 'Response -> AsyncResult<'Chunk, GrpcError>) (response: IAsyncStreamReader<'Response>) = asyncResult { + let! responseChunks = handleAsync cancellation handleResponse response + return! ignoreValue responseChunks + } + + module Call = + // todo - is it needed? + let firstAndContinue cancellation (call: AsyncServerStreamingCall<'Request>) = + Request.firstAndContinue cancellation call.ResponseStream + + let value cancellation (handleResponse: 'Response -> Result<'Chunk, GrpcError>) (fromChunks: 'Chunk list -> AsyncResult, ContractError>) (call: AsyncServerStreamingCall<'Response>) = + call.ResponseStream + |> Response.value cancellation handleResponse fromChunks + + module DuplexStream = + module Chunks = + let value cancellation (request: AsyncDuplexStreamingCall<'Request', 'Response>) (handleResponse: 'Response -> Result<'Chunk, GrpcError>) (fromChunks: 'Chunk list -> AsyncResult, ContractError>) = + request.ResponseStream + |> Stream.Response.value cancellation handleResponse fromChunks + + let valueAsync cancellation (request: AsyncDuplexStreamingCall<'Request', 'Response>) (handleResponse: 'Response -> AsyncResult<'Chunk, GrpcError>) (fromChunks: 'Chunk list -> AsyncResult, ContractError>) = + request.ResponseStream + |> Stream.Response.valueAsync cancellation handleResponse fromChunks + + let ignoreValueAsync cancellation (request: AsyncDuplexStreamingCall<'Request, 'Response>) (handleResponse: 'Response -> AsyncResult<'Chunk, GrpcError>) = + request.ResponseStream + |> Stream.Response.ignoreValueAsync cancellation handleResponse + + module Send = + module Stream = + let asyncSeq (writer: IAsyncStreamWriter<'Request>) (chunkToRequest: 'Chunk -> 'Request) dataStream = + dataStream + |> AsyncSeq.iterAsync (chunkToRequest >> writer.WriteAsync >> Async.AwaitTask) + |> AsyncResult.ofAsyncCatch GrpcError.ofExn + + module ClientStream = + let asyncSeq (request: AsyncClientStreamingCall<'Request, 'Response>) (chunkToRequest: 'Chunk -> 'Request) dataStream = asyncResult { + do! dataStream |> Stream.asyncSeq request.RequestStream chunkToRequest + do! request.RequestStream.CompleteAsync() |> AsyncResult.ofEmptyTaskCatch GrpcError.ofExn + + return! request.ResponseAsync |> AsyncResult.ofTaskCatch GrpcError.ofExn + } + + module ServerStream = + let dto cancellation (writer: IServerStreamWriter<'Response>) (dtoFromDomain: 'Value -> 'Dto) (toStream: SerializedForChunking<'Dto> -> AsyncSeq<'Chunk>) (chunkToRequest: 'Chunk -> 'Response) value = + value + |> dtoFromDomain + |> SerializedForChunking.wrap + |> toStream + |> AsyncSeq.map chunkToRequest + |> Grpc.writeAll cancellation writer + |> AsyncResult.ofAsyncCatch GrpcError.ofExn + + let gzipDto cancellation (writer: IServerStreamWriter<'Response>) (dtoFromDomain: 'Value -> 'Dto) serialize chunkToRequest = + dto cancellation writer dtoFromDomain (SerializedForChunking.Dto.Gzip.toStream serialize) chunkToRequest + + let value cancellation (writer: IServerStreamWriter<'Response>) (toStream: SerializedForChunking<'Value> -> AsyncSeq<'Chunk>) (chunkToRequest: 'Chunk -> 'Response) = + dto cancellation writer id toStream chunkToRequest + + let gzipValue cancellation (writer: IServerStreamWriter<'Response>) (serialize: 'Value -> string) chunkToRequest = + value cancellation writer (SerializedForChunking.Dto.Gzip.toStream serialize) chunkToRequest + + module DuplexStream = + let asyncSeq (request: AsyncDuplexStreamingCall<'Request, 'Response>) (chunkToRequest: 'Chunk -> 'Request) dataStream = asyncResult { + do! dataStream |> Stream.asyncSeq request.RequestStream chunkToRequest + do! request.RequestStream.CompleteAsync() |> AsyncResult.ofEmptyTaskCatch GrpcError.ofExn + } + + let dto (request: AsyncDuplexStreamingCall<'Request, 'Response>) (dtoFromDomain: 'Value -> 'Dto) toStream (chunkToRequest: 'Chunk -> 'Request) value = + value + |> dtoFromDomain + |> SerializedForChunking.wrap + |> toStream + |> asyncSeq request chunkToRequest + + module Duplex = + let private startImmediately cancellation logError seq = + seq + |> AsyncResult.teeError logError + |> Async.Ignore + |> Async.startWithCancellation cancellation + + let streamImmediately cancellation (request: AsyncDuplexStreamingCall<'Request, 'Response>) logError dtoFromDomain toStream chunkToRequest handleResponse fromChunks value = asyncResult { + value + |> Send.DuplexStream.dto request dtoFromDomain toStream chunkToRequest + |> startImmediately cancellation logError + + return! Read.DuplexStream.Chunks.value cancellation request handleResponse fromChunks + } + + let stream cancellation (request: AsyncDuplexStreamingCall<'Request, 'Response>) dtoFromDomain toStream chunkToRequest handleResponse fromChunks value = asyncResult { + do! value |> Send.DuplexStream.dto request dtoFromDomain toStream chunkToRequest + + return! Read.DuplexStream.Chunks.value cancellation request handleResponse fromChunks + } + + let streamValue cancellation (request: AsyncDuplexStreamingCall<'Request, 'Response>) toStream chunkToRequest handleResponse fromChunks value = asyncResult { + do! value |> Send.DuplexStream.dto request id toStream chunkToRequest + + return! Read.DuplexStream.Chunks.value cancellation request handleResponse fromChunks + } + + module AsyncSeq = + let streamImmediately cancellation (request: AsyncDuplexStreamingCall<'Request, 'Response>) logError (chunkToRequest: 'Chunk -> 'Request) handleResponse (dataStream: AsyncSeq<'Chunk>) = asyncResult { + dataStream + |> Send.DuplexStream.asyncSeq request chunkToRequest + |> startImmediately cancellation logError + + return! Read.DuplexStream.Chunks.ignoreValueAsync cancellation request handleResponse + } diff --git a/src/Metrics.fs b/src/Metrics.fs new file mode 100644 index 0000000..2ba3119 --- /dev/null +++ b/src/Metrics.fs @@ -0,0 +1,56 @@ +namespace Feather.Grpc + +module Metrics = + open Alma.ServiceIdentification + open Alma.WebApplication + + type GrpcMetrics = { + IncrementGrpcErrorCount: Spot option -> GrpcError -> unit + } + + [] + module GrpcMetrics = + open Alma.Metrics + + type private Count = Count of int + + type private ApplicationMetric = + | GrpcErrorOccurred of Instance * Spot option * GrpcError + + [] + module private InternalState = + let private createGrpcErrorOccurred instance spot (grpcError: GrpcError) = + SimpleDataSetKeys [ + "error", grpcError.Name + ] + |> Metrics.createDataSetKey instance spot + + let metricGrpcErrorOccurred = "grpc_error_occurred" |> MetricName.createOrFail + + let private metricValueToCount = function + | Int int -> Count int + | _ -> Count 0 + + let incrementState = function + | GrpcErrorOccurred (instance, spot, grpcError) -> + grpcError + |> createGrpcErrorOccurred instance spot + |> State.incrementMetricSetValue (Int 1) metricGrpcErrorOccurred + |> metricValueToCount + + let currentState() = + [ + metricGrpcErrorOccurred |> Metrics.Format.counter "Grpc error occurred count." + ] + + // Changing state + + let incrementGrpcErrorOccurred instance spot grpcError = + (instance, spot, grpcError) + |> GrpcErrorOccurred + |> incrementState + |> ignore + + let metrics (currentInstance: Instance): GrpcMetrics = { + IncrementGrpcErrorCount = incrementGrpcErrorOccurred currentInstance + } diff --git a/src/Serialization.fs b/src/Serialization.fs new file mode 100644 index 0000000..6f930d0 --- /dev/null +++ b/src/Serialization.fs @@ -0,0 +1,207 @@ +namespace Feather.Grpc + +/// Marks content that is serialized at the domain boundary into raw bytes before being +/// transported as gRPC stream chunks. gRPC sees only opaque bytes; deserialization +/// happens at the receiving domain boundary. +type SerializedForChunking<'Dto> = SerializedForChunking of 'Dto + +type ParseDto<'Dto> = string -> Result<'Dto, ContractError> +type SerializeDto<'Dto> = 'Dto -> string + +[] +module SerializedForChunking = + open FSharp.Control + open Feather.ErrorHandling + open Feather.Cryptography + open Feather.Grpc + + let wrap (dto: 'Dto): SerializedForChunking<'Dto> = + SerializedForChunking dto + + let unwrap (SerializedForChunking dto: SerializedForChunking<'Dto>): 'Dto = + dto + + let map f (SerializedForChunking dto) = + SerializedForChunking (f dto) + + /// Extracts and validates raw bytes from a single proto chunk. + /// Returns an error if the chunk is null or empty. + let ofContract (contract: Feather.Contracts.SerializedForChunking): Result = + if isNull contract then + Error (ContractError.ofError "SerializedForChunking: contract is null") + else + Ok <| contract.Content.ToByteArray() + + /// Extracts raw bytes from a proto chunk without validation. + /// Use only where the chunk is known to be non-empty (e.g. just produced by asContract). + let bytesOf (contract: Feather.Contracts.SerializedForChunking): byte[] = + contract.Content.ToByteArray() + + /// Wraps raw bytes into a single proto chunk. + let ofBytes (bytes: byte[]) : Feather.Contracts.SerializedForChunking = + Feather.Contracts.SerializedForChunking( + Content = Google.Protobuf.ByteString.CopyFrom bytes + ) + + let asContract (SerializedForChunking bytes) : Feather.Contracts.SerializedForChunking = + ofBytes bytes + + [] + module private Serialize = + let toBytes (serialize: SerializeDto<'Dto>) (SerializedForChunking dto) : byte[] = + dto + |> serialize + |> Encode.stringToBytes + + [] + module private Parse = + let fromBytes (parse: ParseDto<'Dto>) (bytes: byte[]) : Result, ContractError> = + try + match bytes with + | null | [||] -> Error (ContractError.ofError "No content") + | bytes -> + bytes + |> Encode.bytesToString + |> parse + |> Result.map SerializedForChunking + with e -> + Error (ContractError.ofExn e) + + [] + module private Chunk = + let bytes (bytes: byte[]) = + bytes + |> Array.chunkBySize Grpc.DefaultChunkSize + |> Array.toList + |> List.map ofBytes + + let concat (chunks: Feather.Contracts.SerializedForChunking list): Result = + chunks + |> List.map ofContract + |> Result.sequence + |> Result.map (List.toArray >> Array.concat) + + [] + module internal Chunks = + /// Serializes a dto to JSON via `serialize` (typically `toDto >> Serialize.toJson`), + /// encodes as UTF-8, and splits into 256 KB proto chunks ready to be streamed. + /// + /// Usage: + /// dto + /// |> SerializedForChunking.toChunks (MyType.toDto >> Serialize.toJson) + /// |> Grpc.writeAll ctx writer + let toChunks (serialize: SerializeDto<'Dto>) (dto: SerializedForChunking<'Dto>): Feather.Contracts.SerializedForChunking list = + dto + |> Serialize.toBytes serialize + |> Chunk.bytes + + /// Reassembles byte chunks, decodes UTF-8 JSON, and parses back into a dto via `parse`. + /// + /// Usage: + /// receivedChunks + /// |> List.map SerializedForChunking.ofContract + /// |> SerializedForChunking.fromChunks MyType.parse + let fromChunks (parse: ParseDto<'Dto>) (chunks: Feather.Contracts.SerializedForChunking list): Result, ContractError> = + chunks + |> Chunk.concat + |> Result.bind (Parse.fromBytes parse) + + [] + module Dto = + type private ToStream<'Dto> = SerializeDto<'Dto> -> SerializedForChunking<'Dto> -> AsyncSeq + type private FromStream<'Dto> = ParseDto<'Dto> -> AsyncSeq -> AsyncResult, ContractError> + + /// Serializes a dto and produces an AsyncSeq of proto chunks ready to be streamed via gRPC. + /// Usage: + /// dto + /// |> SerializedForChunking.toStream (MyType.toDto >> Serialize.toJson) + /// |> Grpc.writeAll ctx writer + let toStream (serialize: SerializeDto<'Dto>) dto: AsyncSeq = + dto + |> Serialize.toBytes serialize + |> Chunk.bytes + |> AsyncSeq.ofSeq + + /// Collects all chunks from a gRPC stream, reassembles and parses them in one step. + /// + /// Usage: + /// reader + /// |> Grpc.readAll ctx + /// |> SerializedForChunking.fromStream MyType.parse + let fromStream: FromStream<'Dto> = fun parse stream -> asyncResult { + let! chunks = + stream + |> AsyncSeq.toListAsync + |> AsyncResult.ofAsyncCatch ContractError.ofExn + + let! bytes = chunks |> Chunk.concat + return! bytes |> Parse.fromBytes parse + } + + [] + module Gzip = + /// Serializes a dto to JSON, gzip-compresses the full payload, then streams the + /// compressed bytes as 256 KB proto chunks. + /// Use for large or compressible DTOs (DNA sequences, document content, binary blobs). + /// + /// Pair with fromStreamGzip on the receiving end. + let toStream: ToStream<'Dto> = fun serialize dto -> + dto + |> Serialize.toBytes serialize + |> Gzip.compress + |> Chunk.bytes + |> AsyncSeq.ofSeq + + let fromChunks (parse: ParseDto<'Dto>) chunks = asyncResult { + let! bytes = chunks |> Chunk.concat + + return! bytes |> Gzip.decompress |> Parse.fromBytes parse + } + + /// Collects all chunks, reassembles, gunzips, then parses the decompressed JSON. + /// + /// Pair with toStreamGzip on the sending end. + let fromStream: FromStream<'Dto> = fun parse stream -> asyncResult { + let! chunks = + stream + |> AsyncSeq.toListAsync + |> AsyncResult.ofAsyncCatch ContractError.ofExn + + return! fromChunks parse chunks + } + + [] + module Parts = + type private ToStream<'Parts> = SerializedForChunking<'Parts> -> AsyncSeq + type private FromStream<'Parts> = AsyncSeq -> AsyncSeq> + + /// Splits raw bytes into proto chunks and streams them. + /// Usage: + /// bytes + /// |> SerializedForChunking.toRawStream + /// |> Grpc.writeAll ctx writer + let toStream: ToStream = fun (SerializedForChunking bytes) -> + bytes + |> Chunk.bytes + |> AsyncSeq.ofSeq + + /// Yields each chunk's raw bytes as they arrive — no reassembly. + /// Usage: + /// reader + /// |> Grpc.readAll ctx + /// |> SerializedForChunking.fromRawStream + /// |> AsyncSeq.iter processChunk + let fromStream: FromStream = fun stream -> + stream |> AsyncSeq.map (bytesOf >> SerializedForChunking) + + [] + module Text = + /// UTF-8 encodes a string, splits into proto chunks and streams them. + /// Convenience wrapper over toStream for plain-text content. + let toStream: ToStream = + map Encode.stringToBytes >> toStream + + /// Yields each chunk decoded as a UTF-8 string as it arrives. + /// Convenience wrapper over fromRawStream for plain-text content. + let fromStream: FromStream = + fromStream >> AsyncSeq.map (map Encode.bytesToString) diff --git a/src/Utils.fs b/src/Utils.fs new file mode 100644 index 0000000..e90a0d9 --- /dev/null +++ b/src/Utils.fs @@ -0,0 +1,48 @@ +namespace Feather.Grpc + +[] +module internal Utils = + open System + + [] + module Guid = + let tryParse = function + | null | "" -> None + | str -> + match Guid.TryParse str with + | true, guid -> Some guid + | false, _ -> None + + [] + module DateTimeOffset = + let tryParse (s: string) = + match DateTimeOffset.TryParse(s) with + | true, dt -> Some dt + | false, _ -> None + + let serialize (dt: DateTimeOffset) = + dt.ToString("o") // ISO 8601 format + + [] + module Gzip = + open System.IO + open System.IO.Compression + + let compress (input: byte[]) : byte[] = + use outputStream = new MemoryStream() + use gzipStream = new GZipStream(outputStream, CompressionMode.Compress) + gzipStream.Write(input, 0, input.Length) + gzipStream.Close() + outputStream.ToArray() + + let decompress (input: byte[]) : byte[] = + use inputStream = new MemoryStream(input) + use gzipStream = new GZipStream(inputStream, CompressionMode.Decompress) + use outputStream = new MemoryStream() + gzipStream.CopyTo(outputStream) + outputStream.ToArray() + + [] + module Async = + let startWithCancellation cancellation xA = + Async.Start(xA, cancellation) diff --git a/tests/CoreTypes.fs b/tests/CoreTypes.fs new file mode 100644 index 0000000..87dbc50 --- /dev/null +++ b/tests/CoreTypes.fs @@ -0,0 +1,175 @@ +module Feather.Grpc.Test.CoreTypes + +open System +open System.IO +open Expecto +open Alma.ServiceIdentification +open Alma.Authorization +open Alma.Authorization.Common +open Feather.ErrorHandling +open Feather.Cryptography +open FSharp.Control +open Feather.Grpc + +// +// ContractError +// + +[] +let contractErrorTests = + testList "ContractError" [ + + testCase "ofError - formats message" <| fun _ -> + let err = ContractError.ofError "something went wrong" + Expect.equal (ContractError.format err) "Invalid data: something went wrong" "formats with detail" + + testCase "InvalidData None - formats without detail" <| fun _ -> + let err = InvalidData None + Expect.equal (ContractError.format err) "Invalid data" "formats without detail" + + testCase "ofExn - includes exception type and message" <| fun _ -> + let exn = Exception "boom" + let err = ContractError.ofExn exn + let formatted = ContractError.format err + Expect.isTrue (formatted.Contains "boom") "includes exception message" + Expect.isTrue (formatted.Contains "Exception") "includes exception type" + + testCase "ofFormattedError - uses custom formatter" <| fun _ -> + let err = ContractError.ofFormattedError (sprintf "code=%d") 42 + Expect.equal (ContractError.format err) "Invalid data: code=42" "uses formatter" + ] + +// +// Timestamp +// + +[] +let timestampTests = + testList "Timestamp" [ + + testCase "now - returns UTC timestamp" <| fun _ -> + let before = DateTimeOffset.UtcNow + let ts = Timestamp.now () + let after = DateTimeOffset.UtcNow + let value = Timestamp.value ts + Expect.isTrue (value >= before) "timestamp is not before call" + Expect.isTrue (value <= after) "timestamp is not after call" + + testCase "value - unwraps DateTimeOffset" <| fun _ -> + let dto = DateTimeOffset(2024, 6, 1, 12, 0, 0, TimeSpan.Zero) + let ts = Timestamp dto + Expect.equal (Timestamp.value ts) dto "value returns inner DateTimeOffset" + + testCase "asContract - stores milliseconds" <| fun _ -> + let dto = DateTimeOffset.FromUnixTimeMilliseconds 1_700_000_000_000L + let contract = Timestamp dto |> Timestamp.asContract + Expect.equal contract.UnixTimestamp 1_700_000_000_000L "stores milliseconds" + + testCase "ofContract - restores from milliseconds" <| fun _ -> + let contract = Feather.Contracts.Timestamp(UnixTimestamp = 1_700_000_000_000L) + let result = Timestamp.ofContract contract + let expected = DateTimeOffset.FromUnixTimeMilliseconds 1_700_000_000_000L + Expect.equal result (Ok (Timestamp expected)) "restores DateTimeOffset" + + testCase "asContract / ofContract round-trip - millisecond precision preserved" <| fun _ -> + // Normalise to ms first — asContract truncates sub-millisecond precision + let ms = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + let ts = DateTimeOffset.FromUnixTimeMilliseconds ms |> Timestamp + let result = ts |> Timestamp.asContract |> Timestamp.ofContract + Expect.equal result (Ok ts) "round-trip preserves millisecond-precision timestamp" + + testCase "asContract / ofContract round-trip - sub-millisecond is truncated" <| fun _ -> + // DateTimeOffset with ticks that are not whole milliseconds + let dto = DateTimeOffset(2024, 1, 1, 0, 0, 0, 0, TimeSpan.Zero).AddTicks 9999L + let ts = Timestamp dto + let result = ts |> Timestamp.asContract |> Timestamp.ofContract + // Sub-millisecond part is lost after round-trip + let truncated = DateTimeOffset.FromUnixTimeMilliseconds(dto.ToUnixTimeMilliseconds()) |> Timestamp + Expect.equal result (Ok truncated) "sub-millisecond ticks are truncated to milliseconds" + + testCase "asContract / ofContract round-trip - epoch zero" <| fun _ -> + let ts = DateTimeOffset.FromUnixTimeMilliseconds 0L |> Timestamp + let result = ts |> Timestamp.asContract |> Timestamp.ofContract + Expect.equal result (Ok ts) "round-trips unix epoch" + + testCase "asContract / ofContract round-trip - negative (pre-epoch)" <| fun _ -> + let ts = DateTimeOffset.FromUnixTimeMilliseconds -1_000L |> Timestamp + let result = ts |> Timestamp.asContract |> Timestamp.ofContract + Expect.equal result (Ok ts) "round-trips pre-epoch timestamp" + + // Fixed point in time shared with PHP tests (TimestampTest::UNIX_MS) to verify cross-language sync. + // PHP: private const int UNIX_MS = 1705314600123; // 2024-01-15T10:30:00.123Z + testCase "asContract - fixed string timestamp produces known unix ms" <| fun _ -> + let dto = DateTimeOffset.Parse("2024-01-15T10:30:00.123+00:00") + let contract = Timestamp dto |> Timestamp.asContract + Expect.equal contract.UnixTimestamp 1_705_314_600_123L "fixed timestamp matches PHP TimestampTest::UNIX_MS" + + testCase "ofContract - returns error for null contract" <| fun _ -> + let result = Timestamp.ofContract null + Expect.isError result "null contract yields error" + ] + +// +// CorrelationId +// + +[] +let correlationIdTests = + testList "CorrelationId" [ + + testCase "create - produces unique ids" <| fun _ -> + let id1 = CorrelationId.create () + let id2 = CorrelationId.create () + Expect.notEqual id1 id2 "each created CorrelationId is unique" + + testCase "value - returns guid string" <| fun _ -> + let guid = Guid.NewGuid() + let id = CorrelationId guid + Expect.equal (CorrelationId.value id) (guid.ToString()) "value returns guid string" + + testCase "uuid - unwraps guid" <| fun _ -> + let guid = Guid.NewGuid() + let id = CorrelationId guid + Expect.equal (CorrelationId.uuid id) guid "uuid returns inner Guid" + + testCase "asContract / ofContract round-trip" <| fun _ -> + let id = CorrelationId.create () + let result = id |> CorrelationId.asContract |> CorrelationId.ofContract + Expect.equal result (Ok id) "round-trip preserves CorrelationId" + + testCase "ofContract - invalid guid" <| fun _ -> + let contract = Feather.Contracts.CorrelationId(Id = "not-a-guid") + Expect.isError (CorrelationId.ofContract contract) "should reject invalid guid" + + testCase "ofContract - empty string" <| fun _ -> + let contract = Feather.Contracts.CorrelationId(Id = "") + Expect.isError (CorrelationId.ofContract contract) "should reject empty string" + ] + +// +// Spot +// + +[] +let spotTests = + testList "Spot" [ + + testCase "asContract / ofContract round-trip" <| fun _ -> + let spot = { Zone = Zone "eu"; Bucket = Bucket "prod" } + let result = spot |> Spot.asContract |> Spot.ofContract + Expect.equal result (Ok spot) "round-trip preserves Spot" + + testCase "asContract - stores zone and bucket" <| fun _ -> + let spot = { Zone = Zone "us"; Bucket = Bucket "staging" } + let contract = Spot.asContract spot + Expect.equal contract.Zone "us" "zone matches" + Expect.equal contract.Bucket "staging" "bucket matches" + + testCase "ofContract - invalid zone" <| fun _ -> + let contract = Feather.Contracts.Spot(Zone = "", Bucket = "prod") + Expect.isError (Spot.ofContract contract) "should reject empty zone" + + testCase "ofContract - invalid bucket" <| fun _ -> + let contract = Feather.Contracts.Spot(Zone = "eu", Bucket = "") + Expect.isError (Spot.ofContract contract) "should reject empty bucket" + ] diff --git a/tests/Serialization.fs b/tests/Serialization.fs new file mode 100644 index 0000000..a2e75e9 --- /dev/null +++ b/tests/Serialization.fs @@ -0,0 +1,441 @@ +module Feather.Grpc.Test.Serialization + +open System +open System.IO +open Expecto +open Feather.Contracts +open Feather.Cryptography +open Feather.ErrorHandling +open Alma.Serializer +open FSharp.Control +open Feather.Grpc + +let private debug = false +let private sleepMultiplier = if debug then 1 else 0 + +// +// SerializedForChunking +// +// Uses a minimal Name type defined here only — principle tests, not domain-specific. +// Mirror these in the PHP library for interoperability verification. +// + +[] +module NameFixture = + open FSharp.Data + + type NameDto = { FirstName: string; LastName: string } + + [] + module NameDto = + let serialize (dto: NameDto) = + dto |> Serialize.toJson + + type private DtoSchema = JsonProvider<"""{"first_name":"name","last_name":"name"}"""> + + let parse (json: string): Result = result { + let! parsed = + try DtoSchema.Parse json |> Ok + with e -> Result.Error (ContractError.ofExn e) + + return { + FirstName = parsed.FirstName + LastName = parsed.LastName + } + } + + let smallDto = { FirstName = "Jan"; LastName = "Novák" } + let smallJson = NameDto.serialize smallDto + +[] +let serializedForChunkingTests = + testList "SerializedForChunking" [ + + // ---- wrap / unwrap ---- + + testCase "wrap / unwrap round-trip" <| fun _ -> + let result = smallDto |> SerializedForChunking.wrap |> SerializedForChunking.unwrap + Expect.equal result smallDto "unwrap returns original dto" + + // ---- toChunks ---- + + testCase "toChunks - chunk content is UTF-8 encoded JSON" <| fun _ -> + let chunks = + smallDto + |> SerializedForChunking.wrap + |> SerializedForChunking.Chunks.toChunks NameDto.serialize + + Expect.equal chunks.Length 1 "small JSON fits in one chunk" + + let decoded = chunks[0].Content.ToByteArray() |> System.Text.Encoding.UTF8.GetString + Expect.equal decoded smallJson "chunk bytes decode to expected JSON" + + // ---- fromChunks ---- + + testCase "fromChunks - empty list returns error" <| fun _ -> + let result = SerializedForChunking.Chunks.fromChunks NameDto.parse [] + Expect.isError result "empty chunk list should fail parse" + + testCase "fromChunks - malformed JSON returns error" <| fun _ -> + let badBytes = System.Text.Encoding.UTF8.GetBytes "{not valid json}" + let result = SerializedForChunking.Chunks.fromChunks NameDto.parse [ SerializedForChunking.ofBytes badBytes ] + Expect.isError result "malformed JSON should return error" + + testCase "fromChunks - wrong parse function returns error" <| fun _ -> + let chunks = + smallDto + |> SerializedForChunking.wrap + |> SerializedForChunking.Chunks.toChunks NameDto.serialize + + let wrongParse (_: string): Result = + Result.Error (ContractError.ofError "wrong parser") + + let result = SerializedForChunking.Chunks.fromChunks wrongParse chunks + Expect.isError result "mismatched parser returns error" + + // ---- full toChunks → fromChunks round-trip ---- + + testCase "fromChunks - single chunk round-trips" <| fun _ -> + let result = + // dto -> chunks + smallDto + |> SerializedForChunking.wrap + |> SerializedForChunking.Chunks.toChunks NameDto.serialize + // chunks -> dto + |> SerializedForChunking.Chunks.fromChunks NameDto.parse + |> Result.map SerializedForChunking.unwrap + + Expect.equal result (Ok smallDto) "round-trip via single chunk" + + // ---- interop anchor — same values verified in PHP tests ---- + // JSON: {"first_name":"Jan","last_name":"Doe"} + // Bytes: [| 123;34;102;105;114;115;116;95;110;97;109;101;34;58;34;74;97;110;34;44; + // 34;108;97;115;116;95;110;97;109;101;34;58;34;68;111;101;34;125 |] + // (pure ASCII — each character is exactly one byte) + + testCase "interop - known bytes deserialize to expected dto" <| fun _ -> + let knownBytes = + [| 123uy;34uy;102uy;105uy;114uy;115uy;116uy;95uy;110uy;97uy;109uy;101uy;34uy;58uy;34uy;74uy;97uy;110uy;34uy;44uy + 34uy;108uy;97uy;115uy;116uy;95uy;110uy;97uy;109uy;101uy;34uy;58uy;34uy;68uy;111uy;101uy;34uy;125uy |] + let result = + SerializedForChunking.Chunks.fromChunks NameDto.parse [ SerializedForChunking.ofBytes knownBytes ] + |> Result.map SerializedForChunking.unwrap + Expect.equal result (Ok { FirstName = "Jan"; LastName = "Doe" }) "known bytes deserialize correctly" + + testCase "interop - known dto serializes to expected bytes" <| fun _ -> + let knownBytes = + [| 123uy;34uy;102uy;105uy;114uy;115uy;116uy;95uy;110uy;97uy;109uy;101uy;34uy;58uy;34uy;74uy;97uy;110uy;34uy;44uy + 34uy;108uy;97uy;115uy;116uy;95uy;110uy;97uy;109uy;101uy;34uy;58uy;34uy;68uy;111uy;101uy;34uy;125uy |] + let actualBytes = + { FirstName = "Jan"; LastName = "Doe" } + |> SerializedForChunking.wrap + |> SerializedForChunking.Chunks.toChunks NameDto.serialize + |> List.exactlyOne + |> fun c -> c.Content.ToByteArray() + Expect.equal actualBytes knownBytes "dto serializes to known bytes" + ] + +// +// SerializedForChunking — large-file streaming tests +// +// Uses tests/fixtures/plain-file.md (~519 KB) to exercise multi-chunk paths. +// Both streaming modes are verified end-to-end. +// + +[] +module TextPageFixture = + open FSharp.Data + open FSharp.Control + + type TextPageDto = { + FileName: string + Content: string + } + + [] + module TextPageDto = + let serialize (dto: TextPageDto) = dto |> Serialize.toJson + + type private DtoSchema = JsonProvider<"""{"content":"text","file_name":"name"}"""> + + let parse (json: string) : Result = result { + let! parsed = + try DtoSchema.Parse json |> Ok + with e -> Result.Error (ContractError.ofExn e) + + return { + FileName = parsed.FileName + Content = parsed.Content + } + } + + let fixturePath (name: string) = + Path.Combine(__SOURCE_DIRECTORY__, "fixtures", name) + +[] +let serializedForChunkingLargeFileTests = + testList "SerializedForChunking - large file" [ + + // ---- raw text streaming ---- + // Each chunk is a self-contained UTF-8 slice; streaming stops even if you + // drop the connection after the first chunk. + + // ---- AI simulated response ---- + // Each partial AI message is independently streamed as its own proto chunk — + // the client can display it immediately without waiting for the full response. + // This mirrors: AI engine --(gRPC raw stream)--> server --(WebSocket)--> browser. + // + // Producer and consumer run in parallel via a Channel, which represents + // the gRPC stream buffer. The consumer receives and processes each chunk + // the instant it is written — before the next message is even produced. + + testCaseAsync "AI simulated response" <| async { + do! Async.Sleep (6000 * sleepMultiplier) // ensure timestamp differences are visible in logs + + let grpcStream = System.Threading.Channels.Channel.CreateUnbounded() + + // AI engine: produces 10 partial messages, each encoded to one proto chunk, + // written into the channel at its own pace. + let producer = async { + do! + [1..10] + |> List.map (fun i -> async { + do! Async.Sleep (300 * sleepMultiplier) + let msg = sprintf "Partial message %d: the AI is generating this response incrementally. " i + if debug then printfn "[AI engine] +%d ms emitting message %d" (i * 300) i + return msg + }) + |> AsyncSeq.ofSeqAsync + |> AsyncSeq.collect (SerializedForChunking.wrap >> SerializedForChunking.Parts.Text.toStream) + |> AsyncSeq.iterAsync (fun chunk -> + grpcStream.Writer.WriteAsync(chunk).AsTask() |> Async.AwaitTask) + grpcStream.Writer.Complete() + } + + // gRPC stream as AsyncSeq — yields chunks as they are written by the producer. + let wireFromChannel : AsyncSeq = + asyncSeq { + let mutable running = true + while running do + let! hasMore = grpcStream.Reader.WaitToReadAsync().AsTask() |> Async.AwaitTask + if hasMore then + let mutable chunk = Unchecked.defaultof<_> + while grpcStream.Reader.TryRead(&chunk) do + yield chunk + else + running <- false + } + + // Start producer as a child — it runs concurrently while we consume. + let! producerTask = Async.StartChild producer + + // Client: receives and forwards each chunk the moment it arrives. + let! received = + wireFromChannel + |> SerializedForChunking.Parts.Text.fromStream + |> AsyncSeq.mapiAsync (fun i wrapped -> async { + let part = SerializedForChunking.unwrap wrapped + if debug then printfn "[Client WS] OnPartialMessage [%d]: %s" i (part.TrimEnd()) + return part + }) + |> AsyncSeq.toListAsync + + // Ensure producer completed without error. + do! producerTask + + Expect.equal received.Length 10 "one proto chunk per partial AI message" + + let expected = + [1..10] + |> List.map (sprintf "Partial message %d: the AI is generating this response incrementally. ") + + Expect.equal received expected "each partial message received in order and intact" + } + + testCaseAsync "toRawTextStream / fromRawTextStream - large file round-trips" <| async { + do! Async.Sleep (100 * sleepMultiplier) // ensure timestamp differences are visible in logs + let text = File.ReadAllText(fixturePath "plain-file.md") + let! chunks = + text + |> SerializedForChunking.wrap + |> SerializedForChunking.Parts.Text.toStream + |> AsyncSeq.mapiAsync (fun i chunk -> async { + do! Async.Sleep (300 * sleepMultiplier) // simulate network delay + if debug then printfn "[Part][%d] Received chunk of size %d bytes" i (chunk.CalculateSize()) + + let part = + chunk.Content.ToByteArray() + |> Encode.bytesToString + + if debug then printfn "[Part][%d] Chunk content preview: %s" i part[0..50] + + return chunk + }) + |> AsyncSeq.toListAsync + + Expect.isGreaterThan chunks.Length 1 "file > 256 KB should produce multiple chunks" + + let! parts = + chunks + |> AsyncSeq.ofSeq + |> SerializedForChunking.Parts.Text.fromStream + |> AsyncSeq.mapiAsync (fun i wrapped -> async { + let chunk = SerializedForChunking.unwrap wrapped + do! Async.Sleep (300 * sleepMultiplier) // simulate processing delay + if debug then printfn "[Part][%d] Processed part of size %d characters" i chunk.Length + + if debug then printfn "[Part][%d] Chunk content preview: %s" i chunk[0..50] + + return chunk + }) + |> AsyncSeq.toListAsync + + let reassembled = String.concat "" parts + Expect.equal reassembled text "raw stream round-trip preserves full content" + if debug then printfn "---" + } + + // ---- JSON streaming ---- + // All chunks collected and reassembled before parsing — standard mode. + + testCaseAsync "toStream / fromStream - large file content round-trips" <| async { + do! Async.Sleep (3000 * sleepMultiplier) // ensure timestamp differences are visible in logs + let text = File.ReadAllText(fixturePath "plain-file.md") + let dto = { FileName = "plain-file.md"; Content = text } + + let! chunks = + dto + |> SerializedForChunking.wrap + |> SerializedForChunking.Dto.toStream TextPageDto.serialize + |> AsyncSeq.mapiAsync (fun i chunk -> async { + do! Async.Sleep (300 * sleepMultiplier) // simulate network delay + if debug then printfn "[Chunk][%d] Received chunk of size %d bytes" i (chunk.CalculateSize()) + + let part = + chunk.Content.ToByteArray() + |> Encode.bytesToString + + if debug then printfn "[Chunk][%d] Chunk content preview: %s" i part[0..50] + + return chunk + }) + |> AsyncSeq.toListAsync + + Expect.isGreaterThan chunks.Length 1 "large JSON payload should produce multiple chunks" + + let! result = + chunks + |> AsyncSeq.ofSeq + |> AsyncSeq.mapiAsync (fun i chunk -> async { + do! Async.Sleep (300 * sleepMultiplier) // simulate processing delay + if debug then printfn "[Chunk][%d] Processing chunk of size %d bytes" i (chunk.CalculateSize()) + + let part = + chunk.Content.ToByteArray() + |> Encode.bytesToString + + if debug then printfn "[Chunk][%d] Chunk content preview: %s" i part[0..50] + + return chunk + }) + |> SerializedForChunking.Dto.fromStream TextPageDto.parse + + Expect.equal (result |> Result.map SerializedForChunking.unwrap) (Ok dto) "JSON stream round-trip preserves content" + if debug then printfn "---" + } + ] + +// +// SerializedForChunking — binary file (image.jpg) streaming tests +// +// image.jpg is ~1.2 MB — already compressed (JPEG), so Gzip.toStream is expected +// to produce the same or more chunks than plain Dto.toStream. +// The key assertion is that the reassembled bytes exactly equal the original. +// + +[] +module ImageFixture = + open FSharp.Data + + // Binary content is base64-encoded by JsonSerializer (byte[] → JSON string). + type ImageDto = { FileName: string; Data: byte[] } + + [] + module ImageDto = + let serialize (dto: ImageDto) = dto |> Serialize.toJson + + type private DtoSchema = JsonProvider<"""{"file_name":"name","data":"base64=="}"""> + + let parse (json: string) : Result = result { + let! parsed = + try DtoSchema.Parse json |> Ok + with e -> Result.Error (ContractError.ofExn e) + + return { + FileName = parsed.FileName + Data = parsed.Data |> Convert.FromBase64String + } + } + +[] +let serializedForChunkingImageTests = + testList "SerializedForChunking - binary image" [ + + // ---- Dto.toStream / Dto.fromStream ---- + // image.jpg is base64-encoded inside JSON — expect multiple chunks (>= 5 for 1.2 MB). + + testCaseAsync "Dto.toStream / fromStream - image.jpg round-trips" <| async { + let bytes = File.ReadAllBytes(fixturePath "image.jpg") + let dto = { FileName = "image.jpg"; Data = bytes } + + let! chunks = + dto + |> SerializedForChunking.wrap + |> SerializedForChunking.Dto.toStream ImageDto.serialize + |> AsyncSeq.toListAsync + + if debug then printfn "[Dto] image.jpg → %d chunks" chunks.Length + Expect.isGreaterThan chunks.Length 1 "1.2 MB base64 JSON should produce multiple chunks" + + let! result = + chunks + |> AsyncSeq.ofSeq + |> SerializedForChunking.Dto.fromStream ImageDto.parse + + let roundTripped = result |> Result.map SerializedForChunking.unwrap + Expect.equal (roundTripped |> Result.map (fun d -> d.FileName)) (Ok "image.jpg") "filename preserved" + Expect.equal (roundTripped |> Result.map (fun d -> d.Data)) (Ok bytes) "binary content preserved byte-for-byte" + } + + // ---- Dto.Gzip.toStream / Dto.Gzip.fromStream ---- + // JPEG is already compressed — gzip will not reduce size meaningfully. + // The test verifies correctness of the gzip path, not compression ratio. + + testCaseAsync "Dto.Gzip.toStream / fromStream - image.jpg round-trips" <| async { + let bytes = File.ReadAllBytes(fixturePath "image.jpg") + let dto = { FileName = "image.jpg"; Data = bytes } + + let! chunksPlain = + dto + |> SerializedForChunking.wrap + |> SerializedForChunking.Dto.toStream ImageDto.serialize + |> AsyncSeq.toListAsync + + let! chunksGzip = + dto + |> SerializedForChunking.wrap + |> SerializedForChunking.Dto.Gzip.toStream ImageDto.serialize + |> AsyncSeq.toListAsync + + if debug then printfn "[Gzip] image.jpg → %d chunks (plain: %d) — JPEG is pre-compressed, ratio near 1x" chunksGzip.Length chunksPlain.Length + + let! result = + chunksGzip + |> AsyncSeq.ofSeq + |> SerializedForChunking.Dto.Gzip.fromStream ImageDto.parse + + let roundTripped = result |> Result.map SerializedForChunking.unwrap + Expect.equal (roundTripped |> Result.map (fun d -> d.FileName)) (Ok "image.jpg") "filename preserved" + Expect.equal (roundTripped |> Result.map (fun d -> d.Data)) (Ok bytes) "binary content preserved byte-for-byte after gzip round-trip" + } + ] diff --git a/tests/Tests.fs b/tests/Tests.fs new file mode 100644 index 0000000..9efe7af --- /dev/null +++ b/tests/Tests.fs @@ -0,0 +1,5 @@ +open Expecto + +[] +let main argv = + Tests.runTestsInAssemblyWithCLIArgs [ Parallel ] argv diff --git a/tests/Utils.fs b/tests/Utils.fs new file mode 100644 index 0000000..acffa0d --- /dev/null +++ b/tests/Utils.fs @@ -0,0 +1,51 @@ +module Feather.Grpc.Test.Utils + +open System +open System.IO +open Expecto +open Feather.Grpc + +let provideValidDateTimeOffsetStringsDefinedInPHP () = + [ + "UTC offset", "2026-09-20T12:44:27+00:00", "2026-09-20 12:44:27" + "positive offset", "2026-01-15T08:30:00+05:30", "2026-01-15 08:30:00" + "negative offset", "2025-12-31T23:59:59-07:00", "2025-12-31 23:59:59" + "midnight", "2026-03-01T00:00:00+00:00", "2026-03-01 00:00:00" + "end of day", "2026-06-30T23:59:59+02:00", "2026-06-30 23:59:59" + "valid ISO 8601", "2024-06-01T12:00:00+00:00", "2024-06-01 12:00:00" + "actual value", "2026-07-22T19:59:49.9850000+00:00", "2026-07-22 19:59:49" + ] + +[] +let dateTimeOffsetTests = + testList "DateTimeOffset" [ + testCase "tryParse - string with non-zero offset returns Some" <| fun _ -> + let result = DateTimeOffset.tryParse "2024-06-01T14:00:00+02:00" + Expect.isSome result "parses offset string" + Expect.equal result.Value.UtcDateTime (DateTime(2024, 6, 1, 12, 0, 0, DateTimeKind.Utc)) "UTC equivalent is correct" + + testCase "tryParse - empty string returns None" <| fun _ -> + Expect.isNone (DateTimeOffset.tryParse "") "empty string returns None" + + testCase "tryParse - garbage string returns None" <| fun _ -> + Expect.isNone (DateTimeOffset.tryParse "not-a-date") "garbage returns None" + + testCase "serialize - produces 'o' format string" <| fun _ -> + let dt = DateTimeOffset(2024, 6, 1, 12, 0, 0, TimeSpan.Zero) + Expect.equal (DateTimeOffset.serialize dt) "2024-06-01T12:00:00.0000000+00:00" "ISO 8601 round-trip format" + + testCase "serialize / tryParse round-trip" <| fun _ -> + let dt = DateTimeOffset(2025, 12, 31, 23, 59, 59, 999, TimeSpan.Zero) + let result = dt |> DateTimeOffset.serialize |> DateTimeOffset.tryParse + Expect.equal result (Some dt) "round-trip preserves value" + + yield! + provideValidDateTimeOffsetStringsDefinedInPHP () + |> List.map (fun (description, value, expectedLocal) -> + testCase ("tryParse - " + description) <| fun _ -> + let result = DateTimeOffset.tryParse value + Expect.isSome result $"parses {description}" + let actual = result.Value.DateTime.ToString("yyyy-MM-dd HH:mm:ss") + Expect.equal actual expectedLocal $"local datetime matches for {description}" + ) + ] diff --git a/tests/fixtures/image.jpg b/tests/fixtures/image.jpg new file mode 100644 index 0000000..4c0477a Binary files /dev/null and b/tests/fixtures/image.jpg differ diff --git a/tests/fixtures/plain-file.md b/tests/fixtures/plain-file.md new file mode 100644 index 0000000..99a001e --- /dev/null +++ b/tests/fixtures/plain-file.md @@ -0,0 +1,7019 @@ +# Personal Lifestyle Journal + +A detailed record of daily health, exercise, and nutrition habits tracked consistently over the past year. + +--- + +## Exercise Log + +### Morning Run + +- **Time:** 6:00 AM +- **Distance/Volume:** 5.2 km +- **Duration:** 27:13 +- **Heart Rate:** 192 bpm peak + +Ran the river-path loop. Legs felt heavy for the first kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. Ran the river-path loop. Legs felt heavy for the first kilometre then +loosened up. Breathing was controlled throughout. Finished strong on the uphill stretch near the +bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. + +--- + +### Strength Training — Upper Body + +- **Time:** 7:15 AM +- **Distance/Volume:** 55 min +- **Duration:** N/A +- **Heart Rate:** N/A + +Bench press 4x8 at 80 kg, incline dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on last set of bench. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. Bench press 4x8 at 80 kg, incline dumbbell press 3x10 at 28 kg, cable +fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 kg. Focused on slow eccentric phase. +No notable joint discomfort. Left shoulder slightly tight on last set of bench. + +--- + +### Cycling — Zone 2 Cardio + +- **Time:** 6:30 AM +- **Distance/Volume:** 45 km +- **Duration:** 1:52:00 +- **Heart Rate:** 148 bpm avg + +Flat route along the coast road. Kept heart rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately after. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. Flat route along the coast road. Kept heart rate between 135-155 bpm +the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. Bike felt smooth. Noticed +slight tightness in right hip flexor around km 30 — stretched immediately after. + +--- + +### Yoga — Vinyasa Flow + +- **Time:** 7:00 AM +- **Distance/Volume:** 60 min +- **Duration:** N/A +- **Heart Rate:** N/A + +Full vinyasa sequence focused on hip openers and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. Full vinyasa sequence focused on hip openers and spinal mobility. Held +pigeon pose for 90 seconds each side. Balance improved noticeably compared to last week. Breathing +stayed calm throughout. Finished with 10 minutes savasana. + +--- + +### Strength Training — Lower Body + +- **Time:** 6:45 AM +- **Distance/Volume:** 60 min +- **Duration:** N/A +- **Heart Rate:** N/A + +Squat 5x5 at 100 kg (new personal record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises 4x20. Knees tracked well. Core bracing felt solid. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. Squat 5x5 at 100 kg (new personal record), Romanian deadlift 4x8 at 75 +kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises 4x20. Knees tracked well. Core +bracing felt solid. + +--- + +### Swimming — Technique Session + +- **Time:** 7:00 AM +- **Distance/Volume:** 2.4 km +- **Duration:** 52:00 +- **Heart Rate:** 155 bpm avg + +Focused on freestyle catch and early vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. Focused on freestyle catch and early vertical forearm. Did 8x100 m at +1:50 pace with 20 s rest. Coach noted improvement in hip rotation. Pull buoy set 400 m. Cool-down +200 m backstroke. Pool temp 27 C. + +--- + +### HIIT — Kettlebell Circuit + +- **Time:** 6:15 AM +- **Distance/Volume:** 40 min +- **Duration:** N/A +- **Heart Rate:** 178 bpm peak + +5 rounds: 10 kettlebell swings 32 kg, 8 goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. 5 rounds: 10 kettlebell swings 32 kg, 8 goblet squats 24 kg, 6 push- +press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s rest. Felt strong on rounds +1-3, fatigued rounds 4-5 but maintained form. + +--- + +### Rest Day — Active Recovery + +- **Time:** 8:00 AM +- **Distance/Volume:** 5 km walk +- **Duration:** N/A +- **Heart Rate:** N/A + +Gentle walk through the park. No structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. + +Recovery notes: Completed static stretching routine post-session covering all major muscle groups. +Applied ice to areas of soreness where applicable. Foam rolled for 10 minutes. Consumed recovery +nutrition within 30 minutes. Gentle walk through the park. No structured exercise. Used foam roller +for 20 minutes targeting quads, IT band, and thoracic spine. Sleep the night before was 8 h 10 min — +well rested. Felt fully recovered by evening. + +--- + +## Nutrition Log + +### Breakfast --- Overnight oats with chia seeds + +Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. + +Preparation notes: Ingredients sourced from local market where possible. No processed ingredients. +This meal was chosen to support training goals and provide steady energy through the next session. +Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 medium, blueberries 40 g, almond +butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 g carbs, 18 g fat. Prepared the +night before. Added walnuts for extra omega-3s. + +--- + +### Mid-Morning Snack --- Greek yogurt parfait + +Full-fat Greek yogurt 200 g, granola 40 g, mixed berries 60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk between meetings. Kept energy stable without a spike. + +Preparation notes: Ingredients sourced from local market where possible. No processed ingredients. +This meal was chosen to support training goals and provide steady energy through the next session. +Full-fat Greek yogurt 200 g, granola 40 g, mixed berries 60 g, flaxseed 10 g. Macros: approx 380 +kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk between meetings. Kept energy stable without +a spike. + +--- + +### Lunch --- Grilled chicken quinoa bowl + +Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. + +Preparation notes: Ingredients sourced from local market where possible. No processed ingredients. +This meal was chosen to support training goals and provide steady energy through the next session. +Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet potato 120 g, steamed broccoli +100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh herbs. Macros: approx 680 kcal, 52 +g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. + +--- + +### Afternoon Snack --- Rice cakes with avocado + +3 rice cakes, half avocado approx 70 g, sea salt, chilli flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to prepare, satisfying without heaviness before evening session. + +Preparation notes: Ingredients sourced from local market where possible. No processed ingredients. +This meal was chosen to support training goals and provide steady energy through the next session. 3 +rice cakes, half avocado approx 70 g, sea salt, chilli flakes, squeeze of lime. Macros: approx 280 +kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to prepare, satisfying without heaviness before +evening session. + +--- + +### Dinner --- Salmon with roasted vegetables + +Atlantic salmon fillet 200 g baked with garlic and dill, roasted courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. + +Preparation notes: Ingredients sourced from local market where possible. No processed ingredients. +This meal was chosen to support training goals and provide steady energy through the next session. +Atlantic salmon fillet 200 g baked with garlic and dill, roasted courgette 100 g, red peppers 100 g, +red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. Macros: approx 740 kcal, 48 g protein, +68 g carbs, 22 g fat. + +--- + +### Evening Snack --- Cottage cheese and fruit + +Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks 60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow-digesting protein before sleep. + +Preparation notes: Ingredients sourced from local market where possible. No processed ingredients. +This meal was chosen to support training goals and provide steady energy through the next session. +Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks 60 g, pumpkin seeds 15 g. Macros: +approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow-digesting protein before sleep. + +--- + +## Sleep Log + +### Monday + +Bedtime: 10:45 PM --- Wake time: 6:15 AM --- Duration: 7 h 30 min --- Score: 82/100 + +One brief waking at 2:30 AM. Deep sleep 1 h 48 min. REM 1 h 22 min. Room temperature 18 C. No screen +time 1 hour before bed. Felt rested on waking. Sleep environment maintained at 18 C with blackout +blinds. No caffeine after 2 PM. Wind-down routine includes 10 minutes reading and 5 minutes +breathing exercises. + +--- + +### Tuesday + +Bedtime: 10:30 PM --- Wake time: 6:00 AM --- Duration: 7 h 30 min --- Score: 88/100 + +Uninterrupted. Best night this week. Deep sleep 2 h 04 min. Fell asleep within 8 minutes. Morning +mood excellent. Sleep environment maintained at 18 C with blackout blinds. No caffeine after 2 PM. +Wind-down routine includes 10 minutes reading and 5 minutes breathing exercises. + +--- + +### Wednesday + +Bedtime: 11:20 PM --- Wake time: 6:30 AM --- Duration: 7 h 10 min --- Score: 74/100 + +Delayed sleep onset approx 25 min — had a stressful call at 9 PM. Deep sleep below average at 1 h 12 +min. Woke slightly groggy. Sleep environment maintained at 18 C with blackout blinds. No caffeine +after 2 PM. Wind-down routine includes 10 minutes reading and 5 minutes breathing exercises. + +--- + +### Thursday + +Bedtime: 10:15 PM --- Wake time: 6:00 AM --- Duration: 7 h 45 min --- Score: 90/100 + +Excellent. Deep sleep 2 h 18 min. REM 1 h 41 min. Magnesium glycinate supplement started this week — +possibly contributing to improvement. Sleep environment maintained at 18 C with blackout blinds. No +caffeine after 2 PM. Wind-down routine includes 10 minutes reading and 5 minutes breathing +exercises. + +--- + +### Friday + +Bedtime: 11:50 PM --- Wake time: 7:30 AM --- Duration: 7 h 40 min --- Score: 78/100 + +Later bedtime due to social dinner. Sleep quality reasonable despite shorter wind-down. HRV higher +than expected at 68 ms. Sleep environment maintained at 18 C with blackout blinds. No caffeine after +2 PM. Wind-down routine includes 10 minutes reading and 5 minutes breathing exercises. + +--- + +### Saturday + +Bedtime: 10:00 PM --- Wake time: 6:45 AM --- Duration: 8 h 45 min --- Score: 94/100 + +Best sleep score of the week. No alarm. Woke naturally. Deep sleep 2 h 52 min. Body felt fully +recovered. Sleep environment maintained at 18 C with blackout blinds. No caffeine after 2 PM. Wind- +down routine includes 10 minutes reading and 5 minutes breathing exercises. + +--- + +### Sunday + +Bedtime: 10:30 PM --- Wake time: 7:00 AM --- Duration: 8 h 30 min --- Score: 91/100 + +Post long-ride recovery sleep. Deep sleep elevated as expected. HRV 72 ms — highest of the week. +Sleep environment maintained at 18 C with blackout blinds. No caffeine after 2 PM. Wind-down routine +includes 10 minutes reading and 5 minutes breathing exercises. + +--- + +## Health Metrics + +### Resting Heart Rate + +**Current value:** 48 bpm + +Measured immediately on waking before getting out of bed. Down from 52 bpm six months ago. +Consistent aerobic training producing clear adaptation. Target below 45 bpm by end of year. Tracking +this metric consistently allows identification of long-term trends and early detection of +overtraining or under-recovery. Data recorded daily and reviewed weekly. + +--- + +### HRV + +**Current value:** 64 ms avg + +Measured via chest strap on waking. Weekly trend slightly upward. Dips on high-stress or high-volume +days as expected. Target sustainably above 70 ms. Tracking this metric consistently allows +identification of long-term trends and early detection of overtraining or under-recovery. Data +recorded daily and reviewed weekly. + +--- + +### Body Weight + +**Current value:** 78.4 kg + +Measured fasted, same time each morning. Stable for 6 weeks. Composition improving — body fat +estimated at 13.2 percent via DEXA last month. Tracking this metric consistently allows +identification of long-term trends and early detection of overtraining or under-recovery. Data +recorded daily and reviewed weekly. + +--- + +### VO2 Max estimated + +**Current value:** 54.1 ml/kg/min + +Estimated by GPS watch from recent run data. Up from 51.8 ml/kg/min three months ago. Targeting 56 +ml/kg/min by end of Q2. Tracking this metric consistently allows identification of long-term trends +and early detection of overtraining or under-recovery. Data recorded daily and reviewed weekly. + +--- + +### Daily Steps + +**Current value:** 11,240 avg + +Excluding structured workouts. Achieved via walking meetings, standing desk, evening strolls. Target +10,000+ met on 6 of 7 days this week. Tracking this metric consistently allows identification of +long-term trends and early detection of overtraining or under-recovery. Data recorded daily and +reviewed weekly. + +--- + +### Hydration + +**Current value:** 2.8 L avg + +Tracked via marked water bottle. Excludes coffee and other beverages. Urine colour consistently pale +yellow — well hydrated. Tracking this metric consistently allows identification of long-term trends +and early detection of overtraining or under-recovery. Data recorded daily and reviewed weekly. + +--- + +### Stress Level subjective + +**Current value:** 3.2 / 10 + +Self-rated daily. Elevated mid-week due to project deadline. Managed via morning run and evening +meditation. Tracking this metric consistently allows identification of long-term trends and early +detection of overtraining or under-recovery. Data recorded daily and reviewed weekly. + +--- + +## Supplements + +| Supplement | Dose | Timing | Notes | +|---|---|---|---| +| Creatine monohydrate | 5 g | Post-workout | Consistent daily use for 8 months. | +| Vitamin D3 + K2 | 4000 IU + 100 mcg | Morning with fat | Blood level 92 nmol/L — optimal range. | +| Omega-3 fish oil | 2 g EPA+DHA | Evening with dinner | Triglycerides down 18% since starting. | +| Magnesium glycinate | 400 mg | 30 min before sleep | Started this week — sleep quality improving. | +| Whey protein isolate | 30 g | Post-workout | Only on strength days when meal timing is off. | + +## Weekly Reflections + +This week felt well-balanced. Training volume was appropriate. Nutrition was on-point for five of seven days. Friday dinner was a social meal — higher in saturated fat but this is sustainable. The new magnesium glycinate supplement appears to be improving sleep quality. + +Running pace has improved over the last three months — average pace down from 5:42/km to 5:14/km at the same heart rate zone. This suggests meaningful aerobic adaptation occurring. + +Key focus for next week: increase squat volume slightly, nail sleep consistency with a 10:30 PM bedtime every night, add a second yoga session on Wednesday, and experiment with pre-workout meal timing. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + +## Extended Training Analysis + +Session analysis --- Morning Run at 6:00 AM: Ran the river-path loop. Legs felt heavy for the first +kilometre then loosened up. Breathing was controlled throughout. Finished strong on the uphill +stretch near the bridge. Total elevation gain 48 m. Weather was 7 C and overcast — ideal conditions. +Progressive overload principles were applied throughout. Recovery between sessions was adequate +based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration was +maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Strength Training — Upper Body at 7:15 AM: Bench press 4x8 at 80 kg, incline +dumbbell press 3x10 at 28 kg, cable fly 3x12 at 15 kg, tricep pushdown 3x15, bicep curl 3x12 at 16 +kg. Focused on slow eccentric phase. No notable joint discomfort. Left shoulder slightly tight on +last set of bench. Progressive overload principles were applied throughout. Recovery between +sessions was adequate based on HRV data. Form remained consistent throughout all sets and +repetitions. Hydration was maintained at target levels. Post-session nutrition was consumed within +the optimal 30-minute anabolic window. Sleep quality the following night was tracked and correlated +with session intensity. + +Session analysis --- Cycling — Zone 2 Cardio at 6:30 AM: Flat route along the coast road. Kept heart +rate between 135-155 bpm the whole ride. Drank 750 ml water, consumed one gel at 60-minute mark. +Bike felt smooth. Noticed slight tightness in right hip flexor around km 30 — stretched immediately +after. Progressive overload principles were applied throughout. Recovery between sessions was +adequate based on HRV data. Form remained consistent throughout all sets and repetitions. Hydration +was maintained at target levels. Post-session nutrition was consumed within the optimal 30-minute +anabolic window. Sleep quality the following night was tracked and correlated with session +intensity. + +Session analysis --- Yoga — Vinyasa Flow at 7:00 AM: Full vinyasa sequence focused on hip openers +and spinal mobility. Held pigeon pose for 90 seconds each side. Balance improved noticeably compared +to last week. Breathing stayed calm throughout. Finished with 10 minutes savasana. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Session analysis --- Strength Training — Lower Body at 6:45 AM: Squat 5x5 at 100 kg (new personal +record), Romanian deadlift 4x8 at 75 kg, leg press 3x12 at 140 kg, walking lunges 3x16, calf raises +4x20. Knees tracked well. Core bracing felt solid. Progressive overload principles were applied +throughout. Recovery between sessions was adequate based on HRV data. Form remained consistent +throughout all sets and repetitions. Hydration was maintained at target levels. Post-session +nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the following +night was tracked and correlated with session intensity. + +Session analysis --- Swimming — Technique Session at 7:00 AM: Focused on freestyle catch and early +vertical forearm. Did 8x100 m at 1:50 pace with 20 s rest. Coach noted improvement in hip rotation. +Pull buoy set 400 m. Cool-down 200 m backstroke. Pool temp 27 C. Progressive overload principles +were applied throughout. Recovery between sessions was adequate based on HRV data. Form remained +consistent throughout all sets and repetitions. Hydration was maintained at target levels. Post- +session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- HIIT — Kettlebell Circuit at 6:15 AM: 5 rounds: 10 kettlebell swings 32 kg, 8 +goblet squats 24 kg, 6 push-press 20 kg each, 10 box jumps, 12 mountain climbers. 45 s work / 15 s +rest. Felt strong on rounds 1-3, fatigued rounds 4-5 but maintained form. Progressive overload +principles were applied throughout. Recovery between sessions was adequate based on HRV data. Form +remained consistent throughout all sets and repetitions. Hydration was maintained at target levels. +Post-session nutrition was consumed within the optimal 30-minute anabolic window. Sleep quality the +following night was tracked and correlated with session intensity. + +Session analysis --- Rest Day — Active Recovery at 8:00 AM: Gentle walk through the park. No +structured exercise. Used foam roller for 20 minutes targeting quads, IT band, and thoracic spine. +Sleep the night before was 8 h 10 min — well rested. Felt fully recovered by evening. Progressive +overload principles were applied throughout. Recovery between sessions was adequate based on HRV +data. Form remained consistent throughout all sets and repetitions. Hydration was maintained at +target levels. Post-session nutrition was consumed within the optimal 30-minute anabolic window. +Sleep quality the following night was tracked and correlated with session intensity. + +Nutrition analysis --- Breakfast: Rolled oats 80 g, full-fat milk 200 ml, chia seeds 15 g, banana 1 +medium, blueberries 40 g, almond butter 20 g, honey 10 g. Macros: approx 620 kcal, 22 g protein, 88 +g carbs, 18 g fat. Prepared the night before. Added walnuts for extra omega-3s. Macronutrient +targets were met within acceptable ranges. Micronutrient density was prioritised alongside macros. +Meal timing was aligned with training schedule to maximise nutrient partitioning and glycogen +replenishment. + +Nutrition analysis --- Mid-Morning Snack: Full-fat Greek yogurt 200 g, granola 40 g, mixed berries +60 g, flaxseed 10 g. Macros: approx 380 kcal, 18 g protein, 42 g carbs, 12 g fat. Eaten at desk +between meetings. Kept energy stable without a spike. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Lunch: Grilled chicken breast 180 g, quinoa 90 g dry weight, roasted sweet +potato 120 g, steamed broccoli 100 g, cherry tomatoes 80 g, olive oil 15 ml, lemon juice, fresh +herbs. Macros: approx 680 kcal, 52 g protein, 72 g carbs, 16 g fat. Meal-prepped on Sunday. +Macronutrient targets were met within acceptable ranges. Micronutrient density was prioritised +alongside macros. Meal timing was aligned with training schedule to maximise nutrient partitioning +and glycogen replenishment. + +Nutrition analysis --- Afternoon Snack: 3 rice cakes, half avocado approx 70 g, sea salt, chilli +flakes, squeeze of lime. Macros: approx 280 kcal, 4 g protein, 30 g carbs, 15 g fat. Quick to +prepare, satisfying without heaviness before evening session. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Dinner: Atlantic salmon fillet 200 g baked with garlic and dill, roasted +courgette 100 g, red peppers 100 g, red onion 60 g, brown rice 80 g dry weight, olive oil 15 ml. +Macros: approx 740 kcal, 48 g protein, 68 g carbs, 22 g fat. Macronutrient targets were met within +acceptable ranges. Micronutrient density was prioritised alongside macros. Meal timing was aligned +with training schedule to maximise nutrient partitioning and glycogen replenishment. + +Nutrition analysis --- Evening Snack: Low-fat cottage cheese 150 g, kiwi 1 large, pineapple chunks +60 g, pumpkin seeds 15 g. Macros: approx 250 kcal, 22 g protein, 22 g carbs, 7 g fat. Good slow- +digesting protein before sleep. Macronutrient targets were met within acceptable ranges. +Micronutrient density was prioritised alongside macros. Meal timing was aligned with training +schedule to maximise nutrient partitioning and glycogen replenishment. + diff --git a/tests/paket.references b/tests/paket.references new file mode 100644 index 0000000..6b1a116 --- /dev/null +++ b/tests/paket.references @@ -0,0 +1,3 @@ +group Tests + Expecto + YoloDev.Expecto.TestSdk diff --git a/tests/tests.fsproj b/tests/tests.fsproj new file mode 100644 index 0000000..3a4af2b --- /dev/null +++ b/tests/tests.fsproj @@ -0,0 +1,25 @@ + + + + + Exe + net10.0 + + + + + + + + + + + + + + + + + + +