Chapter 19

Rejections and swaps

Test the drawing by following rejections, substitutions, and bypasses.

On this page

A clean drawing can still lie.

Boxes imply that responsibilities are separate. Arrows imply that parts communicate through controlled handoffs. Neither mark proves the system behaves that way.

Use two lenses on the drawing from Draw the body plan.

First, follow every place the system can say no and record where the refused thing goes. Rejections expose boundaries and the information those boundaries preserve.

Second, replace one part and record what else has to move. Swaps expose whether the joints are real.

Rejections and swaps turn the drawing from a picture into a set of claims that can fail.

Follow the no

The reloading journey contains several different refusals:

Boundary Question it owns Refusal Exit
Classification after cleaning Is this case-like material for the current caliber context? wrong caliber or foreign object labeled other-caliber storage or out of the brass system
Magnified inspection Does this owned case have an observed defect? crushed mouth, split, or unacceptable condition quarantine with identity and reason
Production readiness Do all required facts hold under current policy? one or several failed facts; unknown also fails rejected with every reason, for rework or disposition
Progressive press Did every occupied station complete the stroke? located station fault plate held; partial truth returned for assessment
Final inspection Does completed work carry every required production fact? missing or anomalous fact quarantine, never finished-goods storage

The exit is part of the boundary. A false with nowhere to send the material is a verdict without an operating design.

Where the exits differ, the system's understanding differs. Wrong-context brass retains value in another process. A foreign object leaves. Damaged owned material remains identifiable in quarantine. A held plate preserves exact position. Collapse them into one reject pile and the drawing may look simpler while operation becomes blind.

Now mark the original body plan:

[ cleaning ]
     |
     v
[ classification ] --R1--> wrong-context storage
     |          \---R2--> foreign exit
     v
[ inspection ] -----R3--> quarantine
     |
     v
[ readiness ] ------R4--> rejected with reasons
     |
     v
[ production ] -----R5--> held plate + assessment
     |
     v
[ final inspection ]-R6--> quarantine

This overlay reveals a bypass question immediately: can material enter production without crossing classification, inspection, and readiness? If a side path exists, the visible gates may be correct while the real system grows a second nervous system around them.

In software, the same failure appears when a controller uses an injected gateway on one path and calls the vendor SDK directly on another. The boundary exists and is bypassed. Pattern presence is not proof of body-plan integrity.

Not every arrow is a gate

Rejections help find boundaries. They do not turn every handoff into validation.

The tumbler receives dirty material and returns material free of range dirt. Its arrow is a transformation. Material storage releases components with lot identity. That arrow preserves custody. The range returns observations tied to a batch. That arrow closes a learning loop.

Ask each arrow what kind of message it carries:

  • transformation;
  • observation;
  • decision and reason;
  • command or authority;
  • identity or provenance;
  • released material under a guarantee.

Adding a reject branch to every arrow would smear policy across the system. The useful question is where this particular decision has enough information and authority to belong.

Exercise the physical seams

Reloading equipment makes substitution visible.

A standard die thread lets different dies screw into compatible presses. The press supplies force. The die determines the operation. Replacing a sizing die with a decapping die changes behavior while the press frame, bench, operator position, and material handoff remain intact.

The progressive press has a larger swap point. Its removable toolhead carries a configured set of dies. A caliber change can exchange the configured pipeline while the press remains mounted.

Close view of a progressive press toolhead with several threaded stations and a powder measure installed
The toolhead groups several operations behind one physical joint. Swap the configured unit and the press, bench, and basic cycle protocol remain.

The dedicated swager entered the preparation journey later. It took an unowned primer-pocket job without teaching the tumbler, classifier, loading blocks, or readiness gate how swaging works. The tool the plan did not know about slows down on the important correction: the brass demanded the job, not that particular tool.

Record each substitution:

Part changed Protocol at the joint Observable change What remained unchanged
Die standard thread, press force in, transformed case out operation changes press frame, mounting, operator interface
Toolhead press's toolhead fit and station positions configured production pipeline changes press, bench, basic cycle protocol
Primer-pocket tool decapped case in, prepared pocket out dedicated station replaces retooling elsewhere cleaning, classification, carriers, readiness contract

A seam earns the name by surviving the exercise. If replacement requires editing callers, changing result meanings, and rebuilding neighbors, the box was not independently connected.

A constructor parameter is only a claim

Software can imitate the appearance of substitution cheaply:

ProductionReadinessGate.new(caliber_specification: specification)

That line proves the constructor accepts an argument. The gate may ignore it and use a hard-coded length. The joint becomes real only when replacing the specification changes an observable verdict while the gate itself remains untouched.

Readiness is derived, not declared carries that exact test: one case keeps length 1.755; policy moves from a maximum of 1.760 to 1.750; admission changes to rejection.

Use the same standard everywhere:

  1. Name the candidate replacement.
  2. Name the message protocol at the joint.
  3. Replace it without editing the consumer.
  4. Observe a meaningful behavior change.
  5. List every neighbor that still had to change.

Step five is where ceremonial dependency injection confesses.

Substitutability also does not require inheritance. Two objects that answer the same message do not need a shared parent unless they genuinely share implementation. A common interface or duck-typed protocol is enough for the joint. Inheritance used only to obtain interchangeable names adds ancestry without buying separation.

Overlay your drawing

Take the parts-and-arrows drawing from Draw the body plan. Add three marks:

  • R where a refusal can occur;
  • S where substitution matters;
  • B where the intended path can be bypassed.

For each R, fill one row:

Boundary owner Refused class Reason preserved Exit Re-entry authority

For each S, fill one row:

Replaceable part Protocol Changed behavior Unchanged neighbors Proof

For each B, name the guardrail or explain why the bypass is accepted.

If the drawing has no rejections, ask whether it shows a real boundary or only happy-path arrows. If it has no substitutions, ask whether any part is actually replaceable. Do not add a plug-in point to improve the score. Record the joints the real system needs.

What the lenses cannot decide

Not every component should be replaceable, and not every replacement deserves equal cost. A stable value object may have no meaningful substitute. A load-bearing database or external protocol may require migration rather than a clean swap.

Rejection and substitution are diagnostic lenses. They expose where ownership and coupling deserve examination. They do not specify the final design.

The next chapter adds a third pressure: gravity. Some decisions redraw the system when changed; others rearrange one part. Their reversal cost determines how much evidence they deserve before commitment.