Field

Why This Is on Top — The Screen of Somebody Working Alone

In 2026-06 we ran a piece about a sole trader gathering several roles onto one screen. Gathering everything onto one screen is just a list. The hard part is trusting that list on your own — so every item comes out carrying its source, and the sort rule is written on the screen.

By makemind · Aug 12, 2026

Stated up front. In June 2026 this magazine ran a piece about a sole trader gathering several roles onto one screen. This is not a specific business. We constructed the shape exactly as it actually works, and we do not name where. What follows was built to that shape.

For somebody running a business alone, what really hurts is not the volume of work. It is switching. Looking at an order, then a tax date, then a supplier email, then back to the order — and each time the thread you were holding snaps.

So "just gather it all onto one screen" is half right. Gathering it all is just a list, and making a list is not hard. The hard part is trusting that list on your own, because there is nobody to catch it when it is wrong.

So what has to be built is not "a screen that shows everything" but "a screen you can check for being wrong". Two things went in.

No item without a source

/// Where this came from. An item with no source is a note somebody typed and
/// forgot; an item with one can be checked.
final String source;

The execution log.

[sales]  Follow up Hanul, quoted 2 weeks ago — 9 days late  1.8M won  (from quote log)
[supply] Reorder packaging film — 2 days late  0.5M won  (from stock below reorder point)
[sales]  Quote for Mirae — 40 units — in 1 days  3.2M won  (from inbox 04-18)
[making] Batch 118 labels — in 3 days  (from production plan)
[books]  VAT quarterly return — in 5 days  (from filing calendar rule)
[books]  Reconcile March card statement — in 8 days  (from bank feed)

All six carry a (from …). A row with no source is a note nobody knows who wrote, when, or why, and on the screen of somebody working alone such a row gets ignored over time. Once rows start being ignored, the whole screen gets ignored.

The verification catches an empty source.

MISSING=$(grep -c "(from )" captures/run.log || true)
[ "$MISSING" -eq 0 ] || { echo "   $MISSING item(s) appeared with an empty source"; exit 1; }

The screen says why this is on top

This is the centre of the piece.

A list has to be sorted. But the sort function lives inside the code, and a decision inside code is one nobody can argue with.

/// Why the list is in this order, in words the owner can disagree with.
///
/// A sort function hidden in code is a decision nobody can argue with. Naming
/// the rule on the screen means the owner can look at the top item and say
/// "no, the packaging can wait" — and know which rule to change.
static const orderingRule =
    'late first, then money at stake, then soonest due';

That sentence appears verbatim at the bottom of the screen.

ordering rule on screen: "late first, then money at stake, then soonest due"

With it, the owner can look at the top item and say "no, the packaging can wait" — and know which rule to change. Without it, it ends at "this app orders things strangely", and eventually it stops being used.

And the verification compares whether it really sorted the way the screen said.

line = [l for l in open(sys.argv[1]) if 'late, in order:' in l][0]
amounts = [float(m) for m in re.findall(r'\(([0-9.]+)M won\)', line)]
if amounts != sorted(amounts, reverse=True):
    print(f'   late items are not ordered by money at stake: {amounts}'); sys.exit(1)

The passing log.

late items ordered by money at stake: [1.8, 0.5]

The stated rule and the actual order drifting apart is a common bug, and in a tool used by one person nobody points that drift out.

The one-person desk — every row carries which hat it belongs to and where it came from, with the rule that made this order written underneath. Real render capture
The one-person desk — every row carries which hat it belongs to and where it came from, with the rule that made this order written underneath. Real render capture

This content requires Developer or above

Sign in and upgrade your plan to continue reading.

View Plans
Twitter