Answers · from work actually shipped
Questions this work keeps answering
Short answers to the questions behind the case studies — written from builds that shipped, not from theory. Each one links to the full writeup.
These are the written answers. There is a live one too — ask it anything these do not cover, or bring a build decision and it will work through it with you.
How do you train staff on a system that has no practice mode?
You build the practice mode yourself. When every action in the real system is an irreversible, timestamped submission attached to someone’s actual case, the usual fallback — watch a competent person, then do it live with them standing behind you — spreads the cost thin enough to look free while still being paid by a senior person’s afternoon and by the occasional real mistake. A high-fidelity mock of the wizard gives people a cheap place to be wrong.
How closely should a training environment copy the real system?
Not as closely as instinct suggests. Fidelity is a trap: past a point, every extra detail you copy is a detail you must maintain when the real system changes, and some divergences are worth defending on purpose. What matters more is being honest about where the model stops, so nobody mistakes a simplification for the real behaviour.
Should automation press the final submit button?
Not when the submission is irreversible. The useful question is not how much of the process the automation removes, but where in the process errors stop being recoverable — and whether the automation stops on the safe side of that line. Automating the assembly and handing a finished draft to a human keeps the system one that only has to be reviewable, rather than one that has to be right.
What does one job mean when two systems both have an id field?
It means you have a domain question wearing a data-plumbing costume. A spreadsheet export and an API can both expose something that looks like a job identifier while counting different units of work, and treating them as interchangeable produces numbers that stay plausible for a long time. The dedupe key has to follow what actually counts as one unit of work, not whichever field is named id.
Why do green test suites still let defects ship?
Because a passing suite only proves the things you thought to ask. Eight green suites still left a tab that never came back, a save that loaded cleanly and then died, and a note lost inside its own autosave window — none of which ordinary play would surface. Attacking a build from several deliberately hostile directions finds a different class of defect than writing more tests of the same kind.
Full writeup: Six defects ordinary play would never have found →
Why build internal tools local-first with no server or account?
Because most internal tools do not need a backend to justify one, and adding it buys you accounts, hosting, and an exit problem. A local-first desktop tool can ingest a messy export, resolve it into real units of work, and produce reporting someone can act on without anything leaving the machine it was created on.
Can you value a Dota 2 inventory without logging into Steam?
Yes, and you should be suspicious of tools that ask you to. Both halves of the problem are public: a Steam inventory is readable at a public endpoint when the profile allows it, and Community Market prices are public too. Neither needs a login, a trade link, or an API key — and a tool that reads them has no reason to send your session cookies along. What that honestly costs you is worth stating: private inventories stay unreadable, and market prices are asking prices, not what an item will actually sell for.
Why would an inventory tool deliberately be slow?
Because the rate limit is enforced on your IP address, not on the software. That inverts who pays for greed. A tool that sweeps prices as fast as it can does not degrade itself — it locks you out of steamcommunity.com for hours, including your own inventory page and the market, and the ban re-arms if you trip it again during the cooldown. On a shared connection it takes the household with it. Once you see that, pacing well under the ceiling stops being politeness and becomes the actual design constraint: prefer one bulk request over a hundred small ones, never fetch unprompted, and stop completely the moment the service pushes back.
What are idle cosmetics?
Idle cosmetics are the items you own for characters you have stopped playing — value that is real on paper and doing nothing for you in practice. Every inventory calculator can tell you what a collection is worth, because a price is all one dataset. Answering whether any of it is working takes two datasets that normally live in different places: what you own, and what you actually play. Cross them and the collection splits into cosmetics riding on your current heroes and cosmetics parked on ones you have not picked in twenty games — along with the inverse, the heroes you play most with nothing equipped at all.
How do you merge two PDFs without Adobe Acrobat?
Any PDF library can concatenate pages. The hard part is the workflow around it. A purpose-built merger that holds one reference document and appends it to whatever you drop on it removes the export dialog, the destination folder and the filename entirely, which is what turns the task into a single gesture. Overwriting the original in place is what buys that speed, so it has to be guarded by a confirmation naming both files, a refusal on non-PDF input, and a lock while the write is in progress.
How do you move hundreds of files at once by file number?
Paste the numbers instead of selecting the files. A tool that prefix-matches each filename in a source folder against a pasted list never loses its selection halfway through a long run, and it can refuse the obvious mistakes first: a duplicated number, a destination identical to the source, a name that already exists at the far end. It should report moved, skipped and failed as separate counts rather than claiming success, because that is what lets someone stop checking its work.