When is a design worth a full STRIDE per-interaction sweep rather than a cheaper per-element pass?
answer
- rows grow with edges, not boxes
- six questions times every crossing
- does the risk live on the crossings
- shared service, callers at different trust levels
- restrict to boundary-crossing edges, collapse the rest
basics
~20 sWhen the risk lives on the crossings: a shared component invoked by callers at different trust levels, external fan-in, or authorization that depends on the calling path. Rows scale with edges, so mandating it everywhere produces rows nobody examines.
solid answer
~50 sPer-interaction costs one visit per edge rather than per node, and each visit is up to six questions, so a seven-element hub with external partners can produce a couple of hundred rows. In a two-hour session that is under forty seconds a row, which means the last hundred get "N/A" typed at speed and the artifact carries a completeness claim it has not earned. So I mandate it where crossings carry the risk: a shared service invoked from both an anonymous external path and a privileged internal one, a hub aggregating third-party systems, or a destination whose authorization depends on which path called it. Everywhere else runs the cheaper element pass. In practice the shape is a hybrid — element pass over the whole diagram as a floor, interaction pass restricted to boundary-crossing edges, and triples collapsed by their source-trust, destination-trust and data-class signature.
go deeper
Know that the interaction variant is more thorough and much more expensive, and that teams do not run it over every part of every design. Being able to say why the cost grows is enough here.
Explain the cost arithmetic concretely — one visit per edge, up to six questions each, edges outgrowing nodes as external parties are added — and give one design shape where paying it is clearly worthwhile.
Describe the hybrid you would actually run: element pass as the floor, interaction pass on boundary-crossing edges, triples collapsed by signature, and the highest-consequence crossings swept while the room is still thinking.
Own the policy and its second-order effects. Name the trigger that makes a design qualify, defend leaving other designs on the cheaper pass, and be explicit that a completeness claim nobody earned is worse than a smaller honest one.
Per-interaction analysis is the more thorough STRIDE variant and the more expensive one, and the expense is not linear. It is worth being explicit about the arithmetic before deciding where to mandate it. ## The arithmetic A per-element pass costs roughly one visit per node. A per-interaction pass costs one visit per *edge*, and edges grow faster than nodes as a design gains parties. Each visit is up to six questions. An e-prescribing hub with four external prescriber systems and three internal processes — a small diagram by any standard — carries request, response, acknowledgement and audit flows between most of those pairs, and lands somewhere around forty to sixty interactions once the store and directory lookups are drawn. At six letters each, that is a couple of hundred rows. Now put that in front of a room for a two-hour design session. Two hundred rows in one hundred and twenty minutes is under forty seconds a row. Nobody thinks about a crossing in forty seconds. What actually happens is that the first twenty rows get real analysis and the remaining one hundred and eighty get "N/A" typed at speed, after which the artifact carries a completeness claim it has not earned. That is worse than not running the sweep, because the next reader believes it. ## The decision So the call is not "thorough or sloppy", it is "where does this design's risk actually live". Per-interaction earns its cost when the answer is *the crossings*: - **A shared component invoked by callers at different trust levels.** The single strongest signal. If a process serves both an anonymous external path and a privileged internal one, a node row must describe both at once and will describe neither. - **Fan-in from external parties.** A hub or gateway aggregating several third-party systems has most of its interesting surface on the edges: which partner is this really, what can they assert, what can they deny sending. - **A destination whose authorization decision depends on which path invoked it.** If the same operation is permitted from one caller and not another, that difference exists only on the interaction. - **Boundaries that carry a real obligation** — regulated data leaving an estate, money moving, an action that must be attributable to a named person. It does not earn its cost on a design whose components each sit alone behind one boundary, on batch jobs reading internal stores, or on any diagram where nearly every edge has the same source trust level, the same destination trust level and the same data class. ## The hybrid that most teams land on The affordable shape is not "pick one variant for the whole system". It is: 1. **Element pass over the whole diagram** as the floor. Cheap, catches the node-local threats, and gives every component *some* coverage. 2. **Interaction pass restricted to boundary-crossing edges.** Intra-boundary hops are dropped by default — same principal, same privileges, same audience on both ends — and pulled back in only where one end is a shared component or the two ends carry different retention or audit obligations. 3. **Collapse by signature.** Key each triple by source trust level, destination trust level and data class, and merge triples that share a signature into one row listing the edges it covers. On the prescribing hub, four prescriber systems that are all external vendor integrations sending the same prescription payload collapse from four sets of rows to one, with a note that a per-partner difference in authentication strength splits them back apart. 4. **Sweep the highest-consequence crossings first**, so the rows that get real thought are the ones where thought pays. On a prescribing hub the dominant asset is not confidentiality — it is integrity and availability, because a tampered or dropped prescription is a patient-safety event, and that ranking should decide which edges the room spends its attention on. What comes out is still a large set of threats, and turning those into an ordered set of fixes is a separate rating exercise with its own method. The point of the selection above is only that every row in the artifact was actually thought about. ## The organisational failure to avoid The tempting policy is "all designs get per-interaction". It reads as rigour and produces theatre: rows answered mechanically, a completeness claim that is untrue, and engineers who conclude that threat modeling is paperwork. The better policy names the trigger — a shared component crossing trust levels, external fan-in, regulated or financial crossings — and lets everything else run the cheaper pass. A rule a team can follow honestly beats a rule that produces impressive artifacts nobody trusts.
- What is the failure mode of mandating per-interaction on every design?Rows get answered mechanically. The first handful receive real thought and the remainder are cleared at speed, so the artifact ends up asserting that every crossing was analysed when it was not. The second-order cost is worse: the next reader trusts the claim, and the engineers conclude threat modeling is paperwork. A narrower rule that a team can follow honestly produces more found threats.
- How do you avoid missing internal-only threats once you restrict the sweep to boundary crossings?Keep the element pass over the whole diagram as the floor, so every component still gets node-local coverage, and define explicit pull-back triggers for intra-boundary edges: one end is a shared component, the two ends have different retention or audit obligations, or the boundary itself is contested. The restriction removes rows that would have answered "not meaningful", not rows that carry threats.
- What signal in a design tells you the crossings rather than the nodes carry the risk?The clearest one is a component whose permitted operations depend on which path invoked it — that difference is expressible only on an interaction. Close behind: fan-in from several external parties, and any edge where the source is a named human whose action must remain attributable. If nearly every edge shares the same source trust, destination trust and data class, the crossings are not where the risk is.
Inspecting every doorway in a building is more thorough than inspecting every room, but a building with two hundred doorways and a two-hour inspection gets a stamped certificate and no inspection.
saying these in an interview costs you the question
- Argues for per-interaction everywhere as a rigour policy
- Ignores that rows scale with edges rather than components
- Counts rows produced as evidence of model quality
- Drops intra-boundary edges with no pull-back trigger
- Assumes confidentiality dominates regardless of the asset at stake