Skip to content
C.W.K.
Stream
← C.W.K. Quests
📰

Tidings Quest

New: 2026-08-31Updated: 2026-08-31

The world arrives unsorted — how you build a reader that stays honest about what it is doing to it

Five thousand five hundred and ninety-nine unresolved articles sounded like the problem. The measurement said otherwise: the union of every shelf a reader actually looks at was one hundred and eighty-four articles — two percent of the store — and seventy percent of the cards on screen carried no picture for a reason no backlog budget could ever have reached. That inversion happened over and over while this reader was built, and it is what this quest is about. Tidings fetches from declared sources, files them into shelves, records a reading life, ranks a personal feed from that record, samples the temperature of a social network, and hands the day's corpus to an assistant for a briefing. Every one of those verbs is a place where a system can quietly start lying — to its user, to its sources, or to itself.

8 tracks · 36 lessons · ~7h · difficulty: intermediate-to-advanced

Level 0Unsorted
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
A news reader is the most deceptively simple thing you can build. Fetch some feeds, show some cards. Then it meets the actual world: sources that answer with a redirect shell instead of an article, one story arriving seven times under seven different URLs, a ranking function that learns to love the word 'is', a scheduled job that quietly spends money, and a corpus of third-party text flowing straight into a language model's context. This quest walks the design of one such reader through the measurements that shaped it — because in almost every round, the intuition about what was wrong turned out to be wrong, and only the number settled it. You will start where the data enters: why a source is a row rather than a code path, what makes a client polite instead of merely functional, why the original link is the primary act and reader mode is only a convenience, and how a source that is identified by its name instead of its configuration silently binds to the wrong feed while reporting success. Then the spine of the whole design: an append-only log of what the reader did, and every shelf, score, and statistic as a projection over it — plus the day a foreign key quietly turned a promise about permanence into a lie, and how it was proved before it was fixed. From there into ranking you are allowed to read: affinity with a half-life, a profile the user can see and correct, and the discovery that a token appearing in most of the pool cannot discriminate whatever language it is in. Then the hard one — measuring the screen instead of the store, where fair-shares round-robin fixed one shelf and broke another, and a guard that watched the page size instead of the visible screen passed every test while changing nothing a person could see. The last three tracks are about restraint: giving a corpus a budget so it cannot starve the very instruction it was assembled for, spending metered tokens only when someone actually asks, and treating everything that arrives from outside — an article body, a social post, a search result — as untrusted input rather than as instructions. It closes on failing in the open: the difference between a permanent failure and a transient one, why a paywall retried is a paywall twice, what happens when a write lock is held across a network call, and why the pages of a projection can never be disjoint. Conceptual open-sourcing: the architecture is the deliverable, not a repository you clone.

Tracks

  1. 01🗞️Declared, Not Discovered

    0/4 lessons

    Everything enters through a row you wrote down — and leaves pointing back at where it came from

    An aggregator's first design decision is how the outside world gets in, and it is the one that determines whether the thing you build is a reader or a scraper. This track takes the strict answer: every article enters through an explicitly declared source row, adding a source is data rather than code, and nothing anywhere in a render path reaches out to the network. From that one constraint the rest follows — a fetch loop that is polite by construction rather than by good intentions, an identity for each article that survives the tracking parameters bolted onto it, and a link out that stays the primary act no matter how good your reader mode gets. The track closes on a subtle failure that only shows up at scale: a source identified by the name a human gave it, rather than by the configuration that actually determines what it fetches, will happily bind to the wrong feed and report success.

    Tidings on a desktop: a row of topic tabs ending in Archived and Analyze, a brief that sets what X is hot about beside what the news corpus actually carries and names each divergence region by region, then the three articles chosen to be read today with a line on why each one earns the click, and a footer counting the articles, shelves, extracts and samples the brief was built from — with a Pippa Sidekick panel docked on the right, mid-argument about the same day's market.
    Every line traces back to a row that was written down — the corpus count at the foot is the receipt.
    Lesson list (4)Quiz · 4 questions
  2. 02🧾The Log Is the Truth

    0/5 lessons

    One append-only record of what happened, and everything else an opinion about it

    Ask where the truth lives in a reading app and the honest answer is uncomfortable: not in the article table, which is a rebuildable working set, and not in any shelf, which is a query result with a name. The truth is the sequence of things a person did — opened, liked, disliked, saved, shared, queued — recorded once, in order, and never edited. This track builds that spine and then follows its consequences: what it means for every shelf, score, and statistic to be a projection you can throw away and recompute, which parts of the store are permanent and which are compost, and why the permanence guarantee has to be enforced by structure rather than by care. It ends with two failures that only a spine makes visible — a foreign key that quietly turned a promise into a lie, and a shelf that skipped the one function every article row was supposed to leave through.

    Lesson list (5)Quiz · 4 questions
  3. 03🔎Ranking You Can Read

    0/5 lessons

    A score is a sum of named contributions, or it is a black box with good manners

    A personalized shelf is the point where a reader stops being a list and starts having opinions, and it is the easiest place in the whole system to become dishonest. This track builds ranking under one constraint: every score must decompose into named contributions the reader can be shown, and every card must be able to say why it is there. From that constraint the design writes itself — affinity weights per kind of act, a half-life so old enthusiasm fades instead of calcifying, a freshness term, and a hard cap on how many keyword matches one article may bank. Then the two corrections that live use forced, both of which are really the same discovery in different clothes: a signal that appears everywhere cannot discriminate anything, and inference cannot carry a category that shares no vocabulary with itself. The track ends on the reason to show the profile at all — not transparency as a virtue, but as the fastest debugger you will ever build.

    Lesson list (5)Quiz · 4 questions
  4. 04📐Measure the Screen, Not the Store

    0/5 lessons

    Five thousand five hundred and ninety-nine sounded like the problem; one hundred and eighty-four was the problem

    This is the track where intuition loses four times in a row, and it is the reason this quest exists in the shape it does. The reader had a visible complaint — most cards had no picture — and a visible backlog of thousands of unenriched articles. Every instinct connected the two, and every instinct was wrong. Measuring first turned the question inside out: the backlog was irrelevant because almost none of it is ever seen, the enrichment everyone assumed would help could not possibly work on the articles that needed it, and the pictures the shelf was missing already existed in feeds it was already fetching. The fixes that followed cost zero additional network requests. The track closes on the two wrong turns worth keeping — a fair-shares rewrite that fixed one shelf and broke another, and a guard that passed every test while changing nothing a person could see.

    The same Tidings brief on a phone: the topic tabs scrolled along to Archived and Analyze, the day's three articles each carrying a line about why it is worth the click, a bonus item at the foot, and under it the article, shelf, extract and sample counts — the whole reading surface in a single column.
    The store can hold thousands; what gets measured is what actually reached the screen.
    Lesson list (5)Quiz · 4 questions
  5. 05⚖️A Corpus Has a Budget

    0/4 lessons

    Assembling context is an allocation problem, and truncation is the allocation nobody chose

    Handing a day's news to a language model looks like string concatenation and is really budgeting under a hard constraint. This track works through what happens when you get it wrong in the most natural way — append the sections in the order you thought of them, then cut whatever overflows — and why that failure is so hard to see: the output stays plausible, and the statistics keep reporting the material that was silently dropped. The repair is to reserve the small irreplaceable sections first and let the bulky ones fill what remains, round-robin, so breadth degrades gracefully instead of the tail vanishing. Along the way, two related lessons: how to get continuity into a corpus without paying for a second generation, and why the same story arriving seven times is a rendering problem rather than an ingest one.

    Lesson list (4)Quiz · 4 questions
  6. 06👆Spend Only When Asked

    0/5 lessons

    One standing exception, named out loud, and every other token traceable to a deliberate tap

    The moment a reader can call a language model, it acquires the ability to spend money in the background, continuously, on material nobody will read. This track is about the discipline that prevents it — not a budget alarm bolted on afterwards, but a rule that shapes the architecture: metered work happens when a person asks for it, with exactly one scheduled exception that is named in the invariants rather than discovered in a bill. From there the design follows: a client surface that borrows an assistant instead of growing its own, a queue whose every item is a tap, caches that make a second request free, and a personality flag that is opt-in per call because the mechanical passes should stay mechanical. The track closes on the lane split — two kinds of generated text that deserve different cost dials, and why splitting a setting must fork the live value rather than the factory default.

    Lesson list (5)Quiz · 4 questions
  7. 07🛡️The World Is Untrusted Input

    0/4 lessons

    Everything that arrives from outside is data — never instructions, never a tool call you did not intend

    A reader whose whole purpose is ingesting text written by strangers, and then handing that text to a language model, has an obvious problem and a set of non-obvious ones. This track is about both. It starts with a security control that silently did nothing — an allowlist that named the tools it wanted and left them unwired, so the run looked locked down and was not — and the denylist that replaced it, mandatory the moment an automated agent handles content from the open internet. Then the environmental leak nobody thinks about: an agent invoked from your service inherits your working directory and will happily read whatever is sitting there. It closes on the mechanical gate that verifies the answer came from where it was supposed to, and the instruction clause that has to accompany any corpus of third-party text.

    Lesson list (4)Quiz · 4 questions
  8. 08🩹Failing in the Open

    0/4 lessons

    Permanent and transient are different diagnoses, and a wrong one costs the reader real articles

    Everything in a reader talks to something it does not control, so failure is not an edge case — it is the steady state, and the only question is whether the system is honest about it. This track works through four failures that were all handled plausibly and all wrong. A taxonomy that could not distinguish a paywall from a hiccup, and the retry policy that follows from getting it right. A permanent-failure stamp that blamed the wrong layer entirely and cost real reading. A database write lock held across a network call, producing errors the client swallowed. And a pagination scheme that cannot be correct when the pages come from a projection — where the honest answer is to stop pretending they are disjoint. It closes on the smallest and most uncomfortable one: a paragraph of documentation that claimed a capability for nine rounds, and what it means to correct it rather than quietly build it.

    Lesson list (4)Quiz · 4 questions
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.