Code review as the primary teaching channel
Reviews on this engagement were slower and more written than I would normally run them. Every non-trivial change attracted a comment that explained the reasoning, not just the verdict. "Move this to the progress engine" became "Move this to the progress engine because the BFF should not know which source system this field comes from, and here is what breaks if it does." That style of review is expensive in the moment. It is also the cheapest way I know to transfer architectural intent to a team that has not seen the patterns before.
The shift I encouraged among more experienced reviewers was to ask questions rather than issue corrections. A junior developer who has been asked "what would you expect this to do if the OneFile feed were a day late" learns something different to one who has been told "you need to handle stale data here". Both questions and corrections have their place, but the question gets the pattern into the developer's head; the correction only fixes that one PR.
Patterns first, principles second
I led with concrete patterns and only justified them with principles when asked. Telling a bootcamp graduate to "follow the BFF pattern" with a specific worked example in front of them is more useful than telling them to "respect separation of concerns" in the abstract. Once they had written a few endpoints against the pattern they could reason about what the pattern was doing for them. At that point the principle was something they had derived rather than been handed.
This is the inversion of how a lot of senior engineers default to teaching. Principles first, then examples, is a comfortable ordering for the senior. Examples first, then principles, is a more useful ordering for the junior.
Claude Code coaching: verify, do not trust
The single rule I gave the team for Claude Code use was "verify, do not trust". Every output is a draft. Every output is read, pushed back on, and corrected before it goes anywhere near a build. I demonstrated this with my own discovery work, including the cases where Claude Code had been wrong: the over-produced component variations, the integration patterns that did not match the third-party platforms, the points where Campus and Beehive boundaries had to be hand-fed. Showing the team where AI had been wrong on this exact codebase was more useful than any general guidance about AI's limits.
The other rule was: every Claude Code session has a brief and a verifier. The brief is what you asked for. The verifier is the person, or the test, that will tell you whether the output is right. If you cannot describe the verifier before you start, do not start.
What I would do differently
If I had the engagement again I would invest in a written "patterns" document earlier, in addition to the code review channel. Code review transferred intent to the people who were doing the reviews. A patterns document would have transferred it to the people who were not on a given PR. The cost of writing one is small; the cost of not having one shows up later, when a junior developer is reaching for a pattern they have not seen before and there is no senior in the room to ask.
I would also start the Claude Code coaching from week one rather than waiting for the client to ask. The "verify, do not trust" rule is more easily taught while the team is still forming its instincts than after they have started developing AI habits on their own.