A Boolean That Removes Two Columns
The queue kernel assumes every workshop reviews its work: a delegation carries whether review is on and which reviewer was assigned, and there is machinery for running rounds and recording verdicts.
One workshop has none of it. Its work is curating a memory vault, and its owner ruled that being present in the session is the review — a second opinion from another model on somebody's own memories is not a quality gate, it is a stranger's edit. So that workshop has no reviewer columns, no review verbs, and no review machinery.
The shared builder expresses this as a parameter. Passing false omits two columns; the workshop's table is exactly the shape it always had. No fork, no subclass, no dead columns carrying nulls forever as a monument to a feature this app declined.
Divergence With Reasons Is Not Drift
That workshop diverges in several other places too, and every one of them is recorded with its reason. It keeps its own storage approach because its access pattern genuinely differs. It uses the opposite direction of a name canonicalization because adopting the shared one would flip the meaning of identifiers it has already stored. It has no brief auto-commit because its briefs are written by a different mechanism.
Those entries sit in the adoption ledger as dashes with explanations attached, and the ledger says out loud what that means: converge only with a concrete reason, never for uniformity. Which is the opposite of how consolidation projects usually behave — the pull toward making the table all checkmarks is strong, and every unexplained dash looks like unfinished work.
Where the Parameter Stops Being Enough
There is a limit, and it is worth naming so the technique is not overapplied. A boolean that omits two columns is fine. A second boolean that changes which transitions are legal, a third that alters the response shape, a fourth that picks between two storage strategies — each is individually defensible and collectively they turn the shared module into a configuration language for a family of half-similar behaviors.
The rough test: a parameter should remove or name something, not choose behavior. Removing a column is removal. Naming the subject column is naming. Selecting between two claim algorithms is choosing behavior, and that is a signal that two different things are wearing one name and should be two modules — or that one of them belongs to the app.