Timeline
The full history of the stack — launches, milestones, and updates.
- The timeline learns to fold
Long build-log entries now clamp to three lines with a read-more toggle, so the timeline and the dashboard feed skim cleanly while every word stays reachable. A sitemap joins robots.txt for search engines.
- The site moves to davidmar.me and starts saying what it is
The hub gets a real domain and a front door meant for visitors instead of for its owner. The landing page now leads with the four data analyses and what each one actually found, with Saltmere set apart as the creative build; the dashboard moved to its own page. The framing changed to match what the site really is: not a developer portfolio, but a record of what one person can do with Claude Code — the questions, the judgment, and the null results included. Contact links, Open Graph metadata, and a favicon round it out.
- Saltmere: the act turns, and the flags Act I set finally get read
Act II's map shipped before the calendar it exists for, so this was the calendar: days nine through sixteen, the season's turn. The audit that started it is the one worth keeping. Five flags the game had been writing onto the player's save since Act I were read by nothing at all — the counting dream, the second taking, the full-truth answer at the inquiry, the boot-scuff in the corner of the keeping room, the cut pack strap at the cave mouth. Act I had planted every piece of evidence and the game never paid any of it out. That audit is now a test with a ratchet on it: every flag that gets set must be read by something, and the list of exceptions may only get shorter. It caught the work, so it can catch the next slice failing the same way. What the payout looks like: on day nine the town meeting branches on whether the survey was ever reported and again on whether the flash was ever admitted to, and the full-truth path has the mayor waiting with an enchanter he sent to the row for. The other path watches that man go inside without you, which is where withholding finally gets charged rather than merely noted. Day eleven the count in the dream stops on you. Day thirteen names the thing, for anyone the day-nine door passed over. Both doors converge on the beat the whole slice is built around: not an explanation, a demonstration. The mark is named as a fitting rather than a curse, the channel answers, and one fragment of the keeping room comes through it from the inside — cold, a stroke scratched beside four others, a tired voice keeping count. No face and no name, asserted by test, because the deduction has to stay the player's. Then it becomes a decision with a bill attached. Three permanent answers at the counter, every price named before it is paid: open the channel and you get a weapon that hits the brood harder because it knows them from inside, bought with a point of maximum nerve for the rest of the season, which is a cost paid in every fight rather than once. Cut it and the dreams stop and the voice you heard was the last of it. Refuse, and nothing is on you but your own hand, which is the one thing the other two answers cannot offer. The next night reads the choice back in four variants, including the one for a player who still hasn't answered. Day fourteen is the revelation, and it was already latent in the enemy roster rather than needing to be announced: unfinished brood has no morale and telegraphs everything, finished brood feints and holds a line, and the difference between those two statlines is a person. Nerve taken from kept captives is what finishes them. The taken are not eaten, they are kept. And the ones who run are no use for it, which is why the one who never ran at anything is the one who is still alive. Whether the man who raised her gets told is the player's, and the game writes that fork three times over, weighted by how sure they actually are, with sparing him heaviest at the top rung where it stops being protection and starts being management. Day sixteen the town watches a farmwife walk compelled at a shut gate, and she lives, emptied, which is worse and does more. The narrator never explains it. The tell is that the player recognises the gait. A fifth art-less speaker was built to carry it, an enchanter who answers a question with what it costs rather than with the answer and will not give anything away for nothing, reassurance included. The voice lint earned its keep again: it caught the scene where the barman is handed hope running entirely on clipped fragments and pulling him under his own rhythm band, which was the right catch. He says two more real things now. 169 tests green.
Saltmere → - Saltmere: Act I finished, and a register that changes as people warm to you
The plan was to finish Act I properly before Act II gets built on top of it, since changes underneath have knock-on effects. What that turned into was a mechanic nobody had asked for at the start of the day. The character bibles set a target sentence rhythm per character, and one of them, the house bard, measured nine words against a band of twelve to eighteen. The obvious reading was that he was written wrong. The better reading, once it was pointed out, is that nearly every line he has is a first-meeting line, so he is not wrong, he is guarded. That reframes the whole idea: a band is not a flat target per character, it is a destination, and it grows as the relationship does. A stranger is brief; people talk more, and offer things unasked, as they warm to you. So the bible band became the Beloved-tier destination and every character got a guarded floor to start from, keyed to the affection tiers the game already tracked. The striking part is not the numbers but what happens between them: the spread between characters is about five words at first meeting and nine or more at the top, which means the cast differentiates as you come to know them. Strangers sounding alike is not a failure, it is what being a stranger sounds like, and it explains why an earlier measurement of the whole corpus found only 1.34 words of separation. Checking whether the game already did this produced the sharpest finding of the day: affection-gated content measured 7.1 words against 7.8 for ungated, which is to say every training ladder in the game ran backwards. Three separate characters got terser the better you knew them. All of them now climb. A second correction came in mid-pass and mattered as much: a longer sentence is not a friendlier one, it is just a run-on, and warmth is carried by what is said, by how much someone volunteers unasked, by how many turns they take, and by expression. The lint as written actively rewarded run-ons, because the fastest way to lift an average is one enormous sentence, so it gained a guard against exactly that. Stats got the same treatment from a different angle, modelled on how speech checks work in Fallout: a check there does not hand you more conversation, it hands you a different route through the one you are in. So affection is depth and stats are approach, deliberately independent, with every lead answering to the stat they teach and Charm shortening the climb to warmth without ever lifting the ceiling the story controls. Alongside all that, the second tier of description finished: every one of the twenty-one locations can now be sat in and looked around, eighty-seven nodes of it, each detail teaching something rather than decorating. Across the day the corpus went from 145 nodes to 242, em-dashes from 180 to 44, and the narrator's decoding constructions from five to zero.
Saltmere → - Saltmere: the rooms were never small
The question was whether to make each location physically larger before Act II adds thirteen more, because there seemed to be more things in every room than there were places to stand. Measuring first turned the question around. Across twenty-one scenes there were 925 standable cells and 3,109 blank interior cells: seventy-seven percent of the drawn interior of every room was gaps in the walking lattice rather than walls or furniture. Floor had always been drawn on a three-column rhythm, because the movement scan skips at most two blanks, and filling that lattice in was worth up to four times the standing room already inside the existing frames. So the expensive option — wider grids — would have bought something the game mostly had, and it had a hard ceiling anyway: the scene font is width-governed on phones, where past about fifty-nine columns the map is silently cropped on both sides with no scroll and no warning, and movement is keyboard-only. Densifying costs nothing by comparison. No dimension changes, no font change, and because the renderer already emits an element per cell including the blanks, not a single extra DOM node. Crowding also turned out to be local rather than general: the spring camp had 2.2 standable cells per hotspot and the wreck cove 3.0, while the edge hut had 22.5 and the under-tavern 20. That made the load-bearing change a rule rather than a redraw — six standable cells per hotspot, minimum, enforced by a test whose budget only ratchets down, so new content is pushed toward the empty rooms instead of piling onto the busy ones, and Act II inherits the standard instead of relying on anyone remembering it. Pitch now follows crowding rather than geography: three-column is the default and the maximum, two-column is for rooms that fail the ratio, and pitch never mixes inside a single room. Eight locations were redrawn. Three of them could not be fixed by dots at all, because they were mostly sea or forest with one walking line through the middle — the harbor quay gained an apron so the board and the plank shrine stopped sharing a step, and the spring camp and wreck cove went from a single walking line to four and three. Floor cells went 925 to 1,118 and rooms under the ratio went eight to zero. Two hazards were fenced off on the way: the scene padding helper fills with a glyph that is also floor, so a row ending in it would silently pad out a contiguous band walking at the wrong pace, and a redraw moves the lattice out from under saved positions, where the player character stops being drawn at all and every movement key goes dead. That one is now checked on every load regardless of save version. The pinned coordinates in the movement tests were re-derived from the art rather than re-pinned, so the next redraw moves the tests with it instead of breaking them.
Saltmere → - Saltmere: the pass that scored better and read worse
David's verdict on the bible pilot was that the construction had landed but the personality was thin, and asked for a look at how dating sims and VNs actually put energy on the page. Two causes turned up, both measurable, and the first one was self-inflicted. Across the six rewritten scenes the contraction rate was zero. Not low: zero. Every “didn't” had become “did not”, every “it's” had become “it is”, across all six, without anybody asking — against 71 contractions per thousand spoken words in David's own hand-written nodes and 73 in the rest of the shipped game. A whole cast had been quietly moved into a formal register, which is most of why scenes that were better built felt colder. The second cause was structural rather than accidental. Every rule in the voice lint was a ceiling: a tell may only ever get rarer. Ceilings alone produce clean flat prose, because a rule that can only subtract will subtract the personality too — the clearest evidence being Auren, whose bible says in writing that she owns the exclamation marks and the ellipses, and whose scene written to that bible contained zero of either. Reading actual visual novel scripts sharpened what was missing. An energetic character carries several exclamation marks per turn, not per scene; repetition does the work of volume; the ellipsis is used mid-utterance as breath and stammer rather than only as a trailing close; and the narrator is a character with opinions about its own body, not a camera. Measured against that, Saltmere's narrator had zero question marks, zero ellipses and zero exclamation marks across nine thousand four hundred words. So the lint gained floors that ratchet up, alongside the budgets that ratchet down: a contraction floor, with the sharper form being that no single scene over sixty spoken words may contain zero contractions, since the corpus average is far too weak a test — six formalised scenes only dragged it from seventy to sixty, one rounding away from passing. Plus per-character minimums: six exclamation marks and three ellipses for Auren, two question marks for Sable's rhetorical crutch, three ellipses for Bram, three questions for the narrator. Sorrel's zero-ornament rule stays a ceiling, because the absence is the characterisation. Auren now runs twelve exclamation marks per thousand words against the cast's one or two, which is the point of her. What deliberately did not come across from the genre: spelled laughter, tildes, honorific tics. Saltmere is a cold frontier port, not a school.
Saltmere → - Saltmere: a place you can sit down in, and six voices that stopped matching
Two things landed together, and the second one only works because of the first. The bibles are settled canon now, written into the design record alongside the measured register that produced them, so the lint that has been enforcing them since yesterday finally has a document to enforce. Then they were spent on dialogue: one scene per lead, rebuilt to its bible on the shape that won the earlier experiment — a shared physical task, the emotional turn happening inside it, never named, ending flat. Kess takes the practice rack off the wall and has you dry the tangs while she lays eleven blades out on a rack that holds ten, and she never mentions this, and the one she cannot put back in the row ends up across her knees and then in your hands, because she cannot say sorry and substitutes correction, praise, and work. Auren sorts moth-wards into a tray and stops with one halfway there. Sable presses you into holding a tuning peg, stops mid-verse, says the thing, reaches for the joke that gets him out from under it, and does not find one. Sorrel puts a scraper in your hand and gives you her father in four flat facts and then refuses to go past them, because she cannot speculate. Tamsin mends her coat and issues an invitation that comes out as a duty roster. Bram never says Wren's name and starts a sentence with next spring in it that stops after five words. None of the six was David's prose, which was the selection rule. The numbers moved: the spread between how alike the leads sound went from 1.34 to 2.02, em-dashes across the corpus from 180 to 134, italics 12 to 7, narrator-decoding 5 to 3 — and every budget was lowered in the same commit, because that is the whole mechanism. The 6.5–14 target band is not reached and cannot be by six scenes; the rest of the pass has to earn it. Alongside that, the world got a second tier of description. A location's blurb tells you where you are; now its name is a button, and sitting down tells you what is actually in the room and lets you turn three or four things over. It is free by construction rather than by policy — a look is not a hotspot, so it cannot reach the function that charges for slots at all — and it may set knowledge flags and nothing else, because the hub replays every time a detail returns to it and anything a look pays out it would pay out forever. The place stays on screen while you read it, dimmed to forty percent with your @ where you stopped, which is the whole point: you asked to look at the harbor, so the harbor should not vanish. Three places are written end to end. The watch-house names the day-book in the drawer and the four strokes somebody scratched into the plank at the head of the cell bed. The harbor has a mate who takes passage money at the rail with a slate and does not sail anybody who is short. The Copper Hearth has a doorframe at the foot of the stairs with notches climbing it, the highest one dated four years ago with nothing above it, in the one room Bram scrubs every morning and has never once put a cloth to. Two bugs surfaced from tests rather than play: the dialogue engine resolved a detail ending in the new return-to-hub target by trying to enter a node literally named for it, and the first version of the closedness validator defined the set of look nodes by what they could reach, which makes the question answer itself — it passed a test it should have failed.
Saltmere → - Saltmere: getting the dialogue out of Claude's handwriting
David can identify Claude's authorial voice on sight, and Saltmere's dialogue was written in it. So the tells were measured rather than argued about: 457 lines of shipped dialogue against the 22 nodes David had rewritten by hand. The headline number is not the one anyone expected. It is not sentence length — his cast clusters at 8.2–9.0 mean words per sentence exactly as Claude's does at 7.5–8.9, which is its own finding: a scarred sword-master, a professional performer, a nervous academic and a twelve-year watchstander were statistically one person in six hats. What separates the two registers is warmth. Reassurance appears in David's dialogue at 10.4 per thousand words and in Claude's at 0.4, a factor of twenty-six; praise of the player, seven times. His characters are on the player's side and say so out loud, where Claude's break every emotional beat with a joke, because irony is easier to write than sincerity. Second: whose head the narrator is in. David's narrator is the player's inner voice and interprets only what you felt; Claude's is an omniscient character-reader that decodes an NPC's tell for you — something David does exactly zero times. Third, the mechanical one: Claude does not write 'but', it writes an em-dash, at three times his rate. Two rewrites of the same scene settled what to do about it. The one that kept David's beat order and fixed only the prose lost; the one that rebuilt the scene won, which means the broken layer was scene construction rather than sentences. The winning shape puts people in a physical place doing an ordinary shared task, lets the emotional turn happen inside the task, never names it, and ends flat: Tamsin's day-book at the gate-house, where she has you read yesterday's entries aloud while she writes today's, tells you the things she cannot file, then pushes the book across for you to write in. Trust enacted rather than negotiated. Landing it surfaced a real bug — that scene was an orphan node, reachable from nothing, so the gate guard's affection cap never lifted and her route was stuck at acquaintance. The same principle then went through the world: all 21 location blurbs, 13 note hotspots and 11 node narrator lines, on one rule — where there was a wry conclusion, put a fact about the world instead. Every one of the 34 originals had ended the same way, concrete detail followed by a knowing remark, which is one formula thirty-four times. The replacements trade the joke for information the player did not have: the harbor now teaches the passage economy the whole season is built on, the plank shrine gives Ansel a physical object with his name freshly cut into it, the watch-house names the day-book two scenes before Tamsin hands it over. Six character bibles now derive speech mechanics from history rather than taste, and the load-bearing line in each is what that person cannot say — Kess cannot say sorry, Bram cannot say Wren's name, Sorrel cannot speculate, Tamsin cannot be casual, and Sable cannot be sincere without undercutting it, a trait the whole cast had been sharing and which now belongs to the one professional performer. Nine of the rules ship as a lint over the corpus, because a written style rule that does not run drifts back: unreachable-node detection, per-tell budgets that ratchet down as rewrites land, ornament rules per character, and a spread floor on how alike the leads are allowed to sound. It caught Kess using Sable's deflection on its first run.
Saltmere → - Card Market: the cards that cannot be reprinted moved just as much
A reprint is a secondary offering. Supply expands, the copies already out there are diluted, and the older printings should fall. Marvel Super Heroes released on 26 June, thirty days into the price window with sixty days after it — the one clean supply shock this data contains — and the pattern showed up exactly as theory says it should: older printings of the reprinted cards fell 4.16% against the basket over sixty days while the rest of the basket rose 1.09%. It would have been a good finding. Then the control killed it. A Reserved List card cannot receive a reprint, because Wizards is contractually barred from printing one, so whatever happens to it around a release has nothing to do with the release — which makes it a control by construction rather than by matching, and the only real reason to trust the first number. Net of how each group was already drifting, the contractually immune cards moved more than the reprinted ones did. If the group that cannot be affected moves as much as the group that was, the fall is not a reprint effect, and the study is reported as failing its own structural control. The placebo test cannot rescue it either, for a reason worth stating plainly: the price series is 89 days long, so a 60-day window has only about 29 possible starting positions and two windows a day apart share 59 of their 60 days. The 'distribution' is one window jittered, its band is far too narrow, and it is labelled not interpretable rather than quoted. The same pass turned up a whole class of cards this dashboard is structurally blind to. Serialized printings are numbered one-of-N at press time, so their supply is fixed the same way the Reserved List's is fixed — a different route to the same property — and the top ones are worth as much as or more than any reserved card, with a serialized Cavern of Souls at $10,000. Card Kingdom quotes none of the 305 of them. Since the entire project is built on the one dealer that publishes both a buy price and a sell price, those cards cannot enter the basket, the index, the spread or the event study. They are invisible here, not absent from the market, and the page now says so.
Card Market → - Card Market: the same card is worth 2.5% as much when it cannot be scarce
Magic Online sells the same cards as paper, with one difference: nothing there can be scarce. Digital supply is not capped by a print run and no digital card is thirty years old. So comparing the two prices on the same day splits a paper price into the part people pay to play with a card and the part they pay because it is hard to find — and the split is lopsided. Across 12,516 cards priced in both, the digital copy runs a median 2.5% of the paper price and 89% sit under half. In the $500-plus tier the paper median is $10,150 against $51 online, a ratio of 0.006: about 99.4% of that price is scarcity, not playability. That comparison cost nothing to build, because the MTGO prices were already inside the file the project has been downloading since day one and the transform was throwing them away. The other half of the work was demand. Playability is one input to it, not the whole thing, and the measure everyone reaches for — EDHREC rank — only ranks Commander, which is singleton: a played card there is bought once, while a Standard or Modern staple is bought four at a time. That four-fold difference is invisible to every signal that ships with the data, so tournament decklists were crawled to measure it instead of assuming it, because decklists carry quantities. Those lists also answer a question worth asking on its own: do the paper and digital metagames play the same cards? They largely do — Spearman 0.70 across 326 non-basic cards — which is what makes the paper signal readable as playability rather than as a proxy for who can afford to compete. Four modelling traps were found and closed on the way, each of which returns a plausible number rather than an error: two nested format counts that inflated each other into a large positive and a large negative coefficient that cancelled; Penny Dreadful legality, which is *defined* by a card being cheap and so regresses price partly on itself; a per-tier R-squared that is small by construction because a tier is a price band, and would read as 'demand explains nothing' if published without a pooled figure beside it; and the two metagames agreeing so well that their inclusion rates became collinear as predictors. One result is robust and still unexplained, and is labelled that way: cards legal in more four-copy formats are cheaper, and it survives controls for age, rarity and the Penny circularity.
Card Market → - Card Market: is it one market, or several things averaged together?
Every index on the dashboard pooled 23,022 printings into one number, which only means anything if those cards are the same kind of asset. Testing that first turned up two problems in the old basket before any statistics were run. The reserved-list index was contaminated: 180 of the 658 printings carrying the reserved flag are 30th Anniversary Edition and Collectors' Edition — non-tournament-legal proxies that carry the flag because the card names are on the list, while being new supply of those exact names, which is the opposite of the property the index exists to track. And the equal-weighted index was not equal-weighted: 23,022 printings come from only 8,944 names, 47 names produce 1,672 of them, so Sol Ring had twenty-two votes and a card printed once had one. That is reprint frequency acting as a weighting scheme nobody chose. Each name now carries a total weight of one, and the chart shows all three weightings side by side because the choice moves the answer by three and a half points over 89 days. The old 'value-weighted' line has been renamed price-weighted, because value-weighting needs shares outstanding and print runs are not public — it was the Dow's construction wearing the S&P's name. Then the actual question, with the rule written down before the numbers were looked at: a segment gets its own index if its return dispersion differs from the parent by 25% or more and survives a permutation test at 1%. The permutation reorders whole card names rather than individual printings, because twenty-two Sol Rings are not twenty-two independent observations. The answer is narrower than expected. Price tier segments, hard and monotonically — expensive cards move together far more tightly than cheap ones. Era does not. Supply mechanism does not, so Secret Lair print-to-demand cards and promos disperse like ordinary booster cards. Rarity crossed with era does not. Three nulls, reported as nulls. One caveat is published with the result rather than left to be discovered: every segment is compared against a parent that contains it, and that parent includes the sub-$5 cards where a one-cent tick is a double-digit move, so part of what makes the expensive tiers look calm is the noise in what they are being measured against.
Card Market → - Card Market: the price on the card is not the price you get
A new project, built after reading about a startup fractionalising collectable cards the way others have fractionalised art. The idea only works if a card's marked price is a number someone will actually pay, and this data can answer that unusually directly: of the four dealers publishing Magic prices, Card Kingdom publishes what it sells a card for and what it pays for the same card the same day. That makes a real round trip observable rather than a spread stitched from two venues that never trade with each other — and the round trip costs 44% of the sticker price on a $20–100 card, never dips below that at any price, and widens again at the top. Worse, 46% of the printings the dealer offers for sale it will not buy back at any price, and that share is worst at $100–500, which is exactly the range worth fractionalising: the cards you'd securitise are the ones the dealer least wants to hold. Two major venues quoting the same card on the same day sit a median 32% apart and their 89-day returns correlate 0.28, so there is no single market price to mark against. Two thirds of the basket's value sits in one card in a hundred. One thing expected did not appear and is reported as the null it is — illiquid assets that reprice rarely usually look artificially calm, which is the standard critique of art indices, but here the daily and quarterly risk estimates agree: repricing is lumpy and the jumps are large. A daily snapshot now runs locally, because nobody archives these prices and the only route to a real multi-year figure is to start keeping them.
Card Market → - Back into the Marrow Cave
The cave you survived is now a place you can walk into, and what's down there is worse for being empty. Forty stalls of cut and fitted stone in two neat rows, every one swept out, every drag-mark pointing the same way — out. The lane where four people came apart nine days ago has been tidied, which is the part that stays with you: whatever did this doesn't leave evidence behind, because it isn't finished with this coast. In a dry side room out of the draught there's a wall of tally marks, some furred with damp and some scratched bright four days ago, and a corner where the floor has been worn smooth by somebody sitting in it for a very long time. And the game's oldest unfinished thread finally resolves: your hands have been shaking since the first morning, capping what you can become, and they stop — but only if you told somebody the whole of it first. Three people will listen, and the best of them is Bram, across his own bar, about the girl he raised. Tell nobody and walk down there alone and the room gives you nothing back, which is also a thing the game is willing to say to you.
Saltmere → - Saltmere learns to hold a conversation
The dating sim finally has its spine. Five people can be known now — Tamsin off the gate and Sorrel out past the wall joined Kess, Auren and Sable as real routes, both with their own way of fighting beside you. Affection has a ceiling that hours can't push through: you can drill with someone every morning for a week and reach a friendly plateau, and only a real conversation moves it. Each of the five has one now — Kess hears the whole of what happened to Ansel from the only person who was there, Auren notices the thing sitting where your memory should be, Sable stops a song halfway through and you're the first person in town to notice he stopped, Tamsin hands you the good glass and asks what you see, and Sorrel talks about her father. The evening Hearth stopped being a room you could only look at: everyone who's there can be talked to, including the gate guard who eats in that room four nights a week and has no idea what to do with an evening off. Training changes as people get easy with you — the same hour, read three different ways. And the character sheet finally shows who you have and how well.
Saltmere → - The playtest pass: the wilderness gets a shape
A full playthrough turned up a list, and the list turned out to be deeper than it looked. The forest paths were walking at three different speeds — the roads were solid bands where every column was a step, while everywhere else moved three at a time — and the crooked dot by the armorer's stall was a tile nobody could ever stand on. Both are fixed, and two new validators make that class of bug unshippable: every drawn floor tile must be standable, and terrain can't change under you when a flag flips (training your Wits to 3 was quietly walling off a forest corridor). The game had also been lying about which actions cost time — every free door in town claimed to take an hour. Beyond the wall, time works differently now: passing the gate commits the day, roaming out there is free, and the light turns with the ground you cover, so wandering between two places and back no longer eats days you didn't notice spending. Nothing drags you home at dusk; the dark simply charges more, and the forest roads send worse things after dark. Sleep outside and you camp where you stand. Fall out there and somebody walks out with a lamp and carries you back — and they charge more every time. Fights now teach grit you can spend on drilling or on nerve, reaching the top of a skill finally means something, strength and sharp eyes open conversations that were closed, and nothing that costs you an hour happens without asking first.
Saltmere → - The season begins: Act I fills in
Saltmere's 24-day season started getting its content, and the first week now has a pulse. A huntress named Sorrel sells pelts at the Hearth on day three and keeps a camp past the forest edge where she'll teach you to move the way the ground rewards — she's been reading the goblin sign all spring, and what it says is 'driven, not wandering.' The guild board fills with honest work (roof slates, a mule with a ledger scam of its own devising, salt pans, a bell rope that parted suspiciously clean), the harbor posts a standing rat bounty, and the under-tavern's unsigned slate offers better money to anyone Sable will vouch for — a crate not to be opened, casks to be counted by one candle. A wreck cove pays salvage to whoever works the tideline past the new things living in the crab pots, and something dog-shaped that isn't a dog walks the camp path with a knotted tally-cord under its fur. Market day is warm; the dream where the dark counts you is not; and on day eight a drover's cart is found standing on the coast road with the mule calm in the traces and nobody in it at all. Passage home can finally, actually be bought — 150 for one berth, 350 for two — and the hard part was never the copper.
Saltmere → - Questions close, and the stew starts working
Saltmere's conversations learned that asking has weight. A question, once answered, closes — ask Bram about Wren and he'll tell you, but you can't stand at his bar making him tell it again; the same rule now runs through Kess, Sable, Tamsin, Martin, and Edda. Under the hood it's a new one-word mechanic any future dialogue inherits, the workshop grew a checkbox for it, and the engine now guarantees no conversation can trap you — when there's nothing left to say, the scene lets you go. Two hubs gained proper goodbyes to make that true. And a confession from the code: since the day it shipped, Bram's stew has been charging three copper and healing nothing — the kettle is fixed, the mend is real, and there's a test standing over it now. Behind all of this, the full day-1-to-24 season plan landed in the design record: three acts, five romance routes, a villain with a ledger, and a wall that will need holding.
Saltmere → - The town fills in, and the road gets teeth
Saltmere grew by four places and five people. The town hall (where Mayor Hollis summons you on day two to ask, carefully, what happened in that cave), the watch-house (where Sheriff Odell has a letter she needs walked — and what you do with it is the first real moral choice in the game), a lone hut past the wall (Edda, who has read the forest for forty years and doesn't like what it's been saying since spring), and the deep forest itself. Named townsfolk now speak with their own name-plates — the mayor, Martin the fisher who found you, the sheriff, Tamsin on the gate — no portraits yet; their faces are the town's business. And travel stopped being safe: the first walk toward the forest is ambushed by goblin scouts who have no business being this close to a walled town, and the outer roads roll deterministic dice ever after. Bram will now offer you the rat job to your face, which he admits he should have done from the start.
Saltmere → - Saltmere finds its voice
The first real writing pass landed, and it changed the game's temperature. The wake sequence, Bram's morning kindnesses, and the sword-yard conversation with Kess were rewritten in a warmer, more human register — people in Saltmere now say what they feel, and grief is carried in the open. The town's story deepened with it: a name for the fisher who found you, a mayor who will have questions, and a new conversation behind the bar — ask Bram about her, and he'll tell you about Wren, the girl he raised, who went into the Marrow Cave with you and is mourned under a stone with nothing beneath it. The war news on your first night is a real scene now too, with Bram doing a tavernkeeper's arithmetic — days, coin, people — out loud.
Saltmere → - The workshop stops living in the past
The workshop's draft lives in the browser, and it had been quietly aging: seeded from an older deploy, it kept showing pre-fix maps (phantom walkability errors), old cast art, and an item list missing every weapon in the armory. Now every section of the draft carries a fingerprint of the shipped content it was seeded from — on load, anything the author never touched silently updates to the current shipped game, while anything edited is never overwritten, and a small note says what was refreshed. The tab row was also rearranged to match reality: Saltmere first, the old evening game set apart under its own label. The item table gained its gear fields (kind, price) in the editor, the draft playtest now reads the draft's items, and the world validator learned to flag references to items that don't exist.
Saltmere → - Combat learns to ask questions
Fighting in Saltmere stopped being a button and became a conversation. Heavy attacks now wind up for a full round — the whole body confesses, the sprite pulses — and the right answer depends on you: brace behind a guard and the blow lands at a third, or hit hard enough mid-wind-up and the move collapses in a stagger. Guarding a hit opens a riposte. A new resource, Nerve, sits under it all: weapon arts (a blade's feint, a mallet's guard-crushing smash), Auren's new Ward and Mend spells, and shouted orders to companions all spend it; the coming dark things will drain it; guarding breathes it back; and at zero your hands shake too hard to read anyone. Each companion answers an order in character — Kess plants herself between you and everything, Auren mends or wards, Sable reads the room and opens every enemy's intent. The training dummy learned to topple, ponderously, so all of it can be practiced against furniture.
Saltmere → - A sheet of your own, and battles that move
The pack grew into a character sheet: every stat drawn as a bar out of ten (the creation screen now shows the same ten-slot runway, so the scale is legible from your first choice), health and copper beside a glowing @, and gear slots in the old RuneScape manner — a weapon box and an armor box, click a carried blade to equip it, click the slot to fight with your fists on principle. And combat moves now: an attacking rat shivers before its lunge, whatever gets hit jolts red, and your @ surges forward when you strike — small motions, once per round, that make a turn feel like something happening rather than numbers changing.
Saltmere → - The workshop learns Saltmere
The authoring workshop is ready for the writing phase. Its node editor — lines, choices, conditions, renames that chase every reference — now points at Saltmere's script, not just the old evening game's, and renaming a Saltmere node fixes the doors, events, and fight outcomes that mention it. Calendar events and quest postings became editable data. Best of all: a Playtest button runs the actual game on the draft world, in its own save slot, so a rewritten scene or a new location can be walked thirty seconds after it's typed. Draft validation now includes the movement checker, so a scene edit that would strand the player complains while you're still typing it.
Saltmere → - Six stats, a war, and the price of two berths
The systems the story will hang on. Stats now run one to ten across six of them — the new sixth, Wits, is perception: read an enemy sharp enough and their next move shows over their head in battle, while duller eyes see only 'unreadable.' Maxing one stat costs half the season, so who you become is a budget. An armorer on Market Row sells real steel and armor for real coin, the harbormaster's board finally names the goal — 150 copper for one berth south, 350 for two, and the difference between those numbers is the whole game. A calendar-event engine landed with the first pinned beat: at the end of your first day, news of the war reaches the Hearth. And the battle screen flipped — enemies at full size with health and intentions on display, the combat log tucked into a scrollable strip below.
Saltmere → - The pier meets the docks
The last of the lattice fixes, and the sneakiest: the harbor's entrance rows and its dock rows were drawn one column apart — two walkable islands that looked like one pier, so anyone arriving from Market Row could never actually reach the water. The pier is unified, and the movement validator learned the deeper lesson: it now proves every spot reachable from every entrance separately, because a scene split in two can pass a combined check while still stranding the player.
Saltmere → - The dummy fights back (for exactly 1 damage)
The sword school's training dummy is now a real fight and the game's combat sandbox: sparring costs no time, pays no coin, and the dummy — straw head, painted grin, its own battle sprite — thumps back for exactly one point of damage, so every move can be tested in perfect safety short of falling asleep against it. Victory earns you a grin that remains undefeated. Under the hood, encounters got per-fight victory lines, and two more scenes (the forest edge and the Marrow Cave approach) were redrawn onto the walking lattice from the playtest notes.
Saltmere → - Time behaves, battles get faces, and you get a bed
Three changes from the director's playtest. Time now moves only when you choose: talking is free, and the clock advances at deliberate boundaries — training, fighting, leaving the walls, or the new wait control, which at night becomes 'return & sleep.' No more losing your afternoon to a stray click. Combat gained a stage: a glyph-drawn rat (ears, hump, tail, an unfriendly eye) faces the big glowing @ and your companions' letters, and you pick targets by clicking the creature itself. And above the bar there's now a small room with a bed — an hour flat on your back mends about half; a whole night carries you to morning in your own bed instead of the common-room floor.
Saltmere → - Contracts and first steel
Saltmere's first quest is playable end to end. A contracts log opens on q and shows exactly what you signed — the posting, verbatim, nothing else: no objectives, no progress ticks, because figuring it out is the game. And your fists got honest: bare hands are weak now, and three people each hold a road to a first weapon — Kess's practice rack once she knows you, the mallet under Bram's bar once you've closed up with him, and a chalk-scored washer from Auren that holds exactly one spark at a time. Any of them makes the cellar a fair fight; none of them makes it safe. Also fixed from the playtest: the coast road walks south past the trees again, and the harbormaster's board stepped off the pier's walking line.
Saltmere → - The grid holds: one font for every glyph
Saltmere's scenes were shearing on some machines — system monospace fonts don't carry every glyph the art uses, and browsers silently substitute the missing ones from fonts with different widths, so rows drifted and clicks landed beside the things they aimed at. The game now ships its own terminal font, DejaVu Sans Mono, with verified coverage of all twenty-seven art glyphs in both weights. Every column is now the same width on every platform, the scene-fit math uses the font's exact metrics instead of estimates, and a design-doc rule records the lesson: the font is part of the art.
Saltmere → - Saltmere in hand: keyboard, pack, and map
The whole game now plays from the keyboard. People stopped being furniture — walking into someone steps politely through them, and Enter talks to whoever is beside you, so a stroll never spends a time slot by accident. Dialogue advances on Enter or Space, choices pick with the arrow keys. Two overlays join the top bar: the pack (i) with your copper and keepsakes, and a town map (m) drawn as a diagram where your location glows gold and places you haven't learned about simply aren't on it. The cellar also got a proper stair arrow back up to the bar, and scene scale barely shifts on the way down now.
Saltmere → - You are the @ now
Saltmere stops being a map you point at and becomes a place you stand in. An @ walks every scene — arrow keys or WASD — stepping dot to dot along the floor lattice, blocked by walls, tables, water, and sky. Doors, people, and the cellar's trouble are used by walking into them: bump the gate to leave town, bump Bram to talk, and you arrive in each scene beside the door you came through. Clicking still works everywhere. A new engine validator walks every scene itself and proves every hotspot reachable on foot — it caught fourteen doors drawn just off the floor lattice, and a gate that would have bounced arrivals straight back out of town.
Saltmere → - Saltmere gets headroom
All twelve scenes were drawn as wide flat strips — five to nine rows — and the renderer capped how large they could scale, so the world sat in a letterboxed band across the middle of the screen. Every scene is redrawn taller: smoke over the Hearth's fire and a deeper common room, masts and gulls above the harbor, rooflines over Market Row, a crenellated wall at the gates, two-story tenements in the back lanes, cliff strata stepping down into more sea. The scale cap is raised too, so scenes now fill the terminal instead of peering through a slot.
Saltmere → - One door into Saltmere
The project page and the RPG become one thing. The old one-evening game is retired from the site (its script left the RPG's canon when the expansion began; its engine still powers the dialogue underneath), and the project page is now Saltmere's front door: the cast in line-art portraits, the premise, and a single Start game button that drops you into the full-screen terminal. The project is renamed to match the game.
Saltmere → - Saltmere learns to fight, train, and pay
Layer 2 lands: five stats (Strength, Dexterity, Intelligence, Charm, and Poise — capped low by the trauma of the wipe until the story lifts it), training sessions that double as time spent with the person teaching you, and turn-based combat with damage variance, guard, talking-as-a-verb, and companions who fight by legible data policies — heal when hurt, else attack by a stated targeting rule, Pokémon school. The first contract is live: rats in the Copper Hearth's cellar, taken off the guild board, paid in copper. Losing costs a day and a wound, never the run. Nine new engine tests; 38 green.
Saltmere → - The cast gets real faces, and Saltmere takes the whole screen
Portraits are redrawn in the line-art school of classic ASCII portraiture — faces drawn in strokes on canvases twice the old size, hair as texture runs, six expressions each as swappable rows, muted palettes where only hair, materials, and blush carry color. The lesson recorded in the design doc: transposing shapes from another medium into glyphs is how faces die; art gets drawn in the medium it ships in. The Saltmere slice also now renders as a full-viewport terminal — entering the route is entering the game.
Saltmere → - Hearthside starts growing into an RPG
The dating sim is expanding into a full dating-sim RPG, built layer by layer against a design record in the repo. The first slice is the world frame: Saltmere, a frontier port of twelve glyph-drawn locations, a 24-day season spent in morning/afternoon/evening/night slots, cast members who keep daily schedules, and doors that only exist once dialogue teaches you they do. The dialogue engine is reused unchanged; a new tested world engine handles clock, travel, presence, and knowledge gates. Combat, stats, and the wider story settle next, decision by decision. The one-evening game stays live untouched.
Saltmere → - Hearthside goes full ASCII
The art direction commits to the Dwarf Fortress tradition: portraits are now hand-placed glyph grids (six expressions each, one color per glyph, spliced-in face rows), the hub shows a top-down glyph map of the common room where the cast are clickable letters, the hearth flickers in two frames, and item icons come from the same alphabet — % is food, as is right. All of it is data, editable as plain text in the workshop's new Art tab, and validated by its own test suite. No image assets — the images were generated by Claude in ASCII format, and most of it is left to the imagination.
Saltmere → - Hearthside grows a writers' room
An unlinked, in-browser authoring workshop now backs the game: every scene, node, line, choice, condition, item, and cast detail is editable as structured data, live-checked by the same validator the test suite runs, and playtestable on the spot with the real engine. Drafts live in localStorage and export as JSON — the published game only changes when a draft graduates through review and the full test suite.
Saltmere → - Hearthside opens its doors
A dialogue-heavy dating sim joins the hub: one evening in a guild tavern, three romanceable regulars, and six bells to spend across nine scenes — so attention is the actual mechanic. The dialogue tree is pure data (conditions, effects, affection, gift-gated choices) run by a tested engine, and every portrait is hand-authored SVG with six expressions: no image assets, no AI image generation. 14 engine tests green, including a graph walk over every reachable choice in the real script.
Saltmere → - Model Diff gains running totals and defined-name diffing
A new Running Total view replays the changes in sequence on an accumulating model — each step shows its delta and the cumulative output, so the steps sum exactly to the full move (interaction is absorbed into the path and the ordering is stated, not hidden). Changes to defined names (e.g. a repointed TaxRate) are now diffed and attributed too — previously they were invisible.
Model Diff → - Model Diff ships: semantic Excel comparison in the browser
The differ is live: drop two .xlsx versions and it lists what changed in meaning (assumptions, formulas, structure) and replays each edit alone onto the base model to show how much of the output move it explains — interaction effects reported as their own bar, never smoothed away. A dependency-free xlsx reader (own zip + XML parsing, shared-formula expansion) keeps everything client-side: the model never leaves the machine. 28 tests green.
Model Diff → - Model Diff started: spreadsheet engine built
The core of the semantic model differ is running: an Excel formula parser, dependency graph, and evaluator (40+ functions, honest handling of cycles and unsupported features) with override-based recomputation — the primitive that will power change attribution and sensitivity tornados. 13 engine tests green.
Model Diff → - Fire & EMS data joins the Atlas
Five million dispatched calls (2001–present) add two map layers — all fire/EMS calls and medical calls — plus block-level dots, profile call types, and relationship metrics, tracing the shift of street response from police toward EMS.
SF Civic Atlas → - Atlas gains a statistics panel
A Relationships explorer correlates any two metrics — across neighborhoods or as year-over-year changes — with Spearman rank tests, permutation p-values, and honest guards: rate metrics against size confounds, the SFPD reporting break and pandemic shock years excluded.
SF Civic Atlas → - Atlas drills down to street level
Opening a neighborhood now zooms in and renders block-level dots on the actual street grid — police incidents, 311 requests, or active businesses, still wired to the year slider — with hottest-blocks in the profile panel and shareable ?n= links.
SF Civic Atlas → - Atlas coverage evened out
Crime now runs 2003–present by bridging SFPD's two reporting systems, and tract-level ACS backfill extends population to 2010 — unlocking per-capita crime and 311 layers.
SF Civic Atlas → - SF Civic Atlas launched
An animated neighborhood choropleth over 11M rows of local SQLite: police incidents, 311 requests, business churn, and population, with per-neighborhood profiles and a year scrubber.
SF Civic Atlas → - Storefront Register integrated
The SF commercial-activity dashboard joins the hub: native headline stats and net-formation trend, with the full self-contained Register embedded beneath.
Storefront Register → - Site launched
The hub goes live: modular project registry, adaptive theming, dashboard, timeline, and the first embedded app.
- Scratchpad shipped
First embedded project — a local-first notes app living inside the site.