Skip to content
ThorbisInterface Guidelines (opens in a new tab)

Modules

One focused chapter from the Thorbis interface research. 8 rules. Read the research index for every chapter and focused study.

Modules

A module is anything with an interface and an implementation. Design them deep: a lot of behavior behind a small interface, placed at a clean seam, tested through that interface. The vocabulary is John Ousterhout’s A Philosophy of Software Design (opens in a new tab), applied so agents and humans keep Thorbis navigable.
  • Depth is leverage at the interface. A module is deep when callers exercise a lot of behavior per fact they have to learn. It is shallow when the interface is nearly as complex as the body. Reduce methods, simplify parameters, hide more inside.
  • Apply the deletion test. Imagine deleting the module. If complexity vanishes, it was a pass-through. If the same complexity reappears across N callers, it was earning its keep.
  • The interface is the test surface. Callers and tests cross the same seam. Tests assert observable outcomes, not internal state. If a test has to change when the implementation changes, it is testing past the interface.
  • One adapter is hypothetical. Two make a seam. Do not introduce a port unless at least two adapters are justified, typically production and a test stand-in. A single-adapter seam is just indirection.
  • Keep internal seams internal. A deep module may be composed of small, swappable parts used by its own tests. Do not expose those parts through the external interface just because tests touch them.
  • Accept dependencies. Don’t construct them. Inject the payment adapter, the SMS port, the clock. Construction belongs at the composition root. A module that news up Stripe inside submit cannot be tested through its interface.
  • Replace tests. Don’t layer them. When shallow modules merge, delete the old unit tests. Write new ones at the deepened interface. Tests that survive only by knowing the old shape are waste.
  • Use the vocabulary on purpose. Say module, interface, seam, adapter, depth, leverage, locality. Do not substitute component, service, API, or boundary, those words already mean other things here.

I built this for the dispatcher at 7 a.m., the tech in a crawlspace, and the owner closing the books. Quiet chrome. Precise work. I’m still learning. These are the notes.

Applied bookmark research

Reviewed 2026-09-06. These examples reinforce the existing owners; they do not introduce another visual style or claim the product behavior is implemented. Read the 26-source review and access limits.

Make the task easier, not the screen busier

A feature can look complete while the dispatcher still has to reconstruct context or wait for unrelated content.

Start from one person, interruption, and completed task. Keep the current job and its next action usable while optional evidence arrives. Treat the real constraint as part of the brief, not something polished away afterward.

Thorbis example. For assigning a tech, show the job, relevant availability, and the consequence of the assignment. Do not make the dispatcher traverse a marketing-style sequence or a new shell to finish a routine task.

Verify. Walk through the task with representative long and missing records. Check that the essential action remains understandable when optional content is slow or unavailable. Record the result rather than claiming a performance improvement without measurement.

Do not import. No additional shell, feature hero, framework migration, or new dependency. Keep the approved surface role.

Open the product skill · Evidence: Design Engineer Principles; How we think about design; Component Architecture for React Server Components

Preserve the place as the collection grows

Large customer, property, and inspiration collections become expensive to navigate when every inspection loses the current place.

Treat filters, selected records, scroll, and Back behavior as part of the task. Loading a child or optional panel should not reset the whole collection. A saved reference includes enough context to be useful when revisited.

Thorbis example. Open a property from a filtered customer list and return to the same filter and position. On the inspiration wall, reserve the media footprint and retain source credit even when the preview is unavailable.

Verify. Try refresh, Back and Forward, a direct record link, an empty result, a failed preview, and a long collection. Check that late data does not overwrite a draft or move the action under the pointer.

Do not import. No unbounded eager media, private information in shareable URLs, or a local-only storage promise borrowed from Copper.

Open the ecosystem skill · Evidence: 7 Principles of Rich Web Applications; Component Architecture for React Server Components; Philosophy; Copper

Loading search…

Loading search. You can close this message and keep reading.