先に明かす。 2026年6月にこの雑誌は、一人事業者が複数の役割をひとつの画面にまとめた話を載せた。この現場は特定の事業者ではない。 実際にそう回っている形をそのまま構成し、どこかは明かさない。以下はその形どおりに自分で作ったものだ。
一人で事業をする人にとって本当に痛いのは仕事の量ではない。切り替えだ。注文をひとつ見て、税金の日付を見て、取引先のメールを見て、また注文へ — そのたびに掴んでいた糸が切れる。
だから「ひとつの画面に全部まとめればいい」は半分だけ正しい。全部まとめるのはただのリストであり、リストを作るのは難しくない。 難しいのはそのリストを一人で信じることだ。間違えたときに捕まえてくれる人がいないからだ。
だから作るべきものは「すべてを見せる画面」ではなく「間違っているか確認できる画面」だ。二つを入れた。
出典のない項目はない
/// 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;
実行ログだ。
[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)
六行すべてが (from …) を付けている。出典のない行は、誰がいつなぜ書いたのか分からないメモであり、一人で働く人の画面ではそういう行は時間が経つと無視される。無視され始めると画面全体が無視される。
検証が空の出典を捕まえる。
MISSING=$(grep -c "(from )" captures/run.log || true)
[ "$MISSING" -eq 0 ] || { echo " $MISSING item(s) appeared with an empty source"; exit 1; }
なぜこれが一番上かを画面が言う
ここがこの編の中心だ。
リストは並べ替えられなければならない。ところが並べ替え関数はコードの中にあり、コードの中にある決定は誰も反論できない。
/// 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';
その一文が画面の下にそのまま出る。
ordering rule on screen: "late first, then money at stake, then soonest due"
これがあれば店主は一番上の項目を見て「いや、梱包材は後でいい」と言えるし、どの規則を直せばいいかも分かる。 なければ「このアプリは順序が変だな」で終わり、結局使われなくなる。
そして検証が画面が言った規則どおりに実際に並んでいるかを照合する。
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)
通過ログだ。
late items ordered by money at stake: [1.8, 0.5]
言った規則と実際の順序が食い違うことはよくあるバグであり、一人で使う道具ではその食い違いを誰も指摘してくれない。
