A form that rejects bad input is only checking the route it was built for. If a record can reach the same database through an import, an admin screen, a script, or a “save draft” button, the form’s rules don’t apply there, and the first place anyone notices may be the person who has to […]
The ongoing conversation
Category: Coding
A Cached Count Is a Business Rule, Not Just a Number
Suppose a comics database shows each series with a count of its issues, and the count is cached so the page doesn’t have to total thousands of rows on every view. The number looks harmless. But the moment someone asks whether a variant cover is an issue, the cached count stops being a number and […]
When Autocomplete Gets a Security Page Instead of Data
When an editor typing into a long catalog form triggers an autocomplete search, they expect a dropdown of matching names. What they do not expect is a silent freeze or a generic “network error” because an intermediary security service decided to challenge their browser. In complex web applications protected by services like Cloudflare, background AJAX […]
A Date and a Time Are Not Yet a Timestamp
If an event organizer tells you a run starts at 1:30 a.m. on Sunday, November 1, they have given you a date and a time. What they haven’t given you is a timestamp. In any region that observes daylight saving time, 1:30 a.m. on the first Sunday of November happens twice. When the clocks “fall […]
One Notes Field, Many Rendering Contracts
Adding Markdown to a long-running catalog sounds like a single decision: install a parser and turn plain text into HTML, but in a mature database, “Notes” isn’t one place. In the Grand Comics Database (GCD), there are notes on issue records, creator biographies, brand groups, reprint relationships, and character appearances. Some notes sit in a […]
An Analysis Branch Shouldn’t Rewrite the Game You’re Playing
Undo sounds simple until there is more than one person at the table. If I take back a move, whose move was it? Does the other player agree? What happens to the line of play we already explored? Those questions are easier to answer if analysis is separate from the live game. Imagine a chess-like […]
The Jobs Your Scoring Model Never Gets to See
A blank job-title field doesn’t necessarily mean an unrestricted search. In a job-search application I’ve been developing, a search with no manually entered titles could use suggestions drawn from the user’s resume. Those suggestions narrowed the search before the AI model scored the postings, so a missing job could be a filter decision the user […]
Setup Is Allowed to Change the Board. Reload Isn’t.
A saved game should let you continue making questionable decisions from where you left off. It shouldn’t give you a fresh board and pretend those decisions never happened. In my Goblin Slayer work in Tabletop Simulator, setting up the cave and loading a game in progress have different jobs. Setup can arrange the cave tiles; […]
What Disappears When Your Table Fits the Screen
A review queue can fit neatly on a phone and still leave the reviewer guessing which item to open. Hiding a column solves the space problem; whether it solves the user’s problem depends on what was in the column. In the Grand Comics Database‘s Changes Under Review queue, the State column disappeared on narrow screens, […]
Modernize for the Person Who Will Maintain It
A website rewrite can give its users a familiar screen and leave its next maintainer with an unfamiliar application. Someone still has to find the rule behind a wrong number, work out why a save failed, and make the next change without breaking the last one. That person belongs in the framework discussion. In the […]