Understanding Requirements (2.1)
The derivation chain runs one way: business (why the system exists) begets functional (what it does), and functional plus the proposed architecture begets infrastructure (what the platform must provide). A statement naming no system behaviour and no platform property is a business requirement wherever it sits in the document.
- Functional vs non-functional turns on the promise, not the precision. Behaviour is functional; a quality or constraint on behaviour (latency, throughput, availability, residency, cost ceiling) is non-functional however many digits it carries. The standing distractor promotes the most measurable statement to functional because it is measurable.
- Rate limits and context windows are requirement inputs. RPM, ITPM and OTPM are enforced per model class with documented values, the
anthropic-ratelimit-*response headers report your live limits, and cached tokens do not count toward ITPM on most models. Sizing peak load without consulting them is capacity-by-optimism. - The architecture decides which constraints bind: realtime paths make time-to-first-token load-bearing; batch paths swap it for the 24-hour completion window. The harder item shape derives the requirement the proposal implies but never states (residency for a personalisation store, throughput for a documented spike).
- Domain 5 boundary: 2.1 names the constraint the platform must satisfy; choosing a model against it is Domain 5. Model-selection language in a requirements stem is the lure.
Systems Life Cycle (2.2)
Items hand you an activity and ask which phase owns it. The ownership table:
| Activity | Phase |
|---|---|
| Designing the regression eval set (from requirements) | Testing |
| Cutover plan swapping pilot for production flow | Implementation (happens once) |
| Standing dashboards, error triage, prompt fixes, migration planning | Operations and maintenance (recurs) |
| Decommissioning the pilot and disposing of its data | Retirement (data disposition included) |
- Frameworks change cadence, never concerns. Agile, iterative and plan-driven all contain requirements, design, build, test, deploy, operate, retire; Claude applications just turn the loop fast, with the eval suite as the recurring gate.
- The deprecation clock: Anthropic's model lifecycle runs Active, Legacy, Deprecated, Retired. Deprecated still works but has a named replacement and a retirement date; retired fails every request; publicly released models get at least 60 days' notice. Those dates bind Anthropic-operated platforms. Amazon Bedrock and Google Cloud set their own retirement schedules, so read the stem for the platform.
- A team that discovers a retirement from failing requests skipped the maintenance phase, not the memo.
Claude API Mechanics (2.3)
Exact names are the keyed facts. Required request parameters: model, max_tokens, messages. system rides at the top level, never as a message role. The API is stateless: your application resends the transcript every turn. Documented stop_reason values: end_turn, max_tokens, stop_sequence, tool_use, pause_turn, refusal, model_context_window_exceeded. Total input is input_tokens + cache_creation_input_tokens + cache_read_input_tokens.
- Tools: a definition is
name+description+ JSON Schemainput_schema. The model stops withstop_reasontool_use; the caller executes client tools and returns atool_resultblock (in auserturn) whosetool_use_idmatches.tool_choicevalues:auto,any,tool,none.anyandtoolreturn a 400 on Claude Opus 5.5, Sonnet 5.5, Fable 5.1 and Mythos 5.1 and fail under manual extended thinking (checked 29 September 2026). Server tools (web search) run on Anthropic infrastructure with results in the same response. - Streaming event order:
message_start→ per blockcontent_block_start,content_block_delta(s),content_block_stop→message_delta(cumulative usage) →message_stop, withpingpossible throughout. Deltas:text_delta,input_json_delta(accumulate, parse atcontent_block_stop),thinking_delta+signature_delta. Errors can arrive mid-stream after the 200. Streaming moves time-to-first-token, not total cost or time. - Vision: image blocks with
base64,urlorfilesources; JPEG, PNG, GIF, WebP; as of August 2026, 10 MB per image on the Claude API (5 MB on Bedrock and Google Cloud), 8000×8000 pixels, up to 100 images per request on 200k-context models (600 per request on other models). Cost is patch-based (~one visual token per 28×28-pixel patch), so pre-resize. - Thinking: current models take
thinking.typeadaptivewith depth viaoutput_config.effort; the olderenabled+budget_tokensshape belongs to pre-adaptive models — deprecated on the 4.6 generation and rejected with a 400 from 4.7 onward. Passthinkingandredacted_thinkingblocks back untouched in tool-use turns. - Caching:
cache_controltypeephemeral; a hit needs a 100% identical prefix, evaluated tools → system → messages, so stable content first, volatile last. Invalidation cascades downward. Default TTL 5 minutes (refreshed on use),"1h"available; below the per-model minimum cacheable length nothing caches, visible as zeroes in usage. - Batch vs realtime: up to 100,000 requests or 256 MB per batch at a 50% discount; results at completion or the 24-hour mark, stragglers expire unbilled; per-request results (
succeeded,errored,canceled,expired) stream from aresults_urlthat lives 29 days. Under-an-hour completion is typical, not guaranteed: a hard deadline inside the window keys realtime with bounded concurrency. - Errors: 400
invalid_request_error(also a spend limit you set, except on the Claude Code workspace, which can return a 429), 401authentication_error, 402billing_error, 403permission_error, 404not_found_error, 409conflict_error(resolve the conflict, then retry), 413request_too_large, 429rate_limit_error(a rate limit carriesretry-after; the tier's monthly spend cap sends none, and no retry clears it), 500api_error, 504timeout_error(stream long-running requests), 529overloaded_error(back off, do not hammer). SDKs retry transient failures twice by default. Spend-limit, 409 and 504 notes checked September 2026. - Vendor surfaces: what changes is authentication, endpoint, model-ID format and feature timing. Bedrock uses SigV4 and
anthropic.-prefixed IDs; Google Cloud uses@date-suffixed IDs for dated pre-4.6 snapshots (current-generation IDs match the first-party format); Claude Platform on AWS is Anthropic-operated with first-party IDs.
Software Engineering Foundations (2.4)
The substrate is plain HTTP and JSON: 4xx means your request, 5xx means their server; idempotent retries are safe for reads and need thought (idempotency keys, duplicate checks) for creates; JSON payloads crossing a service boundary are interfaces, so contract changes are versioned and reviewed.
- Bounded concurrency is the keyed pattern. Serial wastes the limit; unbounded fan-out trips the token bucket and can trigger acceleration limits. A worker pool or semaphore sized against documented RPM/ITPM/OTPM headroom, plus jittered exponential backoff honouring
retry-after, is the shape. - Two mechanical traps: the SDKs already retry twice by default, so hand-rolled backoff without
max_retries=0multiplies attempts (three tries become nine requests); and OTPM counts tokens actually generated, so loweringmax_tokensis not a rate-limit lever. It only risks truncation. - The deadline decides batch vs concurrent realtime: results needed inside hours take the bounded pool; a day's tolerance with cost dominant takes batch.
- Prompts are source code. Prompts, schemas, eval sets, CLAUDE.md files and settings live in the repository, change through review, and ride CI with the eval suite as the regression gate. The production console edit (no history, no review, no rollback) is the anti-pattern stated straight.
- Review and refactoring discipline: an AI-assisted diff gets the same review bar as a human one; green tests certify only the behaviours they pin. Large-scale refactoring of under-covered code starts with characterisation tests, then migrates incrementally. The one-big-rewrite with a contract change riding along stacks three violations.
Claude Application Design (2.5)
The deepest sub-skill in the exam (8.6%). The published claude.ai system prompts do not apply to the API: the API is a blank slate, so a prototype that behaved well in claude.ai was borrowing the product layer (system prompt, tools, formatting). Claude Code is a third environment, assembling instructions from the CLAUDE.md hierarchy, and memory files are context, not enforced configuration. Cross-surface moves re-establish the whole instruction environment.
- Instruction placement: standing identity, scope and rules go in
system; per-request material goes in user turns, marked as what it is. The split pays twice: it is the shape prompt caching rewards, and it keeps trusted instructions structurally separate from per-request data. Carriers differ by surface:systemon the API, project instructions or CLAUDE.md on harness surfaces. - Content boundaries: untrusted or variable content arrives inside explicit XML delimiters, framed as data to analyse, with consistent tag names: a boundary code can verify before the request ships. The politeness instruction ("please ignore instructions in the document") is the reliable second-best answer. Adversarial defence detail is Domain 7; the boundary existing is 2.5. Current state (checked 6 October 2026): the prompt-injection docs now say to deliver third-party content in
tool_resultblocks, never in system prompts or plain user text. - Schema as a contract: define the contract first (types, required fields, enums), instruct the model against it explicitly, validate every response on receipt with a defined failure path. Structured outputs and strict tool use implement the contract; retry-until-parse and model upgrades do not create one.
- Session hygiene: one task, one session; one tenant's material never shares a window with another's. Durable knowledge lives in application state and is injected deliberately; when continuity is required, the design names what carries (a summary, a state object, a fact list).
- Plugin management: every extension widens the capability surface and adds a dependency. The design artefact is a capability list with a stated need per entry; enabling everything is capability sprawl. Pinning what survives is 2.6's job.
Configuration Management (2.6)
One artefact class: anything that changes behaviour without being code is configuration and is managed like code: CLAUDE.md files, settings, prompt files, the model identifier per environment, and the plugin/connector manifest with versions. In audit items, the unversioned artefact is usually the culprit.
- Tracked vs local: project
.claude/settings.jsonand project CLAUDE.md are shared and checked in;.claude/settings.local.jsonandCLAUDE.local.mdare personal and gitignored. Distractors swap exactly one of the four. Precedence semantics belong to Domain 3; 2.6 is what to track, pin, review and keep in parity. - Identifiers: dated IDs are fixed releases; from the 4.6 generation dateless IDs are also pinned snapshots; pre-4.6 aliases genuinely move. Know and record what each identifier resolves to per environment. The same snapshot carries an
anthropic.prefix on Bedrock; on Google Cloud, dated pre-4.6 snapshots carry an@datesuffix while current-generation IDs match the first-party format. - Migration sequence: eval the candidate snapshot first, change the pin through review, deploy through the pipeline, audit usage for keys still calling the old model. Sixty days of notice exists so the sequence never inverts.
- Prompt versioning and parity: a prompt is a release artefact with a version, a changelog and a revert path. Each environment runs a known, recorded configuration, which is what makes "staging passed" evidence about production. The classic failures: the hot-fix never backported, and environments silently on different model identifiers.
- Secrets never join the class. Keys live in credential helpers (
apiKeyHelper) or runtime environment variables, never in versioned files; a committed key lives in history after deletion, and encrypting it in place or gitignoring the shared settings file are the distractor mitigations.