Your 3 x 3 x 3 example points at the one guardrail your list doesn't cover. Each technique on it works per call, so every layer can follow all six and C still sees 27 attempts. The fix sits between the layers. The SRE book chapter you cite says to avoid retrying at multiple levels, because attempts multiply by the count at each layer, and suggests a process-wide retry budget, for example 60 retries per minute, after which you fail the request instead of retrying.
In your A, B, C setup that could mean only B retries C, and when B gives up it returns a specific overloaded status that tells A not to retry. Your simulation would show the difference well: add a counter for attempts reaching C, run it once with retries at every layer and once with retries at B only.
Your 3 x 3 x 3 example points at the one guardrail your list doesn't cover. Each technique on it works per call, so every layer can follow all six and C still sees 27 attempts. The fix sits between the layers. The SRE book chapter you cite says to avoid retrying at multiple levels, because attempts multiply by the count at each layer, and suggests a process-wide retry budget, for example 60 retries per minute, after which you fail the request instead of retrying.
In your A, B, C setup that could mean only B retries C, and when B gives up it returns a specific overloaded status that tells A not to retry. Your simulation would show the difference well: add a counter for attempts reaching C, run it once with retries at every layer and once with retries at B only.