Week 3Day 18 of 30120 minutes~56 min of reading

Ship — SLOs for a system that shrugs

Production: latency, reliability, and the ops you already know

Ship like a delivery lead

Why this matters for a delivery manager

You have run services with SLOs, or you have suffered the absence of them. AI adds model deprecation, nondeterminism, and a metered bill. The ops story is how an FDE or delivery lead looks like they have done this before — even if this is their first model in prod.

Nondeterminism is not a reason to skip SLOs. It is a reason to write them on the dimensions you can manage: availability of the path, latency to first token and to complete, quality on a rolling golden sample, and dollars per successful task. If those four are not on a page, you are hoping.

Model versions are releases. Floating latest is an unscheduled change with no owner. You already know how to run a change calendar. Put the pin on it. Demand the dashboard you would demand of any other user-facing service, plus eval and spend.

You will be able to

  • Write SLOs for an AI feature that are not 'it's usually fine'
  • Connect cost, cache, routing, and fallback into one ops picture
  • Plan model-version change as a release, not as a surprise
  • Put observability on the same dashboard as the business metric

2-hour clock

120:00

Now: Read the ops picture · 50m

The 2-hour session

Concepts, in full

This block is a slow read — about an hour with the diagrams. After each concept, write one sentence in notes (what you already do vs what is new) and tick annotated. Do not skim the last concept.

01

The request path, with fallback as part of the happy path

A production request is a path, not a model call. Authenticate the user. Authorize the corpus. Retrieve. Build the prompt. Call the model, or a cheaper model first to classify 'is this in scope.' Check schema. Log metadata. Render. If any hop fails, you already know where the user goes, because you designed the fallback before you needed it. Fallback is part of the happy path. An incident is a surprise. A fallback is a design.

If the model is down: cached answers for FAQs you actually see, keyword search only with the chunks on the screen, or hand to a human with the question pre-filled. If quality is low — eval drop, schema fail rate up — shrink to retrieve-only: show the chunks, do not generate. Users prefer an honest search result to a stuck spinner or a fluent lie. Write those three degraded modes down. Pick which one fires on which signal.

Routing is ops, not architecture theatre. Cheap small model for classify and 'is this in scope.' Frontier for the actual answer when it is in scope. You designed this on day 5. Production is making it real with a flag, a timeout, and a metric on how often you escalate. If every request goes to the frontier model, you do not have routing. You have a bill.

Timeouts need a number. First token in under two seconds is a different promise from complete in under four. If the vendor is slow, fail to fallback rather than wait twelve seconds and then fail. Users experience the wait as 'it does not work.' Your availability SLO will look fine while adoption dies. Measure what the user waits, not only whether the API returned 200.

Caching is a control on both latency and cost, and a risk on freshness. Cache FAQ answers with a short TTL and a corpus version key so a SOP change invalidates them. Do not cache personalized or ACL-sensitive completions unless the cache key includes the user identity. A shared cache is how you leak. Put cache on the diagram with its key and its TTL, or do not cache.

The path must fail closed on authz. If identity is down, you do not retrieve 'as a default user.' If the index is down, you do not skip retrieve and let the model talk from weights. Those two failure modes are how you get fluent unauthorized answers. Prefer a visible error or a retrieve-only fallback that also cannot retrieve. Closed is better than clever.

Measure each hop or you will argue about the model when the index is cold. Retrieve time, route time, generation to first token, generation to complete, schema check, render. A delivery lead who can say 'retrieve is 1.8 seconds of the 4.2' can assign work. End-to-end only is a blob. Tracing is not optional on a path you claim to operate. Put hop timings on the same dashboard as the SLO, even if v1 is a log you grep.

Retries turn a timeout into a bill and a duplicate write. Retry reads with a cap. Do not retry writes without idempotency keys on tool calls. If the model timed out after it had already opened the ticket, a retry opens two. You already know this from payment integrations. Apply it on day one of tools, not after the first duplicate. Read-only v1 still needs a retry cap so a hung vendor does not multiply spend while the user waits.

Diagram

Request path with fallback

01

Authn / authz

If identity is down, fail closed. Do not retrieve as a default user.

02

Retrieve

If the index is down, do not generate from weights. Search-only or error.

03

Route

Small model: in scope? Cheap path vs frontier. Flagged. Metered.

04

Generate

Pinned model. Timeouts on first token and complete. Schema check on the way out.

05

Fallback

Cache / keyword search / retrieve-only / handoff to human. Chosen by the signal, not by panic.

Every hop has a failure. The user should land on a designed degraded mode, not on a spinner or a fluent lie.

02

SLOs that survive nondeterminism

Availability is whether the path responded, not whether the answer felt wise. The API, your app, retrieve, and the model hop — or the fallback you counted as success. Write the number: 99.5 percent of requests get a designed response (answer, refuse, or fallback) inside the latency SLO. 'It is usually fine' is not an SLO. An SLO is a number you will freeze changes for.

Latency is two numbers: p95 to first token, and p95 to complete. Streaming makes first token the thing users feel. Complete is what you need for schema checks and for writes. Internal copilot, eighty users: first token under two seconds, complete under four is a reasonable starting bar. If you cannot hit it, reduce context, route, or cache. Do not ask users to wait because the prompt is luxurious.

Quality is a rolling score on a golden sample, not a single thumbs-up percentage. Reuse the day 16 bar: groundedness and recall on a weekly sample, must-refuse still passing. Thumbs can sit next to it as a tripwire. Thumbs alone will lie — users upvote fluent wrongness and downvote honest refusals. If quality burns the error budget, you freeze prompt changes. That sentence is how you stop a well-meaning engineer from tweaking production every afternoon.

Cost is dollars per successful task, with a daily cap alarm. Token burn is a trailing indicator. Task cost is the one finance understands and the one that catches 'we retrieve seventy chunks and call the frontier model twice.' Set a daily cap that pages a human. A cap without a page is a number on a slide. You already know bill shock from cloud. This is cloud with worse defaults, because every request can get more expensive by accident of prompt length.

Error budget is the miss you tolerate before you freeze. If availability or quality or spend burns the budget for the week, prompt changes stop, retrieve experiments stop, and you spend the remaining time on reliability or on rolling back. This is the same governance you use on a mature service. Apply it before the service is mature, or it will never get there.

Write four SLOs, not twelve. Availability, latency, quality sample, daily spend. Owners. Freeze rule. You can add more later. A long list nobody manages is how SLOs become wallpaper. Put them on the same page as the dashboard tiles so the number and the graph live together.

Error budget is the miss you tolerate before you freeze prompt and retrieve changes. If quality or spend burns the budget for the week, you stop decorating the prompt and you spend the remaining time on reliability or rollback. This is how you stop a well-meaning engineer from tweaking production every afternoon. Write the freeze rule next to the four SLOs. A number without a freeze is a wish. You already run this on mature services. Start here before the service is mature, or it never will be.

Availability counts designed responses: answer, refuse, or fallback inside the latency SLO. It does not count 'the user liked it.' A fallback that fired correctly is a success against the availability SLO and a mark on the fallback-rate tile. That split matters. If you count fallback as failure, people will disable fallback to keep the graph green, and users will get spinners. If you hide fallback, you will not know the model has been down for two hours. Count both, separately.

SLO sheet for an internal copilot (example numbers — write yours, do not inherit these blindly).
SLOPromiseMeasured byIf you miss
Availability99.5% designed responses (answer, refuse, or fallback)Success of the path, not 'user liked it'Freeze feature work; fix the hop that is failing
Latencyp95 first token < 2s; p95 complete < 4sServer timing + first-token markCut context, route, cache; do not tell users to wait
QualityGroundedness ≥ 0.9 and recall@5 ≥ 0.8 on weekly golden sample; must-refuse passOffline set + human sampleFreeze prompt changes; error budget; waiver only with expiry
Cost$ / successful task under envelope; daily cap alarmToken spend attributed to success, not to raw callsTighten routing and cache; cap pages a human, not a channel

SLO sheet for an internal copilot (example numbers — write yours, do not inherit these blindly).

03

Latency, nondeterminism, and what you tell a sponsor

Nondeterminism means the same prompt can yield different tokens. Temperature, sampling, and the model itself. For a copilot, you usually want temperature near zero on factual answers, and you still will not get bit-for-bit replay. Do not promise replay. Promise a bar on groundedness and a pin on the model. Sponsors who grew up on deterministic systems need this sentence once, clearly, without a lecture on probability.

Latency budgets get eaten by retrieve, by long context, by tool loops, and by the model. Measure each hop. If you only measure end-to-end, you will argue about the model when the index is cold. A delivery lead who can say 'retrieve is 1.8 seconds of the 4.2, generation is 1.1, the rest is our app' is a delivery lead who can assign work. That sentence is why tracing is not optional.

Streaming is a user-experience control as much as a technical one. First token on screen tells the user the system is alive. For confirm-on-write, you may not want to stream into a send. For Q&A, you almost always do. Decide per action. Do not stream a customer email into a text box a hurried human might send halfway through.

Retries are how you turn a timeout into a bill and a duplicate write. Retry reads with a cap. Do not retry writes without idempotency. If the model timed out after it had already opened the ticket, a retry opens two. You already know this from payment integrations. Apply it. Put idempotency keys on tool calls.

What you tell a sponsor: we do not promise the same sentence twice. We promise the path is up, the answer is grounded to a bar, the refuse cases refuse, and we will freeze changes if those bars burn. We promise a fallback when the model is down, not a spinner. We promise a pin so a vendor surprise is a scheduled change. That is an ops story a CIO can hear without translating.

What you do not tell a sponsor: 'the model is nondeterministic so we cannot have SLOs,' or 'we will just look at thumbs,' or 'latency depends.' Those sentences abdicate the job. Uncertainty is real. Unmanaged is a choice.

Temperature near zero on factual answers, and you still will not get bit-for-bit replay. Do not promise replay. Promise a pin, a groundedness bar, and a freeze if the bar burns. Sponsors who grew up on deterministic systems need that sentence once, clearly, without a lecture on probability. Write it in the SLO sheet in language they can reuse in their own steering. If they hear 'it depends' they will hear 'unmanaged.'

Streaming is a user-experience control as much as a technical one. First token on screen tells the user the system is alive. For Q&A, stream. For confirm-on-write, do not stream into a send box a hurried human might fire halfway through. Decide per action, the same way you decided HITL per action. A single streaming default across the product is how you get a half-written customer email in a text box with a send button. Turn that default off on writes.

04

Model versions are releases

Vendors deprecate. New versions change tone, eval scores, latency, and cost. Pin a version. When you move, run the golden set, compare cost and latency, canary a percentage, keep a rollback pin. Write this as a change calendar item. Do not let 'the default model' float under you. Floating latest is an unscheduled release with no owner.

Prompt and model are a pair. Changing both on the same day is how you cannot tell what broke. Change one, run the set, then the other if you must. The change ticket names which one moved. This is ordinary isolation of variables. Production prompt editing plus a silent model bump is how a week of debugging becomes folklore.

Canary means a slice of traffic, not 'Priya will try it.' Five or ten percent of requests, or one team, with the same eval pulse and the same dashboard tiles, for a named period. If quality or latency or cost moves the wrong way, you roll back the pin. Canary without a rollback is a partial outage you chose.

Who approves a model move is the same list as who waives a quality miss, because a model move can cause a quality miss. Put it on the change calendar with the golden-set result attached. A vendor email that says 'please migrate by the 30th' is a trigger, not an approval. You already treat vendor-forced upgrades this way in other platforms. Do it here.

Document the pin where operators can find it. Config, not a comment in a notebook. The incident page from yesterday should say where the pin lives and how to revert it. If reverting takes a deploy window you cannot hit at 21:00, you do not have a rollback. You have a hope and a pipeline.

When a new version is better on the demo and worse on your golden tags, you do not move. The vendor's eval is not your eval. Day 16 already said this. Ops is where people forget it because the new name sounds like progress. Progress is a score on your set, not a name in a changelog.

Canary means a slice of traffic or one team, with the same eval pulse, for a named period, and a rollback pin you can actually revert at 21:00. 'Priya will try it' is not a canary. Canary without a rollback is a partial outage you chose. Who approves a model move is the same list as who waives a quality miss, because a model move can cause a quality miss. Put it on the change calendar with the golden-set result attached. A vendor email is a trigger, not an approval.

Prompt and model are a pair. Changing both on the same day is how you cannot tell what broke. Change one, run the set, then the other if you must. The change ticket names which one moved. Production prompt editing plus a silent model bump is how a week of debugging becomes folklore. Document the pin in config operators can find, not in a notebook comment. The incident page should say where the pin lives and how to revert it.

Diagram

Pinned model versus floating latest

A

Pinned version

  • Named model id in config operators can find
  • Golden set run before any move
  • Canary to a slice, rollback pin kept hot
  • Change calendar item with who approved
  • Prompt and model not changed on the same day
B

Floating latest

  • Vendor changelog is your release notes
  • Tone, cost, and eval can move overnight
  • No canary, no rollback, no owner
  • Incident reconstructs from folklore
  • You find out from the quality tile, late

A pin is a release you can eval, canary, and roll back. Floating latest is a change with no ticket.

05

Deprecation is a project, not an email

Vendors will retire the name you pinned. The email will arrive with a date. That date is the start of a project: impact, eval on the successor, cost/latency compare, canary, rollback plan, communication to users if behavior changes, change calendar, Security if the path or subprocessors change. Treat it like a platform upgrade, because it is one.

Have a written successor before you need it. When you choose a vendor on day 19, one of the five questions is deprecation plan. What is the notice period. What is the recommended successor. Can you keep the retired pin for thirty days after the date if you must. If the sales engineer cannot answer, you have a lock-in you have not priced.

Behavior change is the hidden cost. A successor that is 'better' may be more verbose, more sycophantic, worse at following your schema, more expensive. Your golden set is how you see it. Run it on the successor the week the email arrives, not the week of the deadline. If you must stay, you need a waiver and a prompt change, sequenced, not both on the deadline Friday.

Users notice tone. If the copilot starts answering like a different person, you will get tickets that are not quality fails and still hurt trust. Warn them. A one-line note in the UI for a week, and a note to champions. Change management applies to model moves. You would not swap a system of record without telling the users it looks different. Do not swap a model silently.

Budget the eval work. A deprecation is a few days of someone's time if you already have the set and the dashboard. It is a panic if you do not. This is one of the reasons day 16 exists. Ops without eval is a series of surprises with marketing names.

If you have more than one feature on the same pin, deprecation is a portfolio move. List the features, the owners, the bars, and the order you will canary. Do not move everything on one night because the email was urgent. Urgent for the vendor is not urgent for your error budget.

Have a written successor before you need it. Notice period, recommended next pin, how long the retired pin lives after the date. If the sales engineer cannot answer, you have a lock-in you have not priced. Run the golden set on the successor the week the email arrives, not the week of the deadline. A successor that is 'better' may be more verbose, more sycophantic, worse at schema, more expensive. Your set is how you see it. The vendor's eval is not your eval.

Users notice tone. If the copilot starts answering like a different person, you will get tickets that are not quality fails and still hurt trust. Warn them: a one-line UI note for a week, and a note to champions. You would not swap a system of record without saying it looks different. Do not swap a model silently. Budget the eval days so a deprecation is a project with an owner, not a Friday panic. Ops without eval is a series of surprises with marketing names.

06

Dashboards a delivery lead should demand

One screen. Volume, p95 first token and complete, error rate, dollars per day and dollars per successful task, eval snapshot (recall, groundedness, must-refuse), thumbs, top refusal reasons, fallback rate. You already know a service dashboard. Add eval and money. If it is not on the screen, it is not managed.

Demand the tiles even if you cannot build them. Write them on the SLO sheet as a requirement on the engineering partner. A workstream that cannot see spend will learn spend from Finance, late. A workstream that cannot see fallback rate will not know the model has been down for two hours because the UI still showed search results. The tiles are how you learn in time to act.

Refusal reasons and fallback rate are the underrated tiles. They tell you whether policy is working or whether users are hitting a wall and leaving. A spike in refusals can be good (injection tests, out-of-scope) or bad (retrieve is empty so everything refuses). You cannot know without the tag. Build the tag. This is the same as looking at HTTP 403 versus 500. The code matters.

Do not drown. Twelve tiles on one screen, not forty. Drill-down can exist. The daily view is the twelve. You will be asked for a steering snapshot: four numbers (volume, quality, spend, latency) and one narrative. Pull them from the same screen so you are not assembling folklore the morning of the meeting.

On-call looks at this screen, not at a model playground. Who is paged for daily cap, for error rate, for eval drop. You. An engineer. Both. Write it. AI features that 'nobody really owns in ops' become orphan incidents. You already refuse to go live without an ops owner on other systems. Refuse here.

The dashboard is also how you catch silent model drift. Quality tile down, latency tile down or up, spend tile up, no change ticket in the calendar — that is a floating pin or a vendor change you did not notice. The screen makes it visible. Visibility is the control. You cannot pin what you cannot see.

Refusal reasons and fallback rate are the underrated tiles. They tell you whether policy is working or whether users are hitting a wall and leaving. A spike in refusals can be good (out of scope, injection) or bad (retrieve empty so everything refuses). You cannot know without the tag. Build the tag. This is HTTP 403 versus 500. The code matters. Put both tiles next to thumbs so you do not read a thumbs-down spike without context.

On-call looks at this screen, not at a model playground. Who is paged for daily cap, error rate, eval drop: you, an engineer, both. Write it. AI features that nobody really owns in ops become orphan incidents. You already refuse to go live without an ops owner on other systems. Refuse here. The steering snapshot is four numbers from the same screen — volume, quality, spend, latency — plus one narrative. Do not assemble folklore the morning of the meeting.

Worked case · stay here ~20 minutes

Floating latest, six-second p95, and a deprecation email on a Friday

The morning after the send. Vendor notice: the model you did not pin retires in twenty-one days. p95 complete is 6.4 seconds. There is no fallback. Users call it broken while availability still looks green. You write four SLOs and a deprecation project.

Saturday you would have rested. Monday, 08:50, Jordan pastes a vendor email: the default model retires on the 23rd, please migrate, recommended successor attached. You ask which model is in production. He says whatever the SDK default is. Floating latest. Friday's draft ran on a version that was not the version in last week's demo, which is one reason tone felt helpful and the date went wrong. There is no pin in config. There is a comment in a notebook. Revert at 21:00 would be a deploy nobody can hit. You already treat vendor-forced upgrades as projects on other platforms. This is that, plus a quality incident, plus users waiting six seconds for a spinner because nobody wrote a fallback. Availability of the API is fine. Users experience the wait as it does not work. Your graphs will not save you if they measure the wrong thing.

You draw the request path with fallback as part of the happy path, not as an apology. Authenticate. Authorize the corpus. Retrieve. Route: cheap small model for is this in scope, frontier for the answer if it is. Generate on a pinned id. Schema check. Log metadata. Render. If identity is down, fail closed — no default user. If the index is down, do not generate from weights. If the model is down: cached FAQ with a corpus version key, or keyword search with chunks on screen, or hand to a human with the question pre-filled. If quality is low — eval drop, schema fail rate up — shrink to retrieve-only. Users prefer an honest search result to a fluent lie. You pick which degraded mode fires on which signal, in writing, before the next outage. An incident is a surprise. A fallback is a design. Retries: cap reads; do not retry writes without idempotency. Friday's send does not get a second copy.

Latency is two numbers, and you have been reporting neither. p95 to first token, p95 to complete. Streaming makes first token what users feel. Complete is what schema and writes need. You pull traces: retrieve 1.8 seconds, generation 3.9, the app 0.7, p95 complete 6.4. A delivery lead who can say retrieve is 1.8 of the 6.4 can assign work. End-to-end only is a blob. Jordan was going to add context. You cut context, you do not ask users to wait because the prompt is luxurious. First token under two seconds, complete under four, is the starting bar for an internal copilot of twelve going to eighty. You are missing both. Caching FAQs with a short TTL and a corpus version key is a control on latency and cost. Do not cache ACL-sensitive completions unless the key includes the user. A shared cache is how you leak. Put cache on the diagram with key and TTL, or do not cache.

Nondeterminism is not a reason to skip SLOs. It is a reason to write them on dimensions you can manage. You tell Marcus once, without a lecture: same prompt, different tokens, that is normal. We do not promise replay. We promise a pin, a groundedness bar, and a freeze if the bar burns. Temperature near zero on factual answers, and you still will not get bit-for-bit. Sponsors who grew up on deterministic systems need that sentence in language they can reuse in steering. If they hear it depends they hear unmanaged. Streaming is a UX control: Q&A streams; confirm-on-write does not stream into a send box a hurried human might fire halfway. You turned that default off on Friday's path after the fact. Decide per action, the same way you decided HITL per action. What you do not tell a sponsor: the model is nondeterministic so we cannot have SLOs. Uncertainty is real. Unmanaged is a choice.

Four SLOs, not twelve. Availability: 99.5 percent of requests get a designed response — answer, refuse, or fallback — inside the latency SLO. A fallback that fired correctly is a success against availability and a mark on the fallback-rate tile. Count both, separately. If you count fallback as failure, people disable fallback to keep the graph green. If you hide it, you will not know the model has been down for two hours. Latency: p95 first token under two seconds, complete under four. Quality: groundedness at least 0.9 and recall at five at least 0.8 on the weekly golden sample; must-refuse pass. Cost: dollars per successful task under envelope, daily cap that pages a human. Error budget: if quality or spend burns the week, prompt and retrieve changes freeze. A number without a freeze is a wish. You already run this on mature services. Start here before the service is mature, or it never will be.

Model versions are releases. You pin the current id in config operators can find, not in Jordan's notebook. Prompt and model are a pair; changing both on the same day is how you cannot tell what broke. The successor from the email gets a golden-set run this week, not the week of the 23rd. Compare cost and latency. Canary: ten percent of traffic, or Priya's team, same eval pulse, named period, rollback pin you can actually revert at 21:00. 'Priya will try it' is not a canary. Canary without a rollback is a partial outage you chose. Who approves a model move is the same list as who waives a quality miss. A vendor email is a trigger, not an approval. Put it on the change calendar with the set result attached. When a new version is better on the demo and worse on your injection tag, you do not move. The vendor's eval is not your eval.

Deprecation is a project, not an email. Impact: Atlas Q&A only, write path already dead. Successor eval, cost/latency compare, canary, rollback, communication to users if tone changes, change calendar, Security if subprocessors change. Notice period: twenty-one days, which is short; ask how long the retired pin lives after the 23rd. If the sales engineer cannot answer, you have lock-in you have not priced. Behavior change is the hidden cost. A successor that is better may be more verbose, more sycophantic, worse at schema, more expensive. Users notice tone. A one-line UI note for a week, and a note to champions. You would not swap a system of record silently. Budget the eval days so this is a project with an owner — you — not a Friday panic. If you had more than one feature on the pin, it would be a portfolio move. You do not move everything on one night because the email was urgent. Urgent for the vendor is not urgent for your error budget.

You write the dashboard you would demand of any other user-facing service, plus eval and spend. Twelve tiles, not forty: volume, p95 first token, p95 complete, error rate, fallback rate, dollars per day, dollars per successful task, recall snapshot, groundedness snapshot, must-refuse, thumbs, top refusal reasons. Four go to steering: volume, quality, spend, latency, plus one narrative, pulled from the same screen the morning of the meeting so you are not assembling folklore. Refusal reasons and fallback rate are the underrated tiles. A spike in refusals can be good — out of scope, injection — or bad — retrieve empty so everything refuses. You cannot know without the tag. This is HTTP 403 versus 500. Demand the tiles even if you cannot build them this week. Write them on the SLO sheet as a requirement on Jordan. A workstream that cannot see spend will learn spend from Finance, late.

On-call looks at this screen, not at a playground. Who is paged for daily cap, error rate, eval drop: Jordan primary, you secondary, Priya for task-success misses on the weekly sample. Write it. AI features that nobody really owns in ops become orphan incidents. You already refuse to go live without an ops owner on other systems. Refuse here. The screen is also how you catch silent drift. Quality down, spend up, no change ticket — that is a floating pin or a vendor change you did not notice. Visibility is the control. You cannot pin what you cannot see. Routing is ops, not architecture theatre: if every request still goes to frontier, you do not have routing, you have a bill. Flag, timeout, metric on how often you escalate. Cost at task level catches we retrieve seventy chunks and call frontier twice. Token burn is a trailing indicator. Task cost is the one finance understands.

You put the freeze rule next to the four SLOs so a well-meaning engineer cannot tweak production every afternoon. Friday's unpinned prompt edit would have been blocked if quality had a budget. It did not. Error budget is the miss you tolerate before you stop decorating the prompt and spend the remaining time on reliability or rollback. Shadow mode can live on a looser quality bar because humans are not depending on it. Assist needs the bar you wrote on Wednesday. You are in shadow on Q&A until recall moves. You are off the write path. That sequence is an ops fact, not only a HITL fact. What you tell the CIO in one paragraph: we do not promise the same sentence twice. We promise the path is up, the answer is grounded to a bar, the refuse cases refuse, we freeze if those bars burn, we fallback when the model is down, we pin so a vendor surprise is a scheduled change. That is an ops story a CIO can hear without translating.

By 16:00 the page exists. Four SLOs with numbers, owners, freeze. Fallback for outage and for quality drop. Pin in config, successor eval booked Wednesday, canary plan, rollback drill with the kill-switch drill you already owed Dana. Six dashboard tiles Jordan will actually ship this week, twelve on the requirement list. Deprecation named as a project with you as owner, not as a forwarded email. Marcus wanted to know if you are 'over-engineering ops for a chatbot.' You show him Friday's wait time and Friday's unowned model change and Friday's send. Chatbot is a product word. This is a user-facing service with a metered bill and a vendor who will retire names. You have run services with SLOs, or you have suffered the absence of them. Apply the same governance before it is mature. Nondeterminism did not get a pass. Floating latest lost its job.

You add two RAID rows that should have been there last week: floating pin, and no fallback. Triggers: vendor email, unexplained quality change, p95 complete over four seconds, fallback rate zero during a vendor incident. Mitigations are now the page, not wishes. You send the sheet to sit next to the handling note and the golden set. Operators can find the pin. Finance will be able to find dollars per task once the tile exists. Steering will get four numbers from one screen. Day 19 a vendor will try to make the POC into a platform. You will ask them to live under these SLOs and this pin. If they cannot export traces into the dashboard you just demanded, they are a tenant, not a path. Ops without eval is a series of surprises with marketing names. You have eval. You now have ops. Together they are how an FDE looks like they have done this before.

Diagram

What floating latest cost you by Monday morning

A

Friday, unowned

  • SDK default, comment in a notebook
  • p95 complete 6.4s, no hop timings used
  • No fallback; spinner felt like downtime
  • Prompt edit and model drift the same week
  • Write path incident with no pin to revert
B

Monday, owned

  • Named model id in config, rollback pin hot
  • Four SLOs, freeze rule, hop timings
  • Fallback: cache / retrieve-only / human
  • Successor eval this week, canary, change calendar
  • Twelve tiles demanded; six this week

A pin is a release you can eval, canary, and roll back. The vendor email is a trigger. It is not an approval.

Practice

SLO sheet and deprecation drill

45 minutes

Atlas copilot, 80 users, internal only.

  1. Write 4 SLOs with numbers (availability, p95 first token, quality sample, daily $ cap).
  2. Fallback for model outage and for quality drop.
  3. Model-version change: pin, golden set, canary, rollback, who approves.
  4. List 6 dashboard tiles.

Done looks like: A sheet that could live next to your other service runbooks.

Check yourself

Attempt in your notes first. Reveal is for after, not during.

  • What quality SLO is honest?

  • Why pin model versions?

  • Name a fallback that is better than a fluent failure.

  • Which four SLOs should a DM write for an AI feature?

  • What do you demand on the dashboard that a normal service screen lacks?

  • What turns a vendor deprecation email into a project?

Terms from this day

SLO
Service level objective — a numeric promise you manage to.
Error budget
How much miss you tolerate before freezing change.
Canary
Releasing a change to a small % of traffic before the rest.
Pin
Locking a model version (and prompt version) so they cannot drift under you.
Fallback
A designed degraded mode, not an accident.
First token
The latency the user feels when streaming starts. Often the SLO that matters more than complete.
Deprecation drill
The written project you run when a vendor retires a pinned model: eval, canary, rollback, comms.

Your notes for day 18

Saved on this device. Use this as the start of the artifact.