TJ-01 · Technical Judgment
Technical abstraction without ignorance
A PM should understand boundaries, failure modes, constraints, and consequences deeply enough to ask better product questions.
This lesson builds on PF-02 Problem, mechanism, alternatives, PJ-02 Define good.
the questions you cannot ask without a map
A PM sits in a review about the AI suggestion that appears on an empty document. An engineer says the suggestion is generated when the page loads, using context from the workspace, and that the prompt can be tuned. The PM writes "tune prompt" in their notes and moves on.
Two weeks later the suggestions are better. In the demo they are clearly better. Activation has not moved. Nobody in the room can explain why, so the team schedules more prompt work.
The question nobody asked was not a technical question. It was this: what does the user see between the moment the page loads and the moment the suggestion arrives — and what do they see if it never arrives? The PM did not ask it because they had no picture of where the work left one owner's control and entered another's. Without that picture, the only questions available are questions about the thing that was just described to you.
There is a second version of this failure that looks like its opposite. A PM reads about caching, decides the suggestion should be cached, and says so in the review. The engineers now spend the meeting explaining why that will not work. Both PMs failed the same way. Neither had a map. One stayed silent because they had nothing to say. One spoke because they had borrowed something to say. A map would have produced a real question instead.
The loop below is what makes this durable. The description you were given becomes the boundary of what you can ask, so the work that gets commissioned is always work on the part somebody already explained:
flowchart TD D["What the engineer described<br/>page load · workspace context · tunable prompt"] D --> Q["The only questions available<br/>are questions about that description"] Q --> W["Work commissioned<br/>tune the prompt"] W --> B["Suggestions improve<br/>in the demo"] B --> N["Activation does not move"] N -->|"no other question exists yet"| W X["What was never described<br/>the wait · the empty state · the failed call"] -.->|"unmapped, so unaskable"| Q
Ask yourself, for the feature you are shipping this month: can you draw the path from the user's action to the response, and mark three places where the work changes hands? If you cannot, you are reasoning from a picture the team does not share.
own the consequence, not the mechanism
A system has layers. Authority is not the same on every layer.
| Layer | The question it answers | Who holds authority |
|---|---|---|
| Mechanism | How is this built | Specialist |
| Boundary | Where does the work change hands, and what crosses | Shared — you must be able to draw it |
| Failure mode | What does the user experience when this part fails | Product |
| Constraint | What is fixed, what was chosen, and by whom | Shared — you must know which is which |
| Consequence | Who pays, in what currency, and is that acceptable | Product |
The line that runs through this whole phase sits between rows one and five. You do not need to know how a thing is built to own what happens when it breaks. Mechanism is not your authority. Consequence is not theirs to decide alone.
Four things you must be able to state about any system your product depends on.
- Boundaries. Where does a request leave one component and enter another? Every boundary is a place where something can be slow, fail, return something useless, or return something it should not have returned. Count the boundaries and you have counted the failure modes.
- Failure modes. For each boundary, name three: it is slow, it fails, it succeeds but the answer is wrong. Then name what the user sees in each case, and who finds out. A failure nobody detects is worse than a loud one.
- Constraints. Some limits are laws — physics, a vendor's rate limit, a regulation. Some limits are decisions somebody made and can unmake. When an engineer says "we can't do that," your first job is to establish which kind of limit you just hit, and what it costs to move it.
- Consequences. Every technical property lands on somebody: a user waiting, a support lead answering, an engineer on call at night, a bill that grows with usage. Name who holds each one.
Here is that map drawn for Noted, using only the components the case actually names as live. The boxes are components. The arrows are boundaries, and each one is labelled with what crosses it. This sketch is the anchor for the rest of the phase — TJ-02 moves cost across these arrows, and TJ-05 opens the AI box:
flowchart TD U["User on the<br/>empty document state"] U -->|"sign-up · return within seven days"| A["Sign-up and<br/>account access"] U -->|"page content"| D["Document store"] U -->|"prompt · workspace context"| AI["AI suggestion call"] D -->|"uploads and retrieval"| F["File storage"] D -->|"published page"| P["Public publishing path"] U -.->|"events · actor missing for 18%"| AN["Analytics and<br/>activation counting"]
Notice what the diagram does not carry: an owner on any interface. The case
names an engineering lead who holds repository workflow and technical
standards, and it does not say who owns any single component. Every owner label
on that sketch is therefore <unknown> until an engineer fills it in, and the
emptiness is the finding, not a gap in the drawing. The measurement path is
dashed for the same reason — it is the one boundary where the case tells you
the crossing is already lossy.
The output of this thinking is a sketch, not a specification. A sketch you drew from outside the code is a hypothesis. Take it to an engineer, ask them to correct it, and record what changed. The corrections are the most valuable part. They tell you exactly where your model of the product was wrong, which is where your product decisions were also wrong.
Good questions from this map sound like consequence questions, not instructions. Both of the questions below are about the same boundary — the AI suggestion call on Noted's empty document state — and only one of them can change what you do:
Weak — "Can we cache the AI suggestion so it appears faster?"
This names a mechanism you cannot see inside. The engineers will spend the meeting explaining why it does not work, and you will leave knowing nothing about the user. It is also unfalsifiable as a product question: no answer changes your position on the activation decline.
Strong — "What does a user on the empty document state see between the page loading and the suggestion arriving, and what do they see if it never arrives?"
This names a consequence you own. A slow or silent empty state is a candidate mechanism for the decline; a suggestion that arrives instantly is not. Either answer removes a boundary from your list or promotes it.
The difference is not politeness. The weak question borrows an implementation and hands it back as an instruction. The strong one stays on your side of the boundary and still constrains the decision.
Boundary
Abstraction without ignorance stops working when the mechanism is the product decision.
Suppose one way of generating a summary returns in under a second but can only read the twenty most recent notes, and another reads the whole workspace but takes fifteen seconds. There is no product-level abstraction that hides this. The mechanism sets what you are allowed to promise the user. Handing that choice to engineering as "an implementation detail" is not respect for specialist authority. It is a product decision left unowned.
The test: if two implementations would let you make different promises to the user, the choice between them is yours to be part of. If they would let you make the same promise, it is not.
There is a limit on the other side too. A sketch that names components, boundaries, and failures is useful. A sketch that names the caching strategy, the database, or the queue technology is you doing someone else's job with less information than they have. Stop at the boundary. Do not cross it and start drawing what is inside the box.
Practice on the Noted decision case
Read the Noted case if you have not already.
Take Signal 1: activation fell 11% over six weeks.
Activation is defined as creating a document and returning within seven days. Two changes shipped during the window: a revised signup flow and a new AI-suggestion prompt on the empty document state. The case does not describe Noted's architecture. That is deliberate. You are going to draw a sketch from outside and mark what you do not know.
Your task. Produce a system boundary sketch for the path that produces the activation number.
- Write the path as ordered steps, from the user arriving to the moment the activation event is counted. Include the measurement steps. The event pipeline is part of this system.
- Mark every boundary where work changes hands. For each, name what crosses
it and who owns each side. Where you are guessing, write
<unknown>beside it rather than a confident label. - For three boundaries, name what the user sees when the far side is slow, when it fails, and when it returns something useless. Only count things a user could actually notice.
- Note the measurement failure separately. Actor identity is missing for about 18% of events. State plainly what that does to the activation number and to any claim you could make from it.
- Separate fixed constraints from chosen ones. You will find you cannot do this for most of them yet. Write down which ones you cannot classify, and who could tell you.
- Commit to a position. Name the one boundary you believe is most likely involved in the 11% decline, and write the single question you would ask engineering about it. The question must be about consequence. If it names a solution, rewrite it.
Steps two and three fill a grid. Here is the shape, seeded from the diagram in the Concept section, with the cells the case cannot fill left honest:
| Boundary | What crosses it | Owner on the far side | User sees when it is slow | User sees when it fails | User sees when it returns something useless |
|---|---|---|---|---|---|
| User → sign-up and account access | sign-up, and the return visit that counts as activation | <unknown> |
<unknown> |
<unknown> |
<unknown> |
| User → AI suggestion call | the prompt and workspace context | <unknown> |
<unknown> |
<unknown> |
<unknown> |
| User → document store | page content | <unknown> |
<unknown> |
<unknown> |
<unknown> |
| User → analytics | events, with actor identity missing for about 18% | <unknown> |
nothing — only a dashboard notices | nothing — only a dashboard notices | nothing — the number is wrong and nobody sees it |
Fill the last three columns yourself, and add any boundary you believe exists that the diagram omits. If you add one, say what evidence in the case implies it. A row you invented is worse than a row you left empty. The analytics row is filled in for you because it is the one boundary where the case already tells you the answer: the user never sees this boundary fail. That is what makes it dangerous.
Expect to be pushed on: whether your sketch contains components you invented rather than inferred, whether your failure modes are things a user could see or things only a dashboard could see, and whether your question to engineering is an instruction in disguise.
Committed to a position? Check it against what a strong answer holds
- An ordered path that includes the measurement steps — the event and the activation count — not only what the user sees. The number is produced by the system, and the system can be wrong about it.
- Owners marked
<unknown>wherever the case is silent, each with the name of the person who could fill it in. No component appears that the case does not imply. - Failure modes stated as things a user could notice — a wait, a blank state, a suggestion that does not fit — kept separate from failures only a dashboard sees.
- A plain statement of what missing actor identity on about 18% of events does to the activation number, without claiming to know which direction it biases the decline.
- One boundary named as most likely involved, one consequence question about it, and an explicit refusal to call that boundary the cause.
- The most common weak move is a question that carries a solution — "can we cache the suggestion?" It is weak because it borrows a mechanism you cannot see inside, and no answer to it changes your position on the decline.
Transfer the move to your product
Take one feature you are shipping or operating right now. Not the whole product, and not a feature you have never touched.
Answer five questions:
- Where does a user request in this feature leave your team's control, and what does it depend on out there?
- For the two boundaries you are least sure about, what does the user experience when the far side is slow, and when it fails outright?
- Which limits on this feature are fixed, and which are decisions someone made? Name who could unmake each chosen one.
- Who pays for this feature's failures — the user, support, an on-call engineer, a bill that grows with usage? Name the person or role, not the department.
- Which of your open questions is a consequence question you own, and which is a mechanism question you must hand to a specialist?
Answer only from what you know today. Where you do not know, write <unknown>
and name who could close it. A sketch full of honest gaps is a working
document. A sketch full of confident guesses is a trap you set for yourself.
Keep one reusable artifact
System boundary sketch
Write it for the next person who must make or review the decision. Include the choice, evidence, uncertainty, alternatives, owner, and revision trigger. Link it into your cumulative Product Decision Case.
Produce artifacts/TJ-01-system-boundary-sketch.md using the template below.
Write it for the engineer who will correct it. That is the actual audience. The sketch succeeds when an engineer can read it, point at three things and say "that is not how it works," and you can record the corrections without rewriting the document. Leave the corrections visible. They are evidence about how far your model was from the system.
In your Product Decision Case, this is the first artifact that describes the machine rather than the market. Every later technical claim you make should be traceable to a boundary on this sketch or to a gap you named on it.
artifacts/TJ-01-system-boundary-sketch.md# System boundary sketch · <feature or path> - **Date:** <YYYY-MM-DD> - **Product:** <product> - **Path under study:** <user action → response, in one line> - **Drawn by:** <you, from outside the code> - **Corrected by:** <engineer name and date, or `<unconfirmed>`> ## The path <Ordered steps from the user's action to the completed response. Include measurement steps — if an event is recorded, that is a step. Number them.> 1. <step> 2. <step> 3. <step> ## Boundaries <A boundary is any point where work leaves one owner's control. Mark confidence honestly.> | # | Boundary (from → to) | What crosses it | Owner on each side | Confirmed? | |---|---|---|---|---| | 1 | <component → component> | <request, data, event> | <owner / owner> | <yes / no / `<unknown>`> | ## Failure modes <For each boundary you care about, three cases. Only list what a user could actually notice, or state plainly that the failure is invisible to users.> | Boundary | Slow | Fails | Succeeds but wrong | |---|---|---|---| | <#> | <what the user sees> | <what the user sees> | <what the user sees> | **Who detects each one:** <name the role that finds out first, per failure. If the answer is "nobody until a user complains," write that.> ## Measurement failures <The instrumentation is part of the system. State what is missing, and what that does to the claims you can make from the numbers.> - **Known gap:** <what is not captured, and at what rate> - **Effect on claims:** <which specific claim this weakens or blocks> ## Constraints | Constraint | Fixed or chosen | Who can change it | Cost to change | |---|---|---|---| | <limit> | <fixed / chosen / `<unknown>`> | <role> | <cost or `<unknown>`> | <Most constraints will start as `<unknown>`. That is the correct starting state. Do not guess a classification to fill the cell.> ## Who pays | Consequence | Currency | Who holds it | |---|---|---| | <what goes wrong> | <waiting, rework, on-call, support load, money> | <person or role> | ## Authority split | Open question | Yours (consequence) | Specialist's (mechanism) | |---|---|---| | <question> | <yes / no> | <yes / no> | ## Questions for engineering <Consequence questions only. If a question names a solution, it is an instruction — rewrite it before it goes on this list.> 1. <question> 2. <question> ## Corrections received <Fill this in after the review. Leave the original wrong version visible.> | What I drew | What is actually true | What that changes about my product reasoning | |---|---|---| | <claim> | <correction> | <consequence> | ## Position - **Boundary most likely involved in the problem:** <one boundary> - **Confidence:** <low | moderate | high> — <why, in one line> - **Strongest reason this is wrong:** <the best argument against your own sketch> ## Revision trigger <The observation that would make you redraw this. Name the observable and the threshold. "When we learn more" is not a trigger.> ## Gaps <Everything marked `<unknown>` above, as open questions, each with the person who could close it.>
Before you call it done
Six things a reviewer must be able to find. If one is missing, the artifact is not finished — it is a draft with a hole in it.
Before saving, check all six exposures are present. Name any that are missing rather than filling them in yourself:
| Exposure | Present when |
|---|---|
| Choice | One boundary is named as the likely site of the problem, and it is a claim someone could disagree with |
| Evidence | Each confirmed boundary says who confirmed it and when; unconfirmed ones say so |
| Uncertainty | <unknown> appears where knowledge is absent, and confidence is matched to what was actually confirmed |
| Alternatives | At least one other boundary is named as a rival explanation, not as a strawman |
| Owner | Consequence holders are named as roles, and mechanism questions are handed to a specialist by name |
| Revision trigger | An observable and a threshold that would force a redraw |
Can the reasoning survive these tests?
Answer before you open the explanation. The tutor asks these one at a time and does not show the options’ verdicts until you commit.
01An engineer mentions that the AI suggestion on the empty document state "sometimes takes a while." Which follow-up question belongs to the PM?
- ACan we cache the suggestion so it returns instantly?
- BWhich model are we calling, and is there a faster one available?
- CWhat does the user see while the suggestion is loading, and what do they see if it never arrives?
- DWhat is the right way to escalate this to the engineering lead, since it is a performance issue?
Reveal the answer
C. The PM owns what the user experiences during and after a failure. The tempting answer is A: it sounds informed, but it commits the team to a mechanism the PM cannot evaluate and closes off the question of what the empty state should do while waiting. D hands away a product question that was never engineering's to answer.
02Two ways of building summaries are on the table. One returns in under a second but reads only the twenty most recent notes. The other reads the whole workspace but takes fifteen seconds. The engineering lead asks the PM to weigh in. What should the PM do?
- ATake part in the choice, because the mechanism here decides what can be promised to the user
- BDecline, because both are implementation options and implementation belongs to engineering
- CAsk for a third option that is both fast and complete
- DChoose the faster one, since latency is a product concern and completeness is a technical one
Reveal the answer
A. This is the boundary of the model. The tempting answer is B — the vocabulary answer, "stay out of implementation." But the two options let you promise the user different things, so the choice is a product decision wearing technical clothes. D splits the currencies wrongly: completeness is exactly what the user notices.
03Noted's event pipeline is missing actor identity for about 18% of events. A PM calls this an engineering problem and moves on. What is wrong with that?
- ANothing — instrumentation is owned by engineering, and the PM should escalate it and wait
- BThe PM should specify the fix, such as attaching identity at the client before the event is sent
- CIt only matters once the gap passes 20%
- DThe measurement system is part of the system the PM reasons with, and an 18% identity gap changes which claims the activation number can support
Reveal the answer
D. Measurement is a component with its own failure modes, and its failure lands on every product claim built from it. The tempting answer is A, which is correct about ownership of the repair and wrong about ownership of the consequence. B is the opposite error: specifying the mechanism. C invents a threshold nobody set.
04A PM draws a system diagram from outside the code and brings it to the engineering team. What is the correct posture?
- APresent it as settled, since the PM owns the product and needs a shared picture
- BPresent it as a hypothesis to be corrected, and record what changed and why
- CDo not draw it; ask engineering to draw the accurate version instead
- DDraw it only after reading enough of the code to be confident it is right
Reveal the answer
B. The corrections are the point: they show exactly where the PM's model of the product was wrong. The tempting answer is C, which sounds humble but produces a diagram the PM cannot reason from and never reveals which of their assumptions were false. A asserts authority over mechanism the PM does not hold.
05An engineer responds to a request with "we can't do that." What should the PM establish first?
- AWhether another engineer on the team disagrees
- BHow long it would take if the team tried anyway
- CWhether the limit is fixed or was chosen, and what it would cost to change it
- DWhether the request can be reduced to something smaller that fits
Reveal the answer
C. "Can't" covers both a law of the system and a decision someone made last year. The tempting answer is D: descoping feels cooperative, but shrinking the product before you know whether the limit is movable gives up value for no reason. A undermines the specialist instead of interrogating the constraint.