<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sonia Bobrik</title>
    <description>The latest articles on DEV Community by Sonia Bobrik (@sonia_bobrik_1939cdddd79d).</description>
    <link>https://dev.to/sonia_bobrik_1939cdddd79d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3423281%2Fb9547be6-14b6-48f6-8a94-9de77fde6ca0.jpg</url>
      <title>DEV Community: Sonia Bobrik</title>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sonia_bobrik_1939cdddd79d"/>
    <language>en</language>
    <item>
      <title>Your Scoring System Is Also a Training Set for the People You Score</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 01:11:30 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/your-scoring-system-is-also-a-training-set-for-the-people-you-score-1ein</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/your-scoring-system-is-also-a-training-set-for-the-people-you-score-1ein</guid>
      <description>&lt;p&gt;Every system that assigns a number to human output eventually teaches people how to produce that number. This is not cynicism about human nature, it is a measurable property of deployed software, and the finance industry has been running the longest and best-documented version of the experiment. The story of &lt;a href="https://flixbaba.org/the-quiet-arms-race-inside/" rel="noopener noreferrer"&gt;how executives quietly rewrote their vocabulary once algorithms started grading earnings calls&lt;/a&gt; is worth reading as an engineering postmortem rather than a market curiosity, because the failure mode it describes — a model that works beautifully until its subjects learn the rules — shows up in code review bots, abuse classifiers, fraud scores, and LLM evaluation harnesses with the exact same shape. If you ship anything that scores text, you are already inside this loop. The only question is whether you have instrumented it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dictionary That Stopped Working Once It Was Public
&lt;/h2&gt;

&lt;p&gt;The origin story is a measurement bug. Early attempts to score financial documents borrowed general-purpose psychology word lists, which counted words like &lt;strong&gt;liability&lt;/strong&gt;, &lt;strong&gt;cost&lt;/strong&gt;, and &lt;strong&gt;tax&lt;/strong&gt; as negative. In a bank's annual report those are neutral bookkeeping vocabulary, so the scores were noise dressed up as signal. In 2011, Tim Loughran and Bill McDonald published a domain-specific negative word list that fixed the mislabeling, and the corrected tone measure predicted future earnings and stock returns. A working signal, cleanly validated.&lt;/p&gt;

&lt;p&gt;Then the list was published. Within a few years, companies whose filings attracted heavy automated download traffic began stripping out precisely the tokens on that list. Not negative language in general. The specific vocabulary the dominant scorer penalized.&lt;/p&gt;

&lt;p&gt;There is a rule in here that every engineer should internalize: &lt;strong&gt;a published rubric is a published exploit&lt;/strong&gt;. The moment you document your linting heuristics, your spam features, your ranking factors, or your code-review checklist, you have handed the measured population a spec. They will build to it, usually without any intent to deceive, because building to the spec is what conscientious people do when a spec exists and consequences attach to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bigger Models Raise the Price of Gaming, They Do Not End It
&lt;/h2&gt;

&lt;p&gt;The standard response is to swap the lexicon for something that reads meaning instead of counting tokens. That works, for a while. When &lt;a href="https://arxiv.org/abs/1810.04805" rel="noopener noreferrer"&gt;the BERT architecture was released in 2018&lt;/a&gt;, contextual embeddings made simple word substitution insufficient, because the model could tell the difference between a hedge and a synonym. The finance research found a second, measurable behavioral shift right after that release. Sophistication moved the equilibrium. It did not remove it.&lt;/p&gt;

&lt;p&gt;The useful mental model is a &lt;strong&gt;cost curve&lt;/strong&gt;, not immunity. Every upgrade to your scorer raises the effort required to satisfy it without genuinely changing the underlying thing you care about. Sometimes that effort is so high that gaming and honest improvement converge, which is the ideal outcome. Often it just filters out the unsophisticated and rewards whoever can afford better tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Machines Are Now a Large Share of Your Readers
&lt;/h2&gt;

&lt;p&gt;This is no longer a finance-only phenomenon, because the audience composition of the open web has changed. Cloudflare's breakdown of &lt;a href="https://blog.cloudflare.com/from-googlebot-to-gptbot-whos-crawling-your-site-in-2025/" rel="noopener noreferrer"&gt;who is actually crawling websites&lt;/a&gt; found GPTBot's share of crawler traffic climbing from 2.2% to 7.7% in a single year, a 305% jump in raw requests, while several traditional indexers stayed flat. Your API docs, your changelogs, your error messages, and your incident write-ups are being parsed by systems that will summarize them for humans who never load your page.&lt;/p&gt;

&lt;p&gt;That changes what "writing for your users" means. Documentation that is technically accurate but structurally hostile to parsing gets summarized badly. Documentation optimized purely for extraction gets thin and repetitive. Both failure modes are real, and the second one is the earnings-call trap arriving in your repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six Practices That Keep a Scorer Honest
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Score residuals, not levels.&lt;/strong&gt; What predicts anything is deviation from what the subject's circumstances already explain. Levels are easy to shift; residuals are expensive to fake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a private holdout rubric.&lt;/strong&gt; Publish the criteria that describe genuine quality, retain a scoring variant nobody outside the team has seen, and use divergence between the two as your alarm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor feature distributions, not just accuracy.&lt;/strong&gt; Accuracy on stale labels stays flat while the input distribution rots underneath it. Track the mean and variance of every feature your model weights heavily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrument the unscripted channel.&lt;/strong&gt; In earnings calls, prepared remarks got sanitized while the analyst Q&amp;amp;A stayed comparatively honest. Every system has an equivalent: freeform commit messages, on-call chatter, support transcripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat each scorer release as an intervention.&lt;/strong&gt; Version the model, timestamp the deploy, and check for behavioral breaks afterward. You are not just observing a population, you are perturbing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget for relabeling from day one.&lt;/strong&gt; A scoring model has a half-life. Pretending otherwise means you will discover the decay through a business incident instead of a dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instrument the Exposure Split
&lt;/h2&gt;

&lt;p&gt;The single sharpest technique from the finance literature is a natural experiment: compare subjects heavily exposed to machine scrutiny against subjects barely exposed at all. If both cohorts drift together, that is real change in the world. If only the exposed cohort drifts, and it drifts specifically on the features your scorer rewards, you are watching adaptation.&lt;/p&gt;

&lt;p&gt;That translates into maybe forty lines of production code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;adaptation_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;feature_cols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exposure_col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period_col&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Divergence in feature TRENDS between high- and low-exposure cohorts.
    Large positive values = the scored population is moving on the
    exact dimensions your model rewards. That&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the alarm.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;hi_cut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;exposure_col&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lo_cut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;exposure_col&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;exposure_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;hi_cut&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;low&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;exposure_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;lo_cut&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;feature_cols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;h_trend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period_col&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;l_trend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period_col&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h_trend&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;l_trend&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it weekly against whatever your system scores. Alert on the top features by absolute divergence. It will not tell you why the gap opened, but it will tell you where to look, which is more than most teams have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost That Never Reaches the Dashboard
&lt;/h2&gt;

&lt;p&gt;There is a second-order effect worth naming, because it is the part that damages products rather than models. Text optimized against a parser is text drained of information. When every quarterly update, every postmortem, and every release note is written in the same carefully neutral register, the artifacts get longer, smoother, and less useful to the humans they were originally written for. The information does not vanish. It migrates into residuals, tone, timing, and the things people say when they forget the transcript exists — signals that only well-equipped observers can extract. Everyone else reads polished prose and learns nothing.&lt;/p&gt;

&lt;p&gt;That is the real bill. Not a degraded AUC on some internal benchmark, but an organization that has slowly optimized its own writing into noise while its dashboards report improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Like Your Scorer Will Be Read
&lt;/h2&gt;

&lt;p&gt;Assume your criteria will leak. Assume the population you measure is intelligent, motivated, and reading carefully. Design so that the cheapest path to a high score is the path you actually wanted, keep a private check on the gap between measured and genuine quality, and set a review date for every model the moment you deploy it. The teams that get burned are not the ones whose metrics get gamed. Every metric gets gamed. They are the ones who never built the instrument that would have shown it happening.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your Vulnerability Gate Is Quietly Failing Open</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 01:11:06 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/your-vulnerability-gate-is-quietly-failing-open-31c6</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/your-vulnerability-gate-is-quietly-failing-open-31c6</guid>
      <description>&lt;p&gt;Somewhere in your repository there is a line of configuration nobody has read in two years — a &lt;code&gt;--severity HIGH,CRITICAL&lt;/code&gt; flag, a Dependabot threshold, a policy file that blocks a merge when a transitive dependency crosses CVSS 7.0. That line encodes an assumption about the outside world that stopped being reliably true in April 2026, and the backstory matters before you touch it: the shared naming system your entire toolchain gates on came within hours of going dark, as &lt;a href="https://www.portotheme.com/the-world-nearly-lost-its-only-shared-catalog-of-software-flaws/" rel="noopener noreferrer"&gt;this reconstruction of how the world nearly lost its only shared catalog of software flaws&lt;/a&gt; documents in uncomfortable detail, and while the identifiers themselves survived the funding scare, the free enrichment layer that made those identifiers machine-actionable did not survive intact. The CVE ID is still there. The severity score bolted onto it increasingly is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Number You Gate On Has an Owner
&lt;/h2&gt;

&lt;p&gt;Almost every developer-facing scanner — Trivy, Grype, npm audit, Snyk's free tier, your registry's built-in checker — resolves a CVE ID into a severity by asking someone else. Historically that someone was the National Vulnerability Database, which took the raw record a CVE Numbering Authority published and added the parts machines need: a CVSS vector, a CWE classification, and CPE strings describing which product versions are actually affected.&lt;/p&gt;

&lt;p&gt;That arrangement broke under arithmetic. NIST spelled it out plainly when it announced the new prioritisation model: CVE submissions grew &lt;strong&gt;263% between 2020 and 2025&lt;/strong&gt;, and the analysis capacity behind the database never grew to match. The fix was triage rather than expansion. Every unenriched record published before &lt;strong&gt;March 1, 2026&lt;/strong&gt; was moved into a status called &lt;em&gt;Not Scheduled&lt;/em&gt; — roughly 29,000 of them by most counts — and going forward only vulnerabilities that intersect a narrow set of criteria get full treatment. &lt;a href="https://www.nist.gov/news-events/news/2026/04/nist-updates-nvd-operations-address-record-cve-growth" rel="noopener noreferrer"&gt;NIST published the new criteria in its own operations notice&lt;/a&gt;, and the shape of them is worth internalising: known exploitation, software the US federal government runs, and critical software as defined by Executive Order 14028. Independent estimates put the share of incoming CVEs that will clear that bar at somewhere between 15% and 20%.&lt;/p&gt;

&lt;p&gt;The volume side of the equation is not slowing down either. The CVE program published &lt;strong&gt;48,185&lt;/strong&gt; records in 2025, up 20.6% on the 40,009 published in 2024, with 484 numbering authorities feeding the pipeline as of January 2026 and first-quarter 2026 submissions running roughly a third ahead of the year before. FIRST forecast another record year. Whatever your scanner does with an unenriched record, it is going to be doing it a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fail Open, Fail Closed, or Fail Silently
&lt;/h2&gt;

&lt;p&gt;Here is the concrete failure mode. A CVE lands with no NVD-supplied CVSS vector. Your scanner asks for a severity and gets nothing back. What happens next depends entirely on implementation details you almost certainly never audited.&lt;/p&gt;

&lt;p&gt;Some tools fall back to a severity supplied by the CNA at publication time, which is often present and often disagrees with what NVD would have assigned. Some fall back to an ecosystem source like the GitHub Advisory Database, which curates its own severities and covers open-source packages well but hardware and enterprise appliances poorly. Some simply emit &lt;code&gt;UNKNOWN&lt;/code&gt;. And a gate configured as "block if severity is HIGH or CRITICAL" treats &lt;code&gt;UNKNOWN&lt;/code&gt; as &lt;em&gt;not high&lt;/em&gt; — which means the build goes green and the merge lands. That is failing open, and it is failing open silently, which is the worst variant because nothing in your logs looks wrong.&lt;/p&gt;

&lt;p&gt;The inverse configuration is not better. Teams that flip to "block on anything unresolved" discover their pipeline red-lining on hundreds of records with no context attached, and within about two sprints somebody adds a blanket ignore rule that never gets removed. Alert fatigue is not a personality flaw; it is the predictable output of a gate that cannot distinguish signal from absence of data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rewire Around Exploitation, Not Around Severity
&lt;/h2&gt;

&lt;p&gt;The useful correction is not finding a replacement severity feed. It is admitting that a static base score was always a weak proxy for "should this block my release," and replacing it with signals that answer the question directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Make known exploitation a hard gate.&lt;/strong&gt; &lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog" rel="noopener noreferrer"&gt;CISA's Known Exploited Vulnerabilities catalog&lt;/a&gt; lists flaws with confirmed in-the-wild abuse, ships as CSV and JSON, and was reaffirmed as the anchor for federal patching timelines under Binding Operational Directive 26-04 in June 2026. It is small, it is free, and a hit on it justifies waking someone up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add EPSS as a soft gate.&lt;/strong&gt; The Exploit Prediction Scoring System publishes daily probabilities that a given CVE will be exploited in the next 30 days. FIRST's own analysis puts the share of published vulnerabilities ever exploited at roughly 2–7%, so an EPSS threshold cuts triage volume by an order of magnitude without discarding much real risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat missing severity as its own state.&lt;/strong&gt; &lt;code&gt;UNKNOWN&lt;/code&gt; is not zero and it is not critical. Route it to a review queue with a service-level target rather than letting a boolean comparison decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer package-level data for package-level problems.&lt;/strong&gt; OSV records express affected &lt;em&gt;version ranges&lt;/em&gt; per ecosystem, which is the question a lockfile actually poses. CPE strings were designed for enterprise asset inventories and map onto &lt;code&gt;package.json&lt;/code&gt; badly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record which source produced each verdict.&lt;/strong&gt; When a build fails, the log should say whether the score came from a CNA, from NVD, from an ecosystem advisory, or from a fallback default. Without that, you cannot debug the gate at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fragmentation Is Now Your Problem Too
&lt;/h2&gt;

&lt;p&gt;The redundancy built after the 2025 scare is genuine progress and it also generates work. ENISA's European Union Vulnerability Database went live in May 2025 and assigns its own EUVD identifiers on top of CVE IDs, built on CSAF and driven partly by Cyber Resilience Act obligations. CIRCL's Global CVE system opened to the public in January 2026 with a federated model where numbering authorities issue identifiers without waiting on central approval. CISA's Vulnrichment effort distributes enrichment across authorised data publishers. GitHub keeps its GHSA namespace.&lt;/p&gt;

&lt;p&gt;None of these replace CVE. All of them mean the same defect can now appear in four catalogs, at four different times, carrying four different severity judgements and four different claims about which versions are affected. If your tooling ingests more than one source — and increasingly it will, whether or not you chose that — you need a canonical identifier map and an explicit precedence rule for conflicts. Otherwise you get duplicate findings, contradictory dashboards, and engineers who learn to distrust the scanner entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Changed
&lt;/h2&gt;

&lt;p&gt;For twenty-five years, vulnerability triage was something a developer could outsource to a public good. A free service turned an identifier into a decision, and CI configs were written on the quiet assumption that the service would always be there and always be complete. Both halves of that assumption are now formally retired — not by a catastrophe, but by a published policy change from the organisation that maintained it, arrived at honestly because the volume made anything else impossible.&lt;/p&gt;

&lt;p&gt;The catalog survived. The convenience did not. Prioritisation has moved from an external dependency back into your codebase, where it now belongs. Open the policy file, check what it does when the score is missing, and fix that first.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your Delivery Pipeline Has a Cash Conversion Cycle, and Nobody Is Instrumenting It</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 01:10:41 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/your-delivery-pipeline-has-a-cash-conversion-cycle-and-nobody-is-instrumenting-it-3mm9</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/your-delivery-pipeline-has-a-cash-conversion-cycle-and-nobody-is-instrumenting-it-3mm9</guid>
      <description>&lt;p&gt;Every engineering team I've talked to can recite how long their test suite takes. Almost none can tell me how long a finished change sits untouched before a human looks at it. That asymmetry is expensive, and the finance world already built the vocabulary we're missing: an argument about &lt;a href="https://ccn.dynamics365portals.us/forums/general-discussion/73d4e008-4b1d-f111-bb46-001dd8116055" rel="noopener noreferrer"&gt;the real price of waiting in modern business&lt;/a&gt; frames delay as a balance-sheet exposure rather than a scheduling annoyance, and that reframe transfers almost perfectly to software delivery. Cash trapped in receivables and code trapped in review queues are the same category of problem. Both look harmless on any single day. Both quietly determine what your organization can survive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Metric You Almost Certainly Don't Have
&lt;/h2&gt;

&lt;p&gt;There's a number from lean manufacturing called &lt;strong&gt;flow efficiency&lt;/strong&gt;: the percentage of total elapsed time that anyone was actually working on the thing. Touch time divided by wall-clock time.&lt;/p&gt;

&lt;p&gt;Run it on your last ten pull requests. A typical result looks like this: the author spent 40 minutes writing the change, the reviewer spent 12 minutes reading it, CI burned 9 minutes of compute. That's about an hour of real work. The PR was open for three and a half days.&lt;/p&gt;

&lt;p&gt;Flow efficiency: roughly &lt;strong&gt;1.5%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I have never seen a team guess this number correctly before measuring it. Engineers consistently estimate 40–60%. Reality in most organizations lands somewhere between 5% and 15%, and anything above 25% is genuinely unusual. The reason the intuition fails is that we experience our own work as continuous — from the inside, you were busy the whole time. But you were busy on &lt;em&gt;other&lt;/em&gt; tickets while this one sat in a queue. The work item's experience of the week was almost entirely waiting.&lt;/p&gt;

&lt;p&gt;This matters because we optimize what we can see. Build time is visible, gets dashboards, gets a dedicated performance sprint. Queue time is invisible, distributed across calendars, and owned by nobody. So teams spend six weeks shaving four minutes off a build that contributes 2% of lead time, while a two-day review wait contributing 60% goes unexamined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Little's Law Does Not Care About Your Roadmap
&lt;/h2&gt;

&lt;p&gt;The math here is uncooperative in a useful way. Little's Law says:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cycle Time = Work in Progress ÷ Throughput&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read that again with hiring in mind. If throughput is roughly fixed in the short term — and it is, because onboarding takes months — then the only lever that moves cycle time this quarter is reducing WIP. Not working harder. Not "prioritizing better." Carrying fewer things simultaneously.&lt;/p&gt;

&lt;p&gt;Queueing theory makes it worse, or better, depending on temperament. Kingman's formula tells us wait time scales with &lt;strong&gt;ρ / (1 − ρ)&lt;/strong&gt;, where ρ is utilization. Plug in numbers:&lt;/p&gt;

&lt;p&gt;At 50% utilization, the wait factor is 1. At 80%, it's 4. At 90%, it's 9. At 95%, it's 19.&lt;/p&gt;

&lt;p&gt;That's not linear degradation, it's a wall. A team booked to 95% capacity doesn't deliver 15% more than a team at 80% — it delivers &lt;em&gt;dramatically slower&lt;/em&gt; because every arriving item queues behind a system with no slack to absorb variance. Every manager who has ever proudly reported "the team is fully utilized" has announced a latency problem in the language of an achievement.&lt;/p&gt;

&lt;p&gt;This is the single most counterintuitive thing in delivery performance, and it's why "just add more parallel work" reliably makes things slower.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed Is a Financial Signal, Not a Vanity Metric
&lt;/h2&gt;

&lt;p&gt;The pushback is predictable: shipping fast is an engineering preference, not a business outcome. The research disagrees, and it's been disagreeing for a decade. Google's DevOps Research and Assessment program has spent years correlating delivery behavior with organizational results, and their work on &lt;a href="https://dora.dev/guides/dora-metrics-four-keys/" rel="noopener noreferrer"&gt;the metrics that actually predict delivery performance&lt;/a&gt; found that change lead time and deployment frequency track with commercial and operational outcomes — not just developer happiness. The gap between elite and low performers isn't a rounding error; low performers measure lead time in months while elite teams measure it in hours.&lt;/p&gt;

&lt;p&gt;The mechanism is straightforward once you stop thinking about it as speed and start thinking about it as &lt;strong&gt;exposure&lt;/strong&gt;. Long lead times mean large batches. Large batches mean risky deploys. Risky deploys mean more process, which means longer lead times. The loop tightens on itself. Meanwhile every unreleased feature is capital you've already spent that hasn't returned anything, and every hour a bug sits unfixed is reputational damage accruing interest.&lt;/p&gt;

&lt;p&gt;A team with a two-hour lead time can respond to a security disclosure, a competitor launch, or a broken checkout flow on the same day. A team with a six-week lead time cannot, regardless of how talented its engineers are. The talent is real; it's just stuck in a queue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Latency Reshapes Human Behavior Before It Reshapes Metrics
&lt;/h2&gt;

&lt;p&gt;Jakob Nielsen's classic thresholds on &lt;a href="https://www.nngroup.com/articles/response-times-3-important-limits/" rel="noopener noreferrer"&gt;how long users tolerate a system's response&lt;/a&gt; identify three limits: 0.1 seconds feels instantaneous, 1 second preserves an uninterrupted train of thought, and 10 seconds is roughly the ceiling on sustained attention before people go do something else.&lt;/p&gt;

&lt;p&gt;Scale those up by four orders of magnitude and you have a startlingly good model of engineering organizations. Ten minutes to CI feedback and developers stay in the change. Ten hours and they've moved on, so returning requires rebuilding context that was free ten hours ago. Ten days and the original author has genuinely forgotten the reasoning, which means the review is now archaeology.&lt;/p&gt;

&lt;p&gt;Long feedback loops don't just delay work. They change what people build. When merging is slow, engineers batch changes to amortize the pain, which produces larger diffs, which get worse reviews, which produce more defects. When environments are scarce, people test less and hope more. &lt;strong&gt;The latency creates the behavior, and then we blame the behavior.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Waiting Actually Hides
&lt;/h2&gt;

&lt;p&gt;Before optimizing anything, find the queue. In practice it's almost always one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Review latency&lt;/strong&gt; — time from "PR opened" to "first human comment," usually the single largest block in the whole cycle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment scarcity&lt;/strong&gt; — one shared staging box, booked out days ahead, functioning as a de facto global lock on the org&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval ritual&lt;/strong&gt; — change boards and sign-offs that add days of calendar time and, per the DORA research, no measurable stability benefit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-team handoffs&lt;/strong&gt; — every boundary crossing introduces a fresh queue with its own priorities and its own idea of urgency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flake-driven re-runs&lt;/strong&gt; — a 7% flake rate on a 20-minute pipeline turns "merge it" into a lottery with a multi-hour expected wait&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Experiment Worth Running This Week
&lt;/h2&gt;

&lt;p&gt;Don't buy a platform. Pull timestamps from your git host: commit authored, PR opened, first review, approval, merge, deploy. Compute the gaps. Plot the distribution rather than the mean, because the mean will lie to you and the p85 is where the pain lives.&lt;/p&gt;

&lt;p&gt;Then resist the urge to fix the biggest technical number. Fix the biggest &lt;em&gt;waiting&lt;/em&gt; number. Usually that means a review SLA measured in hours, a WIP limit that people actually respect, or ephemeral environments that end the staging queue permanently.&lt;/p&gt;

&lt;p&gt;Speed isn't about typing faster or heroics. It's about deleting the periods when nothing is happening — and once you can see those periods, they turn out to be most of the calendar.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What Over-Promising Really Costs an Engineering Team</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 01:10:05 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/what-over-promising-really-costs-an-engineering-team-23n4</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/what-over-promising-really-costs-an-engineering-team-23n4</guid>
      <description>&lt;p&gt;Every engineering organization runs two systems in parallel: the software it ships and the story it tells about that software. When those two drift apart, the gap never stays in the marketing department. It lands in your sprint, your on-call rotation and your backlog. A blunt financial autopsy of &lt;a href="https://www.prlog.org/13147612-the-credibility-tax-why-the-loudest-technology-companies-of-2026-are-quietly-going-broke.html" rel="noopener noreferrer"&gt;the credibility tax now quietly bankrupting the loudest technology companies of 2026&lt;/a&gt; makes that case from the balance-sheet side, and the engineering side of the same ledger is older, better instrumented and far more uncomfortable: any claim you cannot demonstrate on demand becomes work somebody performs later, under pressure, usually at 3 a.m.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adoption Stopped Meaning Belief
&lt;/h2&gt;

&lt;p&gt;For most of software history, usage and trust moved together. You adopted a database, learned its failure modes, and grew more confident as familiarity accumulated. That relationship has broken. Stack Overflow's survey data shows more than 84% of developers using or planning to use AI tooling while only 29% say they trust the accuracy of what comes out, an eleven-point collapse in a single year. Stack Overflow's own &lt;a href="https://stackoverflow.blog/2026/02/18/closing-the-developer-ai-trust-gap/" rel="noopener noreferrer"&gt;examination of why the developer trust gap keeps widening&lt;/a&gt; frames the anomaly precisely: people are using a tool constantly and believing it less each month.&lt;/p&gt;

&lt;p&gt;That divergence is the credibility tax rendered as a chart. Developers did not abandon the tools, because the tools genuinely help. They simply moved the cost somewhere the vendor's dashboard cannot see, into review time, extra tests, defensive scaffolding and the private habit of reading every generated line twice. The most cited frustration in that same survey was output that is almost right but not quite, which is exactly the failure shape that maximizes verification cost while minimizing the chance you throw the tool away.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tax Has a Metric, and It Is Stability
&lt;/h2&gt;

&lt;p&gt;If you want to know whether your organization is paying, stop asking how people feel and look at your change failure rate. Google Cloud's DORA program surveyed roughly five thousand technology professionals and found something the industry has been slow to internalize: &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report" rel="noopener noreferrer"&gt;AI adoption now correlates with higher throughput while still correlating with worse delivery stability&lt;/a&gt;. Speed improved. Safety did not follow it.&lt;/p&gt;

&lt;p&gt;The report's central metaphor is worth stealing for internal arguments. AI is an amplifier. It does not manufacture engineering excellence; it multiplies whatever discipline already exists. A team with fast feedback loops, loosely coupled services and real test coverage converts generated code into shipped value. A team with a 2007 monolith, flaky integration suites and review-as-formality converts the same generated code into incidents. Both teams announce the same productivity number at the all-hands. Only one of them will still believe it in six months.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Perception Gap Is Not a Character Flaw
&lt;/h2&gt;

&lt;p&gt;The most useful study on this remains METR's randomized trial, where sixteen experienced open-source maintainers worked 246 real issues from their own repositories. Allowed to use AI, they completed tasks 19% slower. Asked afterward, they reported feeling roughly 20% faster. A thirty-nine point gap between the clock and the feeling, among expert engineers, on codebases they knew intimately.&lt;/p&gt;

&lt;p&gt;Then something more instructive happened. In early 2026 METR published a revision, explaining that developers who benefit most from AI tended to decline participation in no-AI conditions, that the selection effect undermined the original estimate, and that newer measurements point toward modest speedup. They downgraded their own headline finding in public.&lt;/p&gt;

&lt;p&gt;That is what credibility looks like as an engineering practice rather than a virtue. The organizations that survive a hype cycle are not the ones that were right early; they are the ones whose corrections arrive faster than their critics. Every retraction you publish yourself costs a fraction of what the same retraction costs when a customer discovers it in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn Every Public Claim Into an Executable Assertion
&lt;/h2&gt;

&lt;p&gt;The practical fix is unglamorous and works: treat marketing claims as untested code and refuse to ship them without coverage. Keep a claims ledger, a single file in the repository that every public promise must pass through.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bind each claim to a test.&lt;/strong&gt; "Zero-downtime upgrades" becomes a CI job that upgrades a seeded cluster under synthetic load and fails the build if a single request drops. If the claim cannot be expressed as an assertion, it is a wish, and wishes belong in the roadmap document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish the harness, not the headline.&lt;/strong&gt; A benchmark travels with hardware, dataset, version pins, seeds and p95 numbers. Medians flatter, tails inform, and anyone can reproduce a number that ships with its own runner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give every claim an owner and an expiry date.&lt;/strong&gt; Capabilities decay silently when dependencies change. A claim nobody revalidated in two quarters is technical debt wearing a suit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a claim-failure budget.&lt;/strong&gt; Track how often reality contradicts documentation the same way you track error budgets. When the budget burns, feature work pauses until the gap closes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log your retractions.&lt;/strong&gt; A changelog entry stating that a previously advertised behavior was removed buys more durable trust than three launch posts, because it proves the other entries were audited by someone willing to lose face.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documentation Is Where Credibility Is Cheapest to Buy
&lt;/h2&gt;

&lt;p&gt;Most teams write documentation that describes the happy path and quietly omits the cliff edge. This is a false economy, because users find the cliff anyway, and they find it while angry and unsupervised.&lt;/p&gt;

&lt;p&gt;A "known limitations" section is the highest-leverage page you can write. Name the concurrency ceiling. State which schemas the migration tool refuses. Say plainly that the SDK retries idempotent calls only, and that non-idempotent writes are the caller's problem. Every failure mode you disclose converts a future support ticket into a design decision the user makes with open eyes, and it inoculates your remaining claims. Readers extend enormous credit to documentation that admits something, because admission is expensive and therefore hard to fake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Personal Balance Sheet
&lt;/h2&gt;

&lt;p&gt;This scales down to the individual. Your credibility as an engineer is a running tally of forecasts against outcomes, and almost nobody keeps score deliberately. Start writing estimates down with the assumptions attached, then re-read them at delivery. The exercise is humbling for about three months and permanently useful after that, because you stop offering confidence you have not earned and start offering ranges you can defend.&lt;/p&gt;

&lt;p&gt;The same discipline applies to code review. When you approve a generated pull request you did not fully understand, you are not saving time; you are borrowing it at an interest rate set by whoever gets paged. Reviewing AI output with the skepticism you would apply to a talented contractor with zero context is not conservatism. It is accounting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credibility Compounds
&lt;/h2&gt;

&lt;p&gt;The uncomfortable truth in all this data is that the tax is invisible in the quarter you incur it and unavoidable in the quarter you pay it. Teams that over-claim look faster for two quarters and slower forever after, because every subsequent statement they make gets discounted by an audience that has learned to check.&lt;/p&gt;

&lt;p&gt;Credibility behaves like a test suite. It is tedious to build, nobody applauds it, and its entire value shows up on the day something breaks and you can tell the truth quickly, precisely, and without having to negotiate with your own previous announcements.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Nobody Is Planning for Retroactive Forgery</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 01:09:14 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/nobody-is-planning-for-retroactive-forgery-2i0</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/nobody-is-planning-for-retroactive-forgery-2i0</guid>
      <description>&lt;p&gt;Every discussion of quantum computing and cryptography runs on the same rail: an adversary records encrypted traffic today and reads it once a sufficiently large machine exists. The case made in &lt;a href="https://www.urbansplatter.com/2026/05/the-cryptographic-clock-why-every-encrypted-file-you-send-today-may-be-read-in-2031/" rel="noopener noreferrer"&gt;this examination of the cryptographic clock&lt;/a&gt; is the version most engineers have internalised, and it is correct as far as it goes. But it describes only the confidentiality half of public-key cryptography. The other half — signatures, provenance, notarisation, everything answering &lt;em&gt;who made this and when&lt;/em&gt; — fails on a different clock, in the opposite direction, and its remedy stops working the instant the break arrives. That asymmetry is the most consequential thing in this transition that almost nobody has on a roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification Checks Math, Not History
&lt;/h2&gt;

&lt;p&gt;A signature verifier is a pure function. It takes a message, a signature, and a public key, and returns a boolean. It has no access to when the signature was produced. It cannot distinguish a signature computed in 2019 from one computed in 2036 by someone who has recovered the private key and typed whatever date they liked into the metadata.&lt;/p&gt;

&lt;p&gt;This is why the reassuring line — "signatures can't be harvested, so they're not urgent" — is technically true and practically misleading. Nobody un-signs your 2019 release artifact. What happens instead is that your 2019 release artifact stops meaning anything, because a forged one is now indistinguishable from it. The cryptographic property that dies is not integrity. It's &lt;strong&gt;discriminating power&lt;/strong&gt;: the ability of a signature to separate the authentic from the fabricated. Once ECDSA falls, every classical signature ever produced collapses into the same evidentiary category as an unsigned file with a plausible date on it.&lt;/p&gt;

&lt;p&gt;Work out where that lands in a normal engineering organisation and the surface is enormous. Signed Git tags and commits. Container image attestations and transparency-log entries. Notarised installers and driver packages. Signed firmware images sitting in devices that will still be deployed in 2040. SBOM attestations, build provenance, audit trails a regulator will want to inspect a decade from now. None of it is confidential. All of it is load-bearing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Timestamp Trap
&lt;/h2&gt;

&lt;p&gt;The instinctive fix is a trusted timestamp. Wrap the artifact in an RFC 3161 token from a timestamp authority, or a qualified electronic timestamp under eIDAS, and you have third-party proof that the signature existed before a given moment. Long-term validation formats in the PAdES and CAdES families are built on precisely this idea, and over seventy jurisdictions grant such timestamps legal standing.&lt;/p&gt;

&lt;p&gt;The trap: the timestamp authority signs its tokens with RSA or ECDSA. Break the TSA's key and an attacker doesn't merely forge documents — they mint backdated proof that the forgeries are old. The mechanism everyone is relying on to rescue historical signatures has exactly the same failure mode as the signatures it rescues, and it fails in the direction that manufactures false history rather than merely destroying true history.&lt;/p&gt;

&lt;p&gt;Which produces the inversion at the heart of this piece. &lt;strong&gt;Confidentiality exposure is fixed at capture time.&lt;/strong&gt; If a session was recorded in 2023 under classical-only key exchange, nothing you do in 2027 helps; that packet is already in someone's storage array. &lt;strong&gt;Forgery exposure is fixed at break time.&lt;/strong&gt; An archive re-signed with post-quantum signatures and post-quantum timestamps before the break retains its evidentiary weight afterwards; the same archive left alone does not. Signatures are the half where action still changes the outcome — but only while the window is open, and the window closes without an announcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Deadline That Arrives First Isn't TLS
&lt;/h2&gt;

&lt;p&gt;The standards bodies already priced this in, and the ordering surprises most people who assume browsers lead. The &lt;a href="https://media.defense.gov/2025/May/30/2003728741/-1/-1/0/CSA_CNSA_2.0_ALGORITHMS.PDF" rel="noopener noreferrer"&gt;NSA's CNSA 2.0 algorithms advisory&lt;/a&gt; sets the earliest deadline in its entire schedule for software and firmware signing: support and prefer by 2025, exclusive use by 2030. Web browsers, cloud services, and operating systems get until 2033. Networking equipment, 2030.&lt;/p&gt;

&lt;p&gt;The rationale is stated plainly in NSA's own guidance: a quantum-resistant root of trust may be needed in firmware years before the rest of the system can catch up, because firmware is the component you cannot patch your way out of later. If a device shipping in 2027 validates its updates with ECDSA burned into a boot ROM, that device has no upgrade path at all once ECDSA falls. The signature verification code is the thing that would have to be replaced, and it is the thing gating replacement.&lt;/p&gt;

&lt;p&gt;Note also what NSA specifies for that use case: not ML-DSA, and explicitly &lt;strong&gt;not&lt;/strong&gt; SLH-DSA. Software and firmware signing is assigned the stateful hash-based schemes LMS and XMSS from SP 800-208, with the multi-tree variants HSS and XMSS^MT disallowed and LMS with SHA-256/192 named as the preferred parameter set. That choice has consequences most developers have never had to think about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stateful Signatures Break Your Deployment Model
&lt;/h2&gt;

&lt;p&gt;Every signature scheme working engineers have used is stateless. Sign the same message twice with ECDSA and nothing bad happens. LMS and XMSS are not like this. They are Merkle trees over a finite supply of one-time keys, and each key index may be used exactly once. Reuse an index and you don't get a warning — you get catastrophic private key exposure.&lt;/p&gt;

&lt;p&gt;Translate that into ordinary infrastructure practice and things start breaking immediately. You cannot snapshot a signing VM and restore it later; the restored image will re-issue indices the original already consumed. You cannot run two signers behind a load balancer from the same key material. Your disaster recovery runbook — restore last night's backup, resume service — becomes a key-compromise event. Blue-green deployments, autoscaling, container immutability, "cattle not pets": every reflex that makes modern deployment safe makes stateful signing unsafe.&lt;/p&gt;

&lt;p&gt;This is the real reason NSA pushes signing into hardware security modules with hardware-managed state. It isn't ceremony. It's that the state is mutable, strictly non-replicable data whose accidental duplication destroys the key, and no ordinary deployment pipeline is designed to hold data with that property.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bitcoin Is Running the Experiment in Public
&lt;/h2&gt;

&lt;p&gt;If you want to see retroactive forgery risk play out with real money and a real deadline, watch Bitcoin, because it is the one system where the vulnerable public keys are already published forever and cannot be recalled.&lt;/p&gt;

&lt;p&gt;Roughly 6.7 to 6.9 million BTC — over a third of circulating supply as of March 2026 — sit in outputs whose public keys are visible on-chain. That includes early pay-to-public-key outputs from the network's first years, every address that has ever been spent from, and every Taproot keypath spend. These aren't keys that might leak. They are published, permanent, and waiting.&lt;/p&gt;

&lt;p&gt;The response has been two proposals. BIP-360 introduces a quantum-resistant output type. BIP-361, published in April 2026 under the title "Post Quantum Migration and Legacy Signature Sunset," goes further and proposes phasing out legacy ECDSA and Schnorr signatures entirely — first blocking new sends to vulnerable address types, then, years later, refusing to honour spends from them at all. &lt;a href="https://www.coindesk.com/tech/2026/04/15/bitcoin-developers-are-trying-to-build-quantum-defenses-your-coins-could-pay-the-price" rel="noopener noreferrer"&gt;Reporting on the developer backlash&lt;/a&gt; captures the conflict cleanly: the proposal would permanently freeze an estimated 1.7 million coins in ancient addresses whose owners are dead, lost, or gone, including roughly a million attributed to Satoshi.&lt;/p&gt;

&lt;p&gt;Two details generalise well beyond cryptocurrency. First, the attack model the BIP authors describe is a covert bleed — derive keys quietly, move value slowly over months, never announce. Under that model the break becomes public knowledge long after it happens, which is precisely the scenario in which "we'll migrate when we see evidence" fails. Second, and more broadly applicable: BIP-361 is the first mainstream proposal to accept that when public keys are permanently published and a signature scheme is dying, the only real protection is to stop honouring the scheme. The freezing debate is fundamentally an argument about what to do with artifacts that cannot be re-signed. Every organisation holding a signed archive will eventually have some version of that argument, with auditors instead of miners.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Shrinks the Blast Radius
&lt;/h2&gt;

&lt;p&gt;The good news is that the work is mostly unglamorous and mostly available now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dual-sign new artifacts.&lt;/strong&gt; Attach a post-quantum signature alongside the classical one rather than replacing it. Verifiers that don't understand the new algorithm ignore it; verifiers in 2035 have something that still discriminates. Cost is bytes and a second signing call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchor instead of re-signing at volume.&lt;/strong&gt; For large evidence logs, build a Merkle tree over the records and post-quantum-sign the root. One signature covers millions of entries, and per-record proofs stay small — considerably cheaper than wrapping each entry individually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrate the timestamp authority before the end-entity certificates.&lt;/strong&gt; A quantum-safe TSA can rescue classical signatures beneath it. A classical TSA cannot rescue anything, and can be used to fabricate history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat signing state as infrastructure, not configuration.&lt;/strong&gt; If you adopt LMS or XMSS, index state needs the same rigour as a database primary: hardware-held, never restored from backup, never forked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide now what happens to artifacts you can't re-sign.&lt;/strong&gt; Third-party notarisations, vendor-signed firmware in the field, records under legal hold. The answer may be "accept the loss," but that should be a decision with a date on it, not something discovered during a dispute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The confidentiality story ends with a straightforward, if grim, conclusion: the data was taken, and it will be read. The provenance story ends somewhere stranger — with a dispute in which both parties hold signatures that verify, and no cryptographic means of telling which one is telling the truth. That outcome is still preventable today. It stops being preventable on a date that will not be announced in advance.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Trust Protocol the Kernel Shipped in a Text File</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 01:07:29 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/the-trust-protocol-the-kernel-shipped-in-a-text-file-18nl</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/the-trust-protocol-the-kernel-shipped-in-a-text-file-18nl</guid>
      <description>&lt;p&gt;Every couple of decades, software discovers it cannot prove where its own code came from, and every time the fix turns out to be a line of text rather than a technology. That is happening again right now, and the pattern is not confined to engineering — a recent examination of &lt;a href="https://gisuser.com/2026/05/how-technology-companies-are-rebuilding-trust-after-the-era-of-automated-communication/" rel="noopener noreferrer"&gt;how technology companies are rebuilding trust after the era of automated communication&lt;/a&gt; describes reporters who now insist on primary documents before they will print a number, which is the same instinct a maintainer has when a stranger sends a patch with no reproducer. The difference is that one community has already shipped a working answer, in reStructuredText, with no launch event and no vendor behind it. It is worth reading closely, because almost every corporate AI policy currently being drafted gets the same problem wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Last Time Nobody Could Prove Anything
&lt;/h2&gt;

&lt;p&gt;In 2003, SCO began asserting that proprietary UNIX code had found its way into Linux. The claim was legally weak and eventually collapsed, but it was expensive precisely because it was hard to refute. The kernel had changelogs, yes, but no systematic record of the &lt;strong&gt;path&lt;/strong&gt; a patch travelled: who wrote it, who passed it along, who asserted the right to contribute it. Absence of documentation is not evidence of theft, but it is an excellent place to stand while you allege one.&lt;/p&gt;

&lt;p&gt;On 23 May 2004, Torvalds sent a request for discussion about explicitly documenting patch submission. Within about a week, the sign-off procedure was in the tree. The solution was not a code scanner, not an audit firm, not a contributor licence agreement with a signature page. It was a trailer at the bottom of a commit message — a short, human-made certification, permanently attached, trivially greppable, and cheap enough that nobody could argue about the overhead. Twenty-two years later it is still load-bearing infrastructure across an enormous slice of open source.&lt;/p&gt;

&lt;p&gt;Keep that shape in mind, because it repeats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Trailers Doing Two Different Jobs
&lt;/h2&gt;

&lt;p&gt;In December 2025, following consensus reached at that year's Maintainers Summit, the kernel merged an official policy on machine assistance. The &lt;a href="https://docs.kernel.org/process/coding-assistants.html" rel="noopener noreferrer"&gt;kernel's AI coding assistants documentation&lt;/a&gt; is short, and its central move is a separation most organisations never make.&lt;/p&gt;

&lt;p&gt;Agents are forbidden from adding a &lt;code&gt;Signed-off-by&lt;/code&gt; line. Only a human can certify the Developer Certificate of Origin, and the human submitter carries the whole load: reviewing generated code, confirming licence compatibility, signing off, and owning the result. Attribution goes somewhere else entirely, into a new trailer:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Assisted-by: LLM coccinelle sparse&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The format is &lt;code&gt;Assisted-by: LLM&lt;/code&gt; followed by optional specialised analysis tools — coccinelle, sparse, smatch, clang-tidy. Ordinary tooling like git, gcc, make and your editor is explicitly excluded, because listing it would be noise.&lt;/p&gt;

&lt;p&gt;Notice what the trailer does &lt;strong&gt;not&lt;/strong&gt; contain: a vendor, a product, a model string. That reads like an oversight until you think about maintenance. Model identifiers churn every few months, and naming a vendor invites an argument about which brand to blame instead of a conversation about whether the patch is correct. The trailer records that a class of tool participated. That is the fact a reviewer can actually use.&lt;/p&gt;

&lt;p&gt;The deeper design decision is the split itself. &lt;code&gt;Assisted-by&lt;/code&gt; is &lt;strong&gt;descriptive&lt;/strong&gt;: it says how the change came to exist. &lt;code&gt;Signed-off-by&lt;/code&gt; is a &lt;strong&gt;certification&lt;/strong&gt;: it says a named person accepts responsibility. Most AI policies being written this year fuse these into a single disclosure checkbox, which produces a field that is simultaneously legally meaningless and operationally useless. Provenance and liability are different data types. Store them separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Constraint Is Bandwidth, Not Authenticity
&lt;/h2&gt;

&lt;p&gt;The kernel's companion document on tool-generated content opens by naming the real problem rather than moralising about it: reviewer and maintainer bandwidth is a scarce resource. That single framing does enormous work. Once the question is resource allocation rather than authenticity, the rules stop being philosophy and become scheduling.&lt;/p&gt;

&lt;p&gt;It also lets the document draw a boundary that almost everyone else fumbles. "AI-assisted" is a worthless category if it stretches to cover autocomplete, so the guidelines explicitly exclude trivial tool use: spelling and grammar cleanups, identifier completion and boilerplate, mechanical renames, running a formatter. What falls in scope is any case where a meaningful amount of the contribution was not written by a person in the sign-off chain — a generated function, a machine-drafted file cleaned up afterwards, a changelog produced by handing the patch to a model, even a changelog translated from another language. If a tool found the bug, that belongs in the changelog too, partly as credit and partly so other developers learn the tool exists. When it is ambiguous, the instruction is to disclose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proportional Scrutiny Instead of a Ban
&lt;/h2&gt;

&lt;p&gt;Several projects responded to the same pressure by banning generated contributions outright. The kernel did something harder and more durable: it made scrutiny scale with the proportion of generated content, and it published the maintainer's menu of legitimate responses. A maintainer may treat the patch like any other, reject it outright, demand extra testing, review it at lower priority than human-written work, ask the contributor to explain how the model was trained, ask them to demonstrate they understand the code, or — my favourite — respond with a better prompt instead of a code suggestion.&lt;/p&gt;

&lt;p&gt;That last option quietly promotes the prompt to a reviewable artifact. And the disclosure the guidelines request is not a checkbox but a description: which tools, what input those tools received (the Coccinelle script itself, for instance), the prompts or a summary of them for longer sessions, which portions of the change were affected, and how the result was tested. A reviewer can act on that. A checkbox tells them nothing except that someone read a policy.&lt;/p&gt;

&lt;p&gt;The enforcement clause is equally plain: you are expected to understand and defend everything you submit, and if you cannot, maintainers may reject the series without detailed review. Cost lands on the claimant, which is the only arrangement that has ever survived contact with volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Procedure Reads Like an Interface Contract
&lt;/h2&gt;

&lt;p&gt;The bug-fixing procedure attached to the policy is nine mandatory steps, and it is the most quietly radical part of the document. Read the process documentation in full rather than keyword-searching fragments of it. Record the commit ID. For any non-trivial bug, build a reproducer, and abandon the report if the bug evaporates under one. Write the fix — declared explicitly not optional, on the reasoning that anything capable of finding a bug is capable of fixing it, and that a fix written in the same session inherits the reasoning context. Build it, run checkpatch, discard fixes that fail. Find maintainers with get_maintainer.pl. Consult the threat model to classify the issue, and leave the classification to a human. Never send anything yourself.&lt;/p&gt;

&lt;p&gt;Then step eight, which carries more weight than the other eight combined: state explicitly what could not be done. Untested, unbuilt, unreproduced — say so. The document is blunt about why, noting how much time maintainers currently lose to unverified reports and untested fixes.&lt;/p&gt;

&lt;p&gt;This inverts the default. Normally a reviewer must discover what is missing from a submission. Here the submitter is contractually required to enumerate their own gaps. Declared uncertainty is the single cheapest trust signal in existence, and it is nearly impossible to fake convincingly, because fabrications never volunteer their own limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Regulators Arrived at the Same Primitive
&lt;/h2&gt;

&lt;p&gt;While the kernel worked this out from first principles, Brussels arrived somewhere structurally identical from the opposite direction. Article 50 of the AI Act applies from 2 August 2026, and the &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/guidelines-ai-transparency-obligations" rel="noopener noreferrer"&gt;European Commission's guidelines on AI transparency obligations&lt;/a&gt; were finalised on 20 July 2026 alongside a code of practice on marking generated content. Providers of systems producing synthetic audio, image, video or text must mark outputs in a machine-readable format that makes them detectable as generated. People must be told when they are interacting with a system directly. Systems already on the market got until 2 December 2026 for the marking requirement; content produced before the deadline needs no retroactive labelling. Infringements carry fines up to €15 million or 3% of worldwide turnover.&lt;/p&gt;

&lt;p&gt;The scope is different — Article 50 binds providers and deployers of systems, not your commit messages — but the mechanism is the same, and it is the interesting part. Both regimes mark at the moment of generation rather than guessing afterwards with a classifier. Detection is an arms race you lose slowly and then all at once. Declaration is a protocol, and protocols compose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Porting This Into a Repository You Actually Own
&lt;/h2&gt;

&lt;p&gt;The kernel's version is tuned for an email-based workflow with strong maintainer authority, but the primitives transfer cleanly to any project with a review process.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Split provenance from accountability.&lt;/strong&gt; One trailer describes how the change was produced; a different, human-only signature accepts responsibility for it. Never collapse them into one field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write your out-of-scope list before your in-scope list.&lt;/strong&gt; If a policy technically covers autocomplete, nobody will follow it, and selective non-compliance corrodes the whole thing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask for prompts and inputs, not a yes/no flag.&lt;/strong&gt; Store what a reviewer would need to reproduce the generation, not merely the fact that generation occurred.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Require a reproducer and require a gap statement.&lt;/strong&gt; "I could not test this on hardware" belongs in the pull request body, not in a reviewer's discovery process three days later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State the scrutiny curve openly.&lt;/strong&gt; Contributors should know in advance that a mostly generated patch gets slower, harder review — that is information, not punishment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it greppable and plain-text.&lt;/strong&gt; The value compounds only if you can query five years of history without a bespoke tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What It Does Not Fix
&lt;/h2&gt;

&lt;p&gt;Worth being honest about the limits, because the enthusiasm around provenance metadata is starting to outrun its capabilities. These trailers are self-reported and cryptographically unverified; nothing stops someone omitting one. They function in the kernel because there is a named maintainer with a reputation, a review culture with teeth, and a credible threat of having your series ignored. Bolt the same trailers onto a repository where nobody reviews anything and you have manufactured a compliance artifact, not trust.&lt;/p&gt;

&lt;p&gt;But that is exactly the point, and it is why this pattern keeps recurring. The 2004 sign-off did not verify anything either. It created a durable, attributable record of a human being making a claim, and it made that claim cheap to record and expensive to walk back. Twenty-two years later, faced with a machine that can produce infinite plausible text, the kernel's answer is a second line in the same commit message, written by the same accountable person.&lt;/p&gt;

&lt;p&gt;Not glamorous. Still the only thing anybody has found that works.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your Launch Post Is Less Rigorous Than a Government Data Release</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 00:57:08 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/your-launch-post-is-less-rigorous-than-a-government-data-release-34ec</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/your-launch-post-is-less-rigorous-than-a-government-data-release-34ec</guid>
      <description>&lt;p&gt;Somewhere in your last release announcement there is a number with no unit attached to it, no interval around it, and no date stamped on it. Maybe it was &lt;strong&gt;40% faster&lt;/strong&gt;. Maybe it was &lt;strong&gt;99.99% uptime&lt;/strong&gt;, or a cost saving, or a benchmark score. Whoever reads that number and has to act on it — a procurement reviewer, a platform lead, an investor, a lender — must decide how much of their own risk to price into your confidence. An industry analysis of &lt;a href="https://ccr-mag.com/press-releases-that-influence-construction-capital-decisions/" rel="noopener noreferrer"&gt;how announcements get read as lightweight disclosure documents&lt;/a&gt; in construction and development makes the consequence explicit for people who sign checks, and the mechanism is identical in software: the reader is not hunting for your best number, they are hunting for the range you would defend under questioning. This is an argument about the three things every published number needs and almost never has.&lt;/p&gt;

&lt;h2&gt;
  
  
  The release format nobody in tech copied
&lt;/h2&gt;

&lt;p&gt;On September 1, 2026, the U.S. Census Bureau reported that construction spending in July ran at a seasonally adjusted annual rate of $2,157.6 billion, 0.5 percent below the revised June estimate of $2,167.7 billion. Then it did something no engineering blog has ever done. It attached ±0.8 percent to that change, and marked it with an asterisk meaning the 90 percent confidence interval includes zero — in plain language, there is not enough evidence to conclude the decline happened at all.&lt;/p&gt;

&lt;p&gt;Read that again. A statistical agency published a headline movement and, in the same sentence, told you the movement might not exist. Its tables tag every figure with &lt;code&gt;p&lt;/code&gt; for preliminary or &lt;code&gt;r&lt;/code&gt; for revised. The methodology note states that the data are annualized and adjusted for seasonality but not for price changes, so you know exactly what basis you are standing on.&lt;/p&gt;

&lt;p&gt;That is four pieces of information per number: &lt;strong&gt;value, basis, uncertainty, vintage&lt;/strong&gt;. Now compare it to "we cut p99 latency by 40%." One piece of information, three missing, and the reader has no way to reconstruct the other three without asking you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The most expensive implicit unit in history
&lt;/h2&gt;

&lt;p&gt;On September 23, 1999, NASA lost the Mars Climate Orbiter. The story usually gets compressed into "someone forgot to convert to metric," which is true and almost useless.&lt;/p&gt;

&lt;p&gt;Here is what actually happened. Ground software called SM_FORCES produced impulse data for the angular momentum desaturation events the spacecraft performed during its nine-month cruise. The software interface specification required those values in newton-seconds. The file delivered them in pound-force-seconds. Because one pound-force-second is roughly 4.45 newton-seconds, the navigation team's model absorbed about 22 percent of the real effect of every thruster firing, and the error accumulated quietly for months, far too small on any single event to trip an alarm. The orbiter arrived at roughly 57 kilometres altitude instead of the planned 226 and did not survive.&lt;/p&gt;

&lt;p&gt;The board's &lt;a href="https://llis.nasa.gov/llis_lib/pdf/1009464main1_0641-mr.pdf" rel="noopener noreferrer"&gt;Phase I report on the mishap&lt;/a&gt; is worth reading in full, because the uncomfortable part is this: the onboard software was correct. The numbers were correct. Both units were legitimate measures of impulse. What failed was that a bare number crossed an organisational boundary carrying its unit only by convention, and the receiving system trusted the convention.&lt;/p&gt;

&lt;p&gt;Every announcement you publish is that boundary. Inside your team, "40% faster" has a shared basis — everyone knows which workload, which hardware, which percentile. Outside, it is a bare number crossing an interface with nothing but convention holding the meaning in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mirror-image failure: turning an interval into a verdict
&lt;/h2&gt;

&lt;p&gt;The unit problem has a twin, and it is arguably worse because it looks like rigour.&lt;/p&gt;

&lt;p&gt;In March 2019, Nature published &lt;a href="https://www.nature.com/articles/d41586-019-00857-9" rel="noopener noreferrer"&gt;a call by more than 800 scientists to stop treating statistical significance as a verdict&lt;/a&gt;. Valentin Amrhein, Sander Greenland and Blake McShane were not asking for a ban on P values. Their argument was about compression loss: sorting results into "significant" and "non-significant" makes people treat two nearly identical estimates as categorically different, and routinely converts "we did not detect a difference" into "there is no difference." They argued for describing the interval and discussing what the values at both ends would mean, rather than collapsing everything into a binary.&lt;/p&gt;

&lt;p&gt;Developers perform exactly this compression every week. A benchmark run produces a distribution across hundreds of iterations. The blog post publishes a single ratio. A load test finds no regression above the noise floor, and the changelog says "no performance impact." Absence of a detected regression is not evidence of no regression, and everyone reading your post who has run a benchmark knows it — which is precisely why they discount the claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  A number is three fields, not one
&lt;/h2&gt;

&lt;p&gt;The fix is unglamorous and takes about ninety seconds per claim. Treat a published measurement as a composite value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metric"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"request_latency_p50"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;126&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"delta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ci95"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;-34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-45&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bootstrap, 10k resamples"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"basis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"n_runs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c6i.4xlarge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"corpus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vintage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"measured"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"published"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-19"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preliminary"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In prose, the same discipline turns this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Our new engine is 40% faster."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;into this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Median request time fell from 210 ms to 126 ms across 500 runs on c6i.4xlarge — a 40% reduction, 95% interval 34% to 45%, measured 14 August 2026 against the 2026-08 corpus."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The second version is longer, less quotable, and dramatically more expensive to dismiss. That trade is the entire point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revisions are a feature you have to build
&lt;/h2&gt;

&lt;p&gt;Statistical agencies revise published figures on a schedule and mark the vintage so anyone holding an old number knows it has moved. Software teams silently edit the blog post.&lt;/p&gt;

&lt;p&gt;A quietly mutated number is worse than a wrong one, because it destroys everyone's ability to reconcile older references to your work. Keep the URL stable, keep an append-only revision note at the top, and never rewrite history in place. If your benchmark methodology changed, say which vintage the reader is looking at. Nobody has ever lost a deal by disclosing that a preliminary figure was refined; plenty have lost one when a reviewer found two contradictory numbers under the same link.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to attach to every number you publish
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unit and basis&lt;/strong&gt; — the workload, percentile, or accounting definition, next to the figure, not in a footnote&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample and selection rule&lt;/strong&gt; — n, and how those runs were chosen or discarded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An interval and the method that produced it&lt;/strong&gt; — bootstrap, standard error, min-max across runs; any of them beats none&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vintage&lt;/strong&gt; — measurement date, publication date, and status: preliminary, revised, or final&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A reproduction path&lt;/strong&gt; — hardware, config, dataset, commit hash&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A scope word&lt;/strong&gt; — measured, modeled, projected, or contracted, because these are four different commitments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verification cost is the real currency
&lt;/h2&gt;

&lt;p&gt;Every reader who cannot re-derive your number has to pay for the uncertainty themselves, in extra diligence, in a discount applied to your claim, or in a decision they defer. That cost lands on you whether or not you see the invoice.&lt;/p&gt;

&lt;p&gt;The organisations whose numbers move real money — statistical agencies, mission control, peer-reviewed journals — figured this out decades ago, and they all landed in the same place: publish the range, name the unit, date the vintage, and revise in the open. It is not a higher standard than engineering deserves. It is the standard engineering already applies to its own instruments, right up until the moment it writes the announcement.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reputation Is a Permission System, and Nobody Audits Theirs</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 00:55:44 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/reputation-is-a-permission-system-and-nobody-audits-theirs-4feb</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/reputation-is-a-permission-system-and-nobody-audits-theirs-4feb</guid>
      <description>&lt;p&gt;In October 2021, someone opened a pull request against an obscure compression library. It edited an &lt;code&gt;.editorconfig&lt;/code&gt; file. By any measure available at the time it was polite, useful, and utterly unremarkable. Two and a half years later, that same contributor shipped a backdoor into xz-utils that came within days of landing in the stable channels of nearly every major Linux distribution. What made it work was not a clever exploit primitive. It was accumulated goodwill: precisely the asset that this analysis of &lt;a href="https://scalar.usc.edu/works/eiltebook/public-relations-services-building-trust-visibility-and-long-term-brand-authority" rel="noopener noreferrer"&gt;how sustained visibility compounds into long-term authority&lt;/a&gt; treats as a competitive advantage, run in reverse and pointed at a build system. Reputation is an access-control layer. Most engineering organizations have never once reviewed the permissions it grants.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Longest Con in Modern Infrastructure
&lt;/h2&gt;

&lt;p&gt;The xz-utils incident, CVE-2024-3094, is usually filed under "supply chain attack." That framing undersells it. The technical payload was elegant — an IFUNC resolver hijacking &lt;code&gt;RSA_public_decrypt&lt;/code&gt; at runtime, activating only on x86-64 glibc systems built with dpkg or rpm, obfuscated inside binary test fixtures and a modified &lt;code&gt;build-to-host.m4&lt;/code&gt; that appeared only in release tarballs and never in the public Git tree. That's good tradecraft. It is not the interesting part.&lt;/p&gt;

&lt;p&gt;The interesting part is the two-and-a-half-year account warm-up that preceded it. First contribution: October 2021. First authored commit: January 2022. Then months of legitimate, genuinely useful work — code review, translations, CI maintenance, infrastructure cleanup. Around mid-2022, a cluster of accounts with thin histories and suspiciously recent creation dates appeared on the xz-devel mailing list, complaining about slow release cadence and pressuring the sole maintainer to bring on help. One of them wrapped the pressure in sympathy about the maintainer's mental health while insisting the community deserved more. That maintainer was one unpaid volunteer looking after a library embedded in essentially every Linux system in existence.&lt;/p&gt;

&lt;p&gt;He relented. Commit access followed, then release authority. The backdoor commit landed 22 January 2024; version 5.6.0 shipped 24 February. It was caught on 28 March by a Microsoft engineer benchmarking PostgreSQL who noticed SSH logins were taking about half a second too long and refused to let it go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The attacker did not bypass the trust model. The attacker satisfied it.&lt;/strong&gt; Every gate the ecosystem had was social, and every one of them was cleared honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then the Attackers Automated the Social Layer
&lt;/h2&gt;

&lt;p&gt;If xz was the artisanal version, September 2025 was the industrial one. A self-replicating npm worm nicknamed Shai-Hulud began harvesting credentials from developer machines and CI runners, then using the stolen npm tokens to publish poisoned versions of every other package the victim maintained. No operator in the loop. &lt;a href="https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem" rel="noopener noreferrer"&gt;CISA's alert on the npm ecosystem compromise&lt;/a&gt; put the initial blast radius above 500 packages and told organizations to pin dependencies to releases published before 16 September 2025 and rotate every developer credential they had.&lt;/p&gt;

&lt;p&gt;It kept evolving. The December 2025 wave moved execution into the &lt;code&gt;preinstall&lt;/code&gt; phase, so the payload ran before tests or scanners ever got a turn. It dropped a Bun runtime, registered a self-hosted GitHub Actions runner, and used TruffleHog against the victim's own filesystem. &lt;a href="https://www.microsoft.com/en-us/security/blog/2025/12/09/shai-hulud-2-0-guidance-for-detecting-investigating-and-defending-against-the-supply-chain-attack/" rel="noopener noreferrer"&gt;Microsoft's Defender research team documented the campaign in detail&lt;/a&gt;, including a detail that ought to be taught in every onboarding session: some malicious commits were authored under the name "Linus Torvalds." A display name is not an identity. It never was.&lt;/p&gt;

&lt;p&gt;The 2026 variants got worse. Later waves spanned npm and PyPI simultaneously, installed persistence hooks into local AI coding tools so every future session re-executed the payload, and — in at least one documented case — shipped malicious packages carrying &lt;strong&gt;valid SLSA Build Level 3 provenance attestations&lt;/strong&gt;, because the release pipeline itself was the thing that got hijacked. Provenance proved the artifact came from the expected pipeline. It did not prove the pipeline was still yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Number That Explains Everything
&lt;/h2&gt;

&lt;p&gt;Here is the structural fact under all of this. Tidelift's maintainer research has found, across multiple years, that roughly &lt;strong&gt;60% of open source maintainers are unpaid&lt;/strong&gt;, and that unpaid maintainers overwhelmingly work alone. The same research found paid maintainers were about 55% more likely to have implemented core security practices — the gaps are stark on exactly the controls that matter here, including published security disclosure plans and signed releases with artifact provenance.&lt;/p&gt;

&lt;p&gt;Read that against the xz timeline and the picture resolves. A social-engineering campaign targeting an exhausted solo volunteer is not a sophisticated attack. It is the cheapest available attack, and it is cheap because the ecosystem has spent two decades extracting enormous value from people it declined to pay. Roughly 60% of maintainers report having quit or seriously considered quitting. Every one of those exits is a project looking for a new maintainer, which is to say a project with an open application process for adversaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardening the Layer You Cannot Compile
&lt;/h2&gt;

&lt;p&gt;Concrete things that actually change the risk profile, roughly in order of effort-to-benefit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add a soak period.&lt;/strong&gt; New versions sit for 24–72 hours before your builds adopt them. Nearly every worm in this family was caught within that window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kill install scripts by default&lt;/strong&gt; (&lt;code&gt;npm ci --ignore-scripts&lt;/code&gt;) and allowlist the handful of packages that genuinely need them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move from long-lived tokens to trusted publishing / OIDC&lt;/strong&gt;, and require WebAuthn rather than TOTP for publish operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat CI secrets as already-leaked.&lt;/strong&gt; Short TTLs, narrow scopes, no ambient cloud credentials on build runners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify commit signatures&lt;/strong&gt;, because display names are free and signatures are not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit maintainer concentration&lt;/strong&gt; in your dependency tree — a bus factor of one is a security finding, not a trivia fact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fund the maintainers you depend on&lt;/strong&gt;, which is the only item on this list that reduces the attack surface rather than merely observing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What This Means If You Are the One Being Trusted
&lt;/h2&gt;

&lt;p&gt;Flip the perspective. If you ship a library, run a dev tool company, or maintain anything other people build on, the same mechanics apply to you, just with the polarity reversed.&lt;/p&gt;

&lt;p&gt;Your credibility is what buys you the benefit of the doubt during an incident, the willingness to upgrade, the assumption of good faith when something breaks at 3am. It is also, uncomfortably, the thing an attacker would inherit if they compromised your publishing pipeline. Both facts point to the same discipline: make your identity verifiable rather than merely familiar. Signed releases. A &lt;code&gt;SECURITY.md&lt;/code&gt; with real response timelines. Named humans attached to decisions. Provenance you can explain. A public record of how you behaved the last time something went wrong.&lt;/p&gt;

&lt;p&gt;That work is slow and it does not trend. It also cannot be faked on a two-year timeline by a determined adversary, which is more than can be said for a friendly commit history.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Conclusion
&lt;/h2&gt;

&lt;p&gt;We spent years building cryptographic verification for artifacts and almost none for the humans authorized to produce them. Sigstore, SLSA, and SBOMs all answer "did this come from where it claims?" None of them answer "should that place still be trusted?" The 2026 attestation-carrying worm demonstrated that gap in production.&lt;/p&gt;

&lt;p&gt;The honest position is that trust in software is transitive, unmonitored, and granted mostly by vibes accumulated over time. Attackers understood that before we did. The defense is not more suspicion of strangers — open source dies without newcomers. The defense is making trust explicit, revocable, observable, and, wherever money is involved, actually paid for.&lt;/p&gt;

&lt;p&gt;Check your &lt;code&gt;package-lock.json&lt;/code&gt;. Then check who maintains the top twenty entries, and whether any of them have posted in the last six months.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Largest Schema Extension Experiment in History Has Been Running Since 2009</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Thu, 10 Sep 2026 00:55:02 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/the-largest-schema-extension-experiment-in-history-has-been-running-since-2009-6pb</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/the-largest-schema-extension-experiment-in-history-has-been-running-since-2009-6pb</guid>
      <description>&lt;p&gt;Somewhere in your codebase there is a column named &lt;code&gt;custom_field_3&lt;/code&gt;, a JSONB blob called &lt;code&gt;metadata&lt;/code&gt;, or a plugin API that lets integrators define their own event types. Every extensible system eventually runs into the same question, and most of us only ever guess at the answer: what happens to the consumers downstream once everybody starts extending? We don't actually have to guess. The answer has been measured continuously, at national scale, in public, for over fifteen years — and it matters more now than it did, because the evidence gathered on &lt;a href="https://bentsmagazine.co.uk/why-losing-a-single-analyst-quietly-reprices-an-entire-company/#google_vignette" rel="noopener noreferrer"&gt;why losing a single analyst quietly reprices an entire company&lt;/a&gt; shows the human interpretation layer thinning out fastest at exactly the organizations least able to absorb the loss. What's left reading your output is a query. This is about whether your data shows up in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup, in Terms a Backend Engineer Will Recognize
&lt;/h2&gt;

&lt;p&gt;Since 2009, every public company in the United States has had to submit its financial statements in XBRL, an XML-based markup format. Strip away the accounting and the architecture is familiar: roughly eight thousand independent organizations write records against one shared, versioned schema — the US GAAP taxonomy, republished annually by the FASB — and the whole corpus is exposed through a free public REST API with no authentication and no keys.&lt;/p&gt;

&lt;p&gt;The endpoints are worth knowing even if you never touch finance. &lt;a href="https://www.sec.gov/search-filings/edgar-application-programming-interfaces" rel="noopener noreferrer"&gt;The SEC's own API documentation&lt;/a&gt; covers three: &lt;code&gt;companyconcept&lt;/code&gt; for one field from one filer, &lt;code&gt;companyfacts&lt;/code&gt; for everything one filer has ever reported, and &lt;code&gt;frames&lt;/code&gt;, which is the interesting one — it slices a single concept across every reporting entity for a given calendar period, snapping each filer's ragged fiscal calendar onto a common grid. Fair-access rules cap you at ten requests per second and require a User-Agent header that identifies you by name and email. Bulk ZIPs rebuild nightly around 3am ET.&lt;/p&gt;

&lt;p&gt;And buried in that documentation is the sentence this whole article hangs on. The aggregation APIs only include facts that use a non-custom taxonomy — &lt;code&gt;us-gaap&lt;/code&gt;, &lt;code&gt;ifrs-full&lt;/code&gt;, &lt;code&gt;dei&lt;/code&gt;, &lt;code&gt;srt&lt;/code&gt; — and that apply to the entire filing entity. Everything else is silently absent.&lt;/p&gt;

&lt;p&gt;Companies are permitted to extend the schema. The query layer just doesn't carry the extensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rule Nobody Follows
&lt;/h2&gt;

&lt;p&gt;The regulation governing extensions is unusually blunt for a legal text. Under Regulation S-T, a filer must create a custom element &lt;strong&gt;if and only if&lt;/strong&gt; no appropriate standard tag exists. Not "if it fits better." Not "if the label reads nicer." The rule explicitly rejects an inappropriate standard label as sufficient justification on its own.&lt;/p&gt;

&lt;p&gt;So how often does a system with a legally-mandated "extend only when strictly necessary" clause actually get extended? The SEC's Division of Economic and Risk Analysis has published the number every year for a decade. Across annual reports from 2016 through 2024, average custom tag rates hover in a narrow band of roughly 16 to 22 percent depending on filer category and year, with a visible bump around 2020 and a modest decline through 2024.&lt;/p&gt;

&lt;p&gt;Read that again in engineering terms. &lt;strong&gt;Roughly one in five line items in the corpus is a bespoke field, in a system where bespoke fields are supposed to be the exception.&lt;/strong&gt; If a product manager told you 20% of your API's payload keys were vendor-specific extensions, you would not describe that schema as standardized. You would describe it as forked eight thousand ways.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extension Rate Is a Property of Your Tooling
&lt;/h2&gt;

&lt;p&gt;Here's where the data stops being merely interesting and starts being a lesson.&lt;/p&gt;

&lt;p&gt;The averages hide the tail. When DERA staff went looking in 2014 for filers whose custom tag rate exceeded 50% — meaning more than half of their line items were invented fields — smaller filers made up 96% of that group. Staff review of the large filers with high extension rates generally found the extensions justified. Among the small ones, they found systematic evidence of custom tags created where a perfectly good standard tag already existed. And the staff pointed at a cause that has nothing to do with accounting: many of those filers had routed their submissions through the same handful of third-party filing vendors.&lt;/p&gt;

&lt;p&gt;The trend lines say the same thing more quietly. Through 2019 and 2020, large accelerated filers' extension rates moved around while smaller reporting companies climbed steadily year over year. The gap wasn't driven by small companies having genuinely stranger businesses than large ones. Large companies had teams and software that pushed back. Small companies had a vendor whose importer made "create new element" the path of least resistance.&lt;/p&gt;

&lt;p&gt;Any engineer who has inherited a database where half the columns are &lt;code&gt;attr_1&lt;/code&gt; through &lt;code&gt;attr_12&lt;/code&gt; already knows this story. Extension rate is not a measure of how unique your domain is. It is a measure of how cheap your tooling made the escape hatch relative to the effort of finding the right existing field. Make the escape hatch one click and it becomes the default. Ship a search that surfaces the correct standard field in under three seconds and it stops being the default.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Costs to Be in Your Own Namespace
&lt;/h2&gt;

&lt;p&gt;The consequence is concrete and easy to demonstrate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;UA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Jane Dev jane@example.com'&lt;/span&gt;

&lt;span class="c"&gt;# Every filer that reported the standard Revenues concept for CY2024Q1&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"User-Agent: &lt;/span&gt;&lt;span class="nv"&gt;$UA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://data.sec.gov/api/xbrl/frames/us-gaap/Revenues/USD/CY2024Q1.json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="s1"&gt;'.data | length'&lt;/span&gt;

&lt;span class="c"&gt;# Now inspect which namespaces the API will even acknowledge for a filer&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"User-Agent: &lt;/span&gt;&lt;span class="nv"&gt;$UA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://data.sec.gov/api/xbrl/companyfacts/CIK0000320193.json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="s1"&gt;'.facts | keys'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; ["dei","us-gaap"]   ...and that is the entire universe.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That second call is the punchline. No matter how many bespoke elements a company defined, the response keys are a short list of standard taxonomies. The company's own namespace is not there and never will be. The number was disclosed. It was filed correctly. It passed validation. And it is invisible to every consumer working through the aggregation layer, which increasingly means every consumer at all.&lt;/p&gt;

&lt;p&gt;For a large company this is a rounding error, because a dozen analysts read the raw exhibit anyway and translate it by hand. For a company with thin coverage and no analysts left, the aggregation layer is the &lt;em&gt;only&lt;/em&gt; reader. The organizations extending hardest are precisely the ones with the least human interpretation left to compensate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Europe Shipped a Fix Worth Stealing
&lt;/h2&gt;

&lt;p&gt;The EU hit the same wall with its own mandate and responded with a design pattern rather than a prohibition. Under the European Single Electronic Format, an issuer may still create extension elements, but each one must be &lt;em&gt;anchored&lt;/em&gt; to the closest standard taxonomy concept — a relationship recorded in the definition linkbase, so a consumer encountering an unknown element can walk the edge to a canonical one it does understand. When &lt;a href="https://www.esma.europa.eu/press-news/esma-news/esma-publishes-2024-esef-reporting-manual" rel="noopener noreferrer"&gt;ESMA published its 2024 update to the ESEF Reporting Manual&lt;/a&gt; it tightened this further, clarifying that anchors must point to a core element sharing the same data type.&lt;/p&gt;

&lt;p&gt;That is a genuinely good piece of schema engineering, and it generalizes far beyond filings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't ban extension, require a mapping&lt;/strong&gt; — a custom field with a declared edge to a canonical field is queryable; one without is a dead end&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce type compatibility on the mapping&lt;/strong&gt; — an anchor from a monetary value to a text block is worse than no anchor, because it looks valid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store the mapping in the schema, not the documentation&lt;/strong&gt; — a relationship a machine can traverse survives; a wiki note explaining what &lt;code&gt;acme_adj_ebitda_v2&lt;/code&gt; means does not&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrument your extension rate and watch it by customer segment&lt;/strong&gt; — the segment with the highest rate is telling you where your standard fields or your UI are failing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promote recurring extensions into the standard on a schedule&lt;/strong&gt; — the FASB adds elements annually precisely because a static core schema guarantees a growing fork&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Reader You're Actually Writing For
&lt;/h2&gt;

&lt;p&gt;The financial story and the engineering story converge on the same point. When a market loses the analysts who used to read a company's filings and translate the idiosyncratic bits into something comparable, the surviving reader is a program that queries standard fields and moves on. Anything sitting in a private namespace isn't judged harshly — it simply isn't seen. That is a worse outcome than being criticized, because it produces no signal at all.&lt;/p&gt;

&lt;p&gt;Your API has the same structure. Somewhere downstream, a consumer is running the equivalent of a frames query against your standard fields, and whatever your users buried in &lt;code&gt;metadata&lt;/code&gt; is not in the result set. The question worth asking on your own schema this week isn't whether extension is allowed. It's what percentage of the payload is currently extension, whether that number is being driven by real domain complexity or by an autocomplete that's easier to ignore than to use, and whether anything custom carries an edge back to something canonical. Those three numbers are cheap to compute and, on the evidence of eight thousand companies filing for fifteen years, nobody computes them until the humans who used to paper over the mess are already gone.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your Feature Has a Cost Per Execution. Why Isn’t It in the Code?</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Tue, 18 Aug 2026 15:30:38 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/your-feature-has-a-cost-per-execution-why-isnt-it-in-the-code-2lf9</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/your-feature-has-a-cost-per-execution-why-isnt-it-in-the-code-2lf9</guid>
      <description>&lt;p&gt;A strange thing happens inside modern software companies: engineers can tell you the latency of an endpoint to the millisecond, but often nobody can tell you what executing that endpoint actually costs. That gap matters more than it used to. The broader financial discipline described in &lt;a href="https://tinybuddha.com/members/business-finance-that-actually-prevents/" rel="noopener noreferrer"&gt;Business Finance That Actually Prevents Failure&lt;/a&gt; becomes much more concrete when applied at the software layer, because a growing number of products now accumulate real costs every time a user clicks a button, uploads a file, generates an image, runs a search, sends a message, or asks an AI model a question. &lt;strong&gt;A feature can be technically successful, heavily used, loved by customers—and economically terrible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For decades, software benefited from an attractive assumption: once the product was built, serving one more user was comparatively cheap.&lt;/p&gt;

&lt;p&gt;That assumption has not disappeared, but it has become dangerously unreliable.&lt;/p&gt;

&lt;p&gt;A modern application may call an LLM, invoke an OCR service, generate embeddings, query a vector database, send an SMS, use a geocoding API, process an image, write logs to an observability platform, transfer data across regions, run a serverless function, store the result, and pay a transaction fee before the user sees a single response.&lt;/p&gt;

&lt;p&gt;Each component might look inexpensive in isolation.&lt;/p&gt;

&lt;p&gt;The feature is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  We Still Design Features as if Compute Were Free
&lt;/h2&gt;

&lt;p&gt;Imagine a startup selling an AI document-analysis product for $49 per month.&lt;/p&gt;

&lt;p&gt;The product team launches a feature called “Deep Review.” Users upload contracts and receive a detailed analysis.&lt;/p&gt;

&lt;p&gt;Engagement is excellent.&lt;/p&gt;

&lt;p&gt;Customers love it.&lt;/p&gt;

&lt;p&gt;Usage grows rapidly.&lt;/p&gt;

&lt;p&gt;Everyone celebrates.&lt;/p&gt;

&lt;p&gt;But one Deep Review is not one operation. Behind the button, the system might extract text, classify pages, call a large model several times, generate embeddings, search stored context, call another model to verify the answer, save the output, and retain the source document.&lt;/p&gt;

&lt;p&gt;Assume, purely as an example, that an ordinary review costs the company $0.18 to process.&lt;/p&gt;

&lt;p&gt;That sounds irrelevant.&lt;/p&gt;

&lt;p&gt;Then someone uploads a huge document.&lt;/p&gt;

&lt;p&gt;It needs multiple OCR passes. Chunking creates dozens of model calls. A retry fires after one provider times out. The verification step receives far more context than expected. That review costs $1.40.&lt;/p&gt;

&lt;p&gt;A customer on the $49 plan runs 70 of them.&lt;/p&gt;

&lt;p&gt;The customer has paid $49.&lt;/p&gt;

&lt;p&gt;The company may have spent close to the entire subscription price on one feature before paying for databases, support, engineering, payment processing, salaries, or anything else.&lt;/p&gt;

&lt;p&gt;The feature has not failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Its economics have.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is one of the most important architectural changes developers need to recognize: in a metered software stack, product behavior and financial behavior are no longer separate systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Cloud Bill” Is Too Coarse a Data Type
&lt;/h2&gt;

&lt;p&gt;A monthly infrastructure bill tells you approximately as much about product economics as total CPU utilization tells you about which endpoint is slow.&lt;/p&gt;

&lt;p&gt;You need attribution.&lt;/p&gt;

&lt;p&gt;If the company spends $80,000 on infrastructure, the interesting questions are not limited to “Why is AWS expensive?” or “Can we reduce the bill by 10%?”&lt;/p&gt;

&lt;p&gt;The interesting questions are:&lt;/p&gt;

&lt;p&gt;Which customers caused the spend?&lt;/p&gt;

&lt;p&gt;Which workflows caused it?&lt;/p&gt;

&lt;p&gt;Which product tier generated it?&lt;/p&gt;

&lt;p&gt;Which release changed it?&lt;/p&gt;

&lt;p&gt;Which feature creates the highest gross profit?&lt;/p&gt;

&lt;p&gt;Which popular feature becomes less profitable as usage increases?&lt;/p&gt;

&lt;p&gt;Which customer appears valuable in the CRM but loses money after its actual resource consumption is included?&lt;/p&gt;

&lt;p&gt;This is not merely a finance problem. &lt;a href="https://aws.amazon.com/blogs/apn/saas-cost-attribution-how-to-align-technology-with-business/" rel="noopener noreferrer"&gt;AWS’s work on SaaS cost attribution&lt;/a&gt; makes the architectural implication clear: understanding resource consumption at the tenant and feature level can influence pricing, product decisions, and architecture itself.&lt;/p&gt;

&lt;p&gt;That is a radically better framing than “engineering needs to reduce cloud costs.”&lt;/p&gt;

&lt;p&gt;Cost is not something finance discovers after engineering has finished building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost is an output of the architecture.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Should Travel With the Request
&lt;/h2&gt;

&lt;p&gt;Most applications already propagate context through their systems.&lt;/p&gt;

&lt;p&gt;A request may carry a user ID, tenant ID, trace ID, session ID, request ID, experiment ID, region, and application version.&lt;/p&gt;

&lt;p&gt;Why not economic context?&lt;/p&gt;

&lt;p&gt;Suppose an AI workflow generates an event after each billable or resource-intensive operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tenant_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tenant_482"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deep_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contract_analysis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model_provider"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"large_model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input_units"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;43820&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output_units"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"estimated_cost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.173&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"req_91af"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026.08.18"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not intended to replace the provider's invoice.&lt;/p&gt;

&lt;p&gt;It solves a different problem.&lt;/p&gt;

&lt;p&gt;The invoice tells you &lt;strong&gt;what the company owes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Application-level cost attribution tells you &lt;strong&gt;what created the obligation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once that information exists, entirely new questions become easy to answer.&lt;/p&gt;

&lt;p&gt;You can compare feature revenue with feature cost. You can identify customers whose usage patterns are structurally different from everyone else's. You can discover that a new release increased the cost of a workflow. You can compare two implementations not only on latency but on cost per successful outcome.&lt;/p&gt;

&lt;p&gt;Most importantly, engineers gain a feedback loop.&lt;/p&gt;

&lt;p&gt;Without that loop, architecture has financial side effects that remain invisible until someone notices the monthly bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Dangerous Customer May Be Your “Best” Customer
&lt;/h2&gt;

&lt;p&gt;SaaS dashboards train teams to celebrate heavy users.&lt;/p&gt;

&lt;p&gt;More sessions.&lt;/p&gt;

&lt;p&gt;More queries.&lt;/p&gt;

&lt;p&gt;More generated content.&lt;/p&gt;

&lt;p&gt;More uploaded files.&lt;/p&gt;

&lt;p&gt;More API calls.&lt;/p&gt;

&lt;p&gt;Usually, those are good signs.&lt;/p&gt;

&lt;p&gt;But usage and value are not identical.&lt;/p&gt;

&lt;p&gt;Consider two customers paying $500 per month.&lt;/p&gt;

&lt;p&gt;Customer A makes 2,000 lightweight requests, rarely contacts support, and consumes $35 of variable infrastructure.&lt;/p&gt;

&lt;p&gt;Customer B makes 70,000 requests, uploads unusually large files, frequently triggers the most expensive workflow, stores enormous amounts of generated data, and consumes $430 of variable infrastructure.&lt;/p&gt;

&lt;p&gt;A revenue dashboard sees two $500 customers.&lt;/p&gt;

&lt;p&gt;An economic model sees two completely different products being delivered at the same price.&lt;/p&gt;

&lt;p&gt;This becomes especially important when software contains AI workloads. The economics of AI are unusually sensitive to behavior because the cost of serving two apparently identical users can differ dramatically depending on context size, model selection, number of generations, retries, media processing, agent loops, or tool calls.&lt;/p&gt;

&lt;p&gt;That is one reason &lt;a href="https://stripe.com/resources/more/pricing-strategies-for-ai-companies" rel="noopener noreferrer"&gt;Stripe’s analysis of pricing for AI products&lt;/a&gt; focuses on connecting pricing with actual consumption and underlying compute economics rather than assuming the traditional flat subscription automatically works.&lt;/p&gt;

&lt;p&gt;Developers do not need to become pricing consultants to care about this.&lt;/p&gt;

&lt;p&gt;They need to understand that &lt;strong&gt;unbounded product behavior can create unbounded financial behavior&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Infinite Loop Can Now Appear on the Income Statement
&lt;/h2&gt;

&lt;p&gt;Software engineers already protect systems against technical runaway conditions.&lt;/p&gt;

&lt;p&gt;We limit recursion.&lt;/p&gt;

&lt;p&gt;We set timeouts.&lt;/p&gt;

&lt;p&gt;We cap retries.&lt;/p&gt;

&lt;p&gt;We rate-limit APIs.&lt;/p&gt;

&lt;p&gt;We kill jobs that run for too long.&lt;/p&gt;

&lt;p&gt;We stop queues from expanding indefinitely.&lt;/p&gt;

&lt;p&gt;But consider an AI agent.&lt;/p&gt;

&lt;p&gt;The agent receives a task, calls a model, invokes a tool, reads the result, decides it needs more information, calls another tool, queries the model again, retries an unsuccessful step, expands its context, and repeats the cycle.&lt;/p&gt;

&lt;p&gt;From a technical perspective, the workflow may still be functioning exactly as designed.&lt;/p&gt;

&lt;p&gt;From an economic perspective, it may have entered a runaway loop.&lt;/p&gt;

&lt;p&gt;This produces a new category of engineering requirement: &lt;strong&gt;financial bounds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An operation should not only have a timeout. It may need a cost ceiling.&lt;/p&gt;

&lt;p&gt;A job should not only have a maximum retry count. It may need a maximum cumulative inference budget.&lt;/p&gt;

&lt;p&gt;A customer should not only have an API rate limit. The application may need a resource budget based on the economics of the customer's plan.&lt;/p&gt;

&lt;p&gt;A feature should not only satisfy latency and reliability requirements. It may need an acceptable cost-per-successful-execution range.&lt;/p&gt;

&lt;p&gt;That sounds obvious once stated.&lt;/p&gt;

&lt;p&gt;It is rarely treated as a first-class software requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put Economics Into the Pull Request
&lt;/h2&gt;

&lt;p&gt;Here is where things get more interesting.&lt;/p&gt;

&lt;p&gt;Suppose a developer improves an AI workflow.&lt;/p&gt;

&lt;p&gt;The old implementation makes one expensive model call.&lt;/p&gt;

&lt;p&gt;The new implementation performs five smaller calls because the developer discovers that decomposition improves answer quality.&lt;/p&gt;

&lt;p&gt;The accuracy benchmark improves 8%.&lt;/p&gt;

&lt;p&gt;The latency remains acceptable.&lt;/p&gt;

&lt;p&gt;Tests pass.&lt;/p&gt;

&lt;p&gt;The pull request looks excellent.&lt;/p&gt;

&lt;p&gt;But suppose the cost per successful workflow rises from $0.11 to $0.39.&lt;/p&gt;

&lt;p&gt;Is the new version better?&lt;/p&gt;

&lt;p&gt;There is no universal answer.&lt;/p&gt;

&lt;p&gt;If customers pay $20 every time the workflow succeeds, almost certainly.&lt;/p&gt;

&lt;p&gt;If it is included without limits inside a $9 monthly plan, perhaps not.&lt;/p&gt;

&lt;p&gt;The point is that &lt;strong&gt;the economic regression belongs in the engineering discussion&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Teams already reject code because it creates unacceptable latency, memory consumption, security exposure, or reliability risk.&lt;/p&gt;

&lt;p&gt;Why should a 250% increase in variable cost remain invisible?&lt;/p&gt;

&lt;p&gt;For measurable workflows, teams can go surprisingly far with simple tooling.&lt;/p&gt;

&lt;p&gt;A benchmark suite can record the number of external calls.&lt;/p&gt;

&lt;p&gt;It can record input and output units.&lt;/p&gt;

&lt;p&gt;It can estimate compute duration.&lt;/p&gt;

&lt;p&gt;It can compare those values with a baseline.&lt;/p&gt;

&lt;p&gt;It can flag a pull request that makes a common workflow dramatically more expensive.&lt;/p&gt;

&lt;p&gt;Not every cost estimate will be perfect. It does not need to be.&lt;/p&gt;

&lt;p&gt;A smoke detector does not need to calculate the insurance value of the house before it becomes useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Database Query That Saves $50,000 Is Still an Optimization
&lt;/h2&gt;

&lt;p&gt;Developers frequently debate optimization using technical language.&lt;/p&gt;

&lt;p&gt;This query is 200 milliseconds faster.&lt;/p&gt;

&lt;p&gt;This cache reduces database load.&lt;/p&gt;

&lt;p&gt;This architecture supports more requests per second.&lt;/p&gt;

&lt;p&gt;This model produces better answers.&lt;/p&gt;

&lt;p&gt;Those are legitimate improvements.&lt;/p&gt;

&lt;p&gt;But at sufficient scale, some of the highest-impact performance work may be invisible when measured only in milliseconds.&lt;/p&gt;

&lt;p&gt;Imagine that a high-volume request performs three redundant database operations. Removing them saves an amount so small per request that nobody cares during development.&lt;/p&gt;

&lt;p&gt;Multiply that amount across hundreds of millions of executions.&lt;/p&gt;

&lt;p&gt;Now it matters.&lt;/p&gt;

&lt;p&gt;Or imagine that an image-processing workflow keeps the original, intermediate files, generated variants, and debug artifacts forever.&lt;/p&gt;

&lt;p&gt;Nothing breaks.&lt;/p&gt;

&lt;p&gt;Storage simply compounds.&lt;/p&gt;

&lt;p&gt;Or a tracing configuration sends huge payloads for successful requests that nobody will ever inspect.&lt;/p&gt;

&lt;p&gt;Or an AI application sends an entire conversation history back to a model even when only a small section is relevant.&lt;/p&gt;

&lt;p&gt;Technically, the product works.&lt;/p&gt;

&lt;p&gt;Economically, the implementation contains waste.&lt;/p&gt;

&lt;p&gt;The important shift is not “developers should always choose the cheapest architecture.”&lt;/p&gt;

&lt;p&gt;That would be bad engineering.&lt;/p&gt;

&lt;p&gt;The shift is: &lt;strong&gt;developers should be able to see the economic consequence of architectural choices.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes paying more is absolutely correct.&lt;/p&gt;

&lt;p&gt;A more expensive model may improve conversion enough to justify itself.&lt;/p&gt;

&lt;p&gt;Additional redundancy may be essential for reliability.&lt;/p&gt;

&lt;p&gt;Lower latency may generate enough business value to justify significantly higher infrastructure spend.&lt;/p&gt;

&lt;p&gt;Premium observability may reduce incident duration.&lt;/p&gt;

&lt;p&gt;The goal is not minimum cost.&lt;/p&gt;

&lt;p&gt;The goal is deliberate cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Unlimited” Is an Engineering Decision
&lt;/h2&gt;

&lt;p&gt;Product teams love the word “unlimited.”&lt;/p&gt;

&lt;p&gt;Customers do too.&lt;/p&gt;

&lt;p&gt;Engineers should hear something else when they see it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What technically prevents one user from consuming 10,000 times more resources than another user paying the same price?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the answer is that nothing prevents it because marginal cost really is negligible.&lt;/p&gt;

&lt;p&gt;Fine.&lt;/p&gt;

&lt;p&gt;Sometimes the answer is that extreme usage is statistically rare enough that the economics still work.&lt;/p&gt;

&lt;p&gt;Also fine.&lt;/p&gt;

&lt;p&gt;But sometimes “unlimited” simply means nobody modeled the tail.&lt;/p&gt;

&lt;p&gt;Average users are frequently irrelevant to infrastructure risk. Outliers matter.&lt;/p&gt;

&lt;p&gt;The same principle appears in performance engineering.&lt;/p&gt;

&lt;p&gt;A system with a 100 ms average response time can still be terrible if its tail latency is 12 seconds.&lt;/p&gt;

&lt;p&gt;Product economics also have tails.&lt;/p&gt;

&lt;p&gt;The average customer may cost $6 per month to serve while the top one percent costs $90.&lt;/p&gt;

&lt;p&gt;If pricing was designed around the average, growth can gradually select for the customers who exploit the mismatch most effectively.&lt;/p&gt;

&lt;p&gt;That is not abuse.&lt;/p&gt;

&lt;p&gt;They are using the product you sold them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a Cost Map Before You Build a Cost Dashboard
&lt;/h2&gt;

&lt;p&gt;You do not need a massive FinOps implementation to start.&lt;/p&gt;

&lt;p&gt;You need to understand where money enters the execution path.&lt;/p&gt;

&lt;p&gt;For one important customer action, trace the full chain from click to result and identify every resource whose cost changes with usage.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger:&lt;/strong&gt; user requests a video analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variable work:&lt;/strong&gt; upload, transcoding, model inference, object storage, database operations, data transfer, notifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost driver:&lt;/strong&gt; video duration, resolution, model runtime, generated output size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer dimension:&lt;/strong&gt; tenant, plan, geography, contract type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product dimension:&lt;/strong&gt; feature, workflow version, experiment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business output:&lt;/strong&gt; successful analysis, revenue associated with usage, gross contribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the only list this article needs because the important part comes afterward.&lt;/p&gt;

&lt;p&gt;Instrument one workflow.&lt;/p&gt;

&lt;p&gt;Not the entire company.&lt;/p&gt;

&lt;p&gt;Pick the feature that is expensive, rapidly growing, strategically important, or difficult to understand.&lt;/p&gt;

&lt;p&gt;Then ask a question most teams cannot currently answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens to our gross profit if usage of this exact feature increases 10x tomorrow?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer requires three people, two spreadsheets, a cloud invoice, and a week of analysis, the architecture is hiding business-critical information.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best Architecture May Depend on Who Is Using It
&lt;/h2&gt;

&lt;p&gt;Cost attribution also complicates a sacred engineering instinct: finding the single “best” implementation.&lt;/p&gt;

&lt;p&gt;There may not be one.&lt;/p&gt;

&lt;p&gt;An enterprise customer paying $50,000 per year might justify a computationally expensive workflow that produces the highest possible accuracy.&lt;/p&gt;

&lt;p&gt;A self-service customer paying $12 per month may need a different model, smaller context window, lower retention period, asynchronous processing, or stricter usage limits.&lt;/p&gt;

&lt;p&gt;That is not necessarily an inferior product.&lt;/p&gt;

&lt;p&gt;It is resource allocation.&lt;/p&gt;

&lt;p&gt;Cloud architecture already changes resources according to workload. Product architecture can do the same according to economics.&lt;/p&gt;

&lt;p&gt;Model routing is an obvious example.&lt;/p&gt;

&lt;p&gt;A request does not automatically need the most capable model available.&lt;/p&gt;

&lt;p&gt;A lightweight classification might go to a smaller model. An ambiguous case can escalate. A high-value workflow can justify a more expensive path. Repeated context can be cached. Inputs can be compressed. Work that does not require immediate completion can be batched.&lt;/p&gt;

&lt;p&gt;The interesting engineering problem becomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the cheapest execution path that still delivers the required outcome?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is much better than asking engineers to “cut AI costs.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Unit Test Knows Whether the Function Works. It Could Also Know Whether the Business Model Still Works.
&lt;/h2&gt;

&lt;p&gt;Software development has spent decades moving failure detection earlier.&lt;/p&gt;

&lt;p&gt;We moved testing from users to QA.&lt;/p&gt;

&lt;p&gt;Then from QA to automated test suites.&lt;/p&gt;

&lt;p&gt;Then into continuous integration.&lt;/p&gt;

&lt;p&gt;We moved security checks into development pipelines.&lt;/p&gt;

&lt;p&gt;We moved dependency scanning into pull requests.&lt;/p&gt;

&lt;p&gt;We moved performance benchmarks closer to the code.&lt;/p&gt;

&lt;p&gt;The same direction makes sense for variable product economics.&lt;/p&gt;

&lt;p&gt;A feature whose economics are only discovered on a monthly invoice has a feedback loop measured in weeks.&lt;/p&gt;

&lt;p&gt;A feature whose resource consumption is measured during development has a feedback loop measured in minutes.&lt;/p&gt;

&lt;p&gt;That does not mean putting the CFO in GitHub.&lt;/p&gt;

&lt;p&gt;It means recognizing a simple truth:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In modern metered software, cost is increasingly a runtime property.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Runtime properties belong close to engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Next Generation of Great Developers Will Understand the Machine and the Meter
&lt;/h2&gt;

&lt;p&gt;There was a period when a developer could reasonably treat infrastructure economics as someone else's concern.&lt;/p&gt;

&lt;p&gt;Servers were purchased centrally. Finance handled contracts. Product set pricing. Engineering built the application.&lt;/p&gt;

&lt;p&gt;Cloud computing already weakened that separation.&lt;/p&gt;

&lt;p&gt;Serverless weakened it further.&lt;/p&gt;

&lt;p&gt;API-first software weakened it again.&lt;/p&gt;

&lt;p&gt;AI may finally destroy it.&lt;/p&gt;

&lt;p&gt;A developer can now add a few lines of code and change the company's variable cost structure instantly. Choosing a different model, changing context length, adding a second validation pass, moving data between regions, retaining files longer, increasing observability volume, or introducing a third-party API can alter the economics of a feature without changing its price by one cent.&lt;/p&gt;

&lt;p&gt;That gives engineers more responsibility.&lt;/p&gt;

&lt;p&gt;It also gives them more influence.&lt;/p&gt;

&lt;p&gt;The developer who can say, “This version is faster,” is useful.&lt;/p&gt;

&lt;p&gt;The developer who can say, “This version is faster, improves successful completion by 6%, and reduces cost per successful task by 31%,” is participating in the business at an entirely different level.&lt;/p&gt;

&lt;p&gt;The future of software engineering is not about turning developers into accountants.&lt;/p&gt;

&lt;p&gt;It is about giving architecture one more observable property.&lt;/p&gt;

&lt;p&gt;We already measure whether software works.&lt;/p&gt;

&lt;p&gt;We measure how fast it works.&lt;/p&gt;

&lt;p&gt;We measure whether it is available.&lt;/p&gt;

&lt;p&gt;We measure whether it is secure.&lt;/p&gt;

&lt;p&gt;Now, for the growing class of software in which every meaningful action consumes metered resources, we should measure one more thing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was executing it worth what it cost?&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Most Dangerous File in Your Repo Might Be SECURITY.md</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Tue, 18 Aug 2026 12:41:53 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/the-most-dangerous-file-in-your-repo-might-be-securitymd-5e52</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/the-most-dangerous-file-in-your-repo-might-be-securitymd-5e52</guid>
      <description>&lt;p&gt;Developers write far more legally consequential prose than they think, and almost none of it is code. It's the SECURITY.md in the repo root. It's the "Security" page someone in marketing asked you to fill in three years ago. It's the status page update typed at 2 a.m., and the sentence in a customer notice specifying exactly which data was affected. The research summarized in &lt;a href="https://arcarrierpoint.net/what-research-says-about-cyber-incident-disclosure/" rel="noopener noreferrer"&gt;this overview of what the evidence shows about cyber incident disclosure&lt;/a&gt; treats post-breach communication as a measurable discipline with predictable failure modes — and the enforcement record of the last three years has quietly turned it into an engineering discipline too. In the most closely watched cybersecurity case of the decade, the only allegation that survived a motion to dismiss concerned a technical description of access controls posted on a website.&lt;/p&gt;

&lt;h2&gt;
  
  
  The claim that survived was written by engineers
&lt;/h2&gt;

&lt;p&gt;On July 18, 2024, Judge Paul Engelmayer of the Southern District of New York issued a 107-page opinion in the SEC's case against SolarWinds and its CISO. Most of it was a defeat for the agency. Claims built on blog posts, press releases, and podcast appearances were dismissed as &lt;strong&gt;non-actionable corporate puffery&lt;/strong&gt; — statements too general for any reasonable investor to lean on. The theory that cybersecurity controls fall under "internal accounting controls" was rejected outright. Post-incident 8-K disclosures were held to be reasonable given what was knowable at the time.&lt;/p&gt;

&lt;p&gt;One thing lived: the company's "Security Statement," a technical page describing its practices to customers. The court let claims proceed specifically on its representations about &lt;strong&gt;access controls and password policy&lt;/strong&gt;, because those were concrete enough to rely on and, as pled, contradicted by internal presentations, security assessments, and Slack messages. The SEC ultimately dismissed the whole action with prejudice in November 2025, so no liability was ever established — but the legal line drawn in 2024 didn't go anywhere. Vague marketing language is protected precisely because it says nothing. The specific, verifiable technical claim is the one with teeth.&lt;/p&gt;

&lt;p&gt;Read that sentence again if you maintain a trust page. "We take security seriously" is legally inert. "All administrative access requires MFA" is a factual assertion about your infrastructure that someone will one day compare against your actual IAM configuration, your Jira backlog, and your team's Slack history.&lt;/p&gt;

&lt;h2&gt;
  
  
  A file-name review became a false public statement
&lt;/h2&gt;

&lt;p&gt;The second case is more uncomfortable, because the mistake was a technical judgment call that any of us could make under pressure.&lt;/p&gt;

&lt;p&gt;Blackbaud discovered a ransomware intrusion in May 2020. To scope it, technology staff reviewed the &lt;strong&gt;names&lt;/strong&gt; of exfiltrated files rather than analyzing their contents. Based on that review, the company posted a notice in July 2020 telling customers the attacker had not accessed bank account information or Social Security numbers. Then customers began writing in — over a thousand messages — many pointing out that they had entered sensitive data into fields the software did not encrypt. Deeper analysis confirmed unencrypted bank account details and Social Security numbers had in fact been taken. That finding never reached the people responsible for the company's public disclosures, and the website statement stayed uncorrected while a later quarterly filing described data-exfiltration risk as hypothetical. &lt;a href="https://www.sec.gov/files/litigation/admin/2023/33-11165.pdf" rel="noopener noreferrer"&gt;The SEC's settled order&lt;/a&gt; imposed a $3 million penalty in March 2023, without alleging intentional misconduct.&lt;/p&gt;

&lt;p&gt;There is no villain in that story. There is a scoping shortcut, a schema assumption ("that field holds notes, not SSNs"), and a missing edge in the org chart between the person who learned the truth and the person who had published the falsehood. All three are engineering artifacts.&lt;/p&gt;

&lt;h2&gt;
  
  
  It is not only a public-company problem
&lt;/h2&gt;

&lt;p&gt;Anyone at a startup assuming this is a Fortune 500 concern should read &lt;a href="https://www.ftc.gov/news-events/news/press-releases/2025/05/ftc-finalizes-order-godaddy-over-data-security-failures" rel="noopener noreferrer"&gt;the FTC's finalized order against GoDaddy&lt;/a&gt; from May 2025. The agency's theory was straightforward: the company advertised "award-winning security" while lacking multi-factor authentication, threat monitoring, and secure connections for customer data. Section 5 of the FTC Act reaches any company making deceptive claims, private or public, seed-stage or not. The remedy reads like a backlog someone else wrote for you — mandatory MFA including at least one method that doesn't require a phone number, HTTPS on APIs handling covered information, an update-management program, biennial third-party assessments, and incident reporting to the Commission within ten days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why silence is not the safe default
&lt;/h2&gt;

&lt;p&gt;The instinct after reading all this is to say nothing about security anywhere, ever. The empirical record argues the opposite. In a study published in the &lt;em&gt;Review of Accounting Studies&lt;/em&gt;, Amir, Levi, and Livne compared attacks companies disclosed themselves against attacks that were concealed and later surfaced by outsiders. Withheld incidents were associated with roughly a &lt;strong&gt;3.6% decline&lt;/strong&gt; in equity value in the month of discovery; disclosed incidents, around &lt;strong&gt;0.7%&lt;/strong&gt;. Their model also suggested managers tend to speak only once outsiders already suspect an attack with about 40% probability — meaning the incidents that stay hidden skew toward the severe ones, and the "breaches don't really hurt stock prices" folk wisdom is built largely on the mild cases that got announced.&lt;/p&gt;

&lt;p&gt;So the goal is not silence. It is writing things that stay true under adversarial reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Describe controls that are enforced, not intended.&lt;/strong&gt; If MFA is required for 94% of admin accounts, the honest sentence names the exception. A published claim your own audit log contradicts is the exact shape of every case above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version your security page like code.&lt;/strong&gt; Keep it in the repo, require review, and let &lt;code&gt;git log&lt;/code&gt; prove when each claim was accurate. An undated marketing page is a permanent unqualified assertion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never scope a breach by metadata alone.&lt;/strong&gt; File names, table names, and bucket paths describe intent, not contents. Users put card numbers in "comments" fields. Verify before publishing a negative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer "we have confirmed X" over "Y did not happen."&lt;/strong&gt; Negative claims require exhaustive verification; positive claims about confirmed findings age gracefully as the investigation continues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make correction a defined path, not a favor.&lt;/strong&gt; Whoever discovers the earlier statement was wrong needs a named recipient and an obligation to use it. Blackbaud's penalty rests substantially on that link being absent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assume Slack is exhibit A.&lt;/strong&gt; Internal messages contradicting public claims were central to the surviving SolarWinds allegation. Write internally as though it will be read aloud, not because you're hiding anything, but because accurate internal writing is what makes accurate public writing possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The uncomfortable summary
&lt;/h2&gt;

&lt;p&gt;Nothing in the enforcement record punishes being breached. Courts and regulators accept that competent organizations get compromised. What draws liability is the delta between what a company published about itself and what its own engineers knew — a gap authored, almost always, by people writing documentation rather than exploits.&lt;/p&gt;

&lt;p&gt;The fix isn't legal review of everything. It's treating security documentation as a claim about a system, with the same expectation of verification you'd apply to any other assertion about production. If you can't point to the control that makes a sentence true, delete the sentence.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>github</category>
      <category>security</category>
      <category>software</category>
    </item>
    <item>
      <title>The Engineering Principle Your Startup's Balance Sheet Is Missing</title>
      <dc:creator>Sonia Bobrik</dc:creator>
      <pubDate>Tue, 18 Aug 2026 12:36:54 +0000</pubDate>
      <link>https://dev.to/sonia_bobrik_1939cdddd79d/the-engineering-principle-your-startups-balance-sheet-is-missing-4l2k</link>
      <guid>https://dev.to/sonia_bobrik_1939cdddd79d/the-engineering-principle-your-startups-balance-sheet-is-missing-4l2k</guid>
      <description>&lt;p&gt;Developers spend years internalizing a simple truth: unreadable code eventually kills a project, no matter how clever it is. What most of us never notice is that the same law governs the business wrapped around our code, and a recent piece arguing that &lt;a href="https://intelligentnews.co.uk/the-new-financial-edge-is-not-growth-it-is-legibility/" rel="noopener noreferrer"&gt;the real financial edge is legibility, not growth&lt;/a&gt;, makes that connection impossible to ignore. A company whose finances cannot be read quickly by an investor, a lender, or a senior engineer deciding whether to accept an offer is carrying the corporate equivalent of a 4,000-line function with no tests. It might run today. Nobody can safely bet on it tomorrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Engineers Should Care About a Finance Concept
&lt;/h2&gt;

&lt;p&gt;If you write software for a living, your salary, your equity, and your roadmap all sit downstream of decisions made by people reading your company's numbers. When those numbers are confusing, the confusion does not stay in the finance department. It shows up as a hiring freeze announced without warning, a "strategic pivot" that kills the service you spent a year building, or a funding round that closes on brutal terms because investors priced in uncertainty.&lt;/p&gt;

&lt;p&gt;Paul Graham captured the core question years ago in his essay on whether a startup is &lt;a href="https://www.paulgraham.com/aord.html" rel="noopener noreferrer"&gt;default alive or default dead&lt;/a&gt;: given current growth and current spending, does the company reach profitability before the money runs out? What is striking about that framing is how few founders can answer it, and how few engineers ever think to ask. Legibility starts exactly there. A financially legible company can answer that question in one sentence, with numbers, on any given Tuesday.&lt;/p&gt;

&lt;p&gt;The parallel to software is almost mechanical. &lt;strong&gt;Technical debt&lt;/strong&gt; is the gap between how a system behaves and how easily that behavior can be understood. &lt;strong&gt;Financial illegibility&lt;/strong&gt; is the gap between how a business performs and how easily that performance can be verified. Both compound quietly. Both feel free right up until the moment someone external needs to evaluate you, whether that is a new team member reading the codebase or a bank reading the ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading a Company the Way You Read a Codebase
&lt;/h2&gt;

&lt;p&gt;Engineers already own the mental tools for this. You know how to trace data flow, distinguish signal from noise, and spot the difference between a system that works and a system that merely demos well. Applied to a business, that skill set translates into a short review checklist worth running before you join a startup, accept equity in place of cash, or push your own side project toward incorporation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trace the cash, not the revenue.&lt;/strong&gt; Revenue is a promise; cash arriving in the account is the merged pull request. Ask how long the gap is between "customer signed" and "money landed."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the dependencies.&lt;/strong&gt; One customer generating 40% of income is a single point of failure, exactly like one unmaintained library holding up production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for observability.&lt;/strong&gt; Can leadership produce current runway, gross margin, and burn within a day? If the answer requires "pulling some things together," the monitoring stack is fiction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the error handling.&lt;/strong&gt; How does the company behave when a big invoice is paid late? Improvised panic is a smell; a documented playbook is a feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspect the interfaces.&lt;/strong&gt; Do the story told to investors, the story told to employees, and the actual ledger describe the same system? Divergence between docs and code is always a warning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the only list you need, because the underlying move is singular: treat the business as a system under review and refuse to accept "trust me, it's fine" as a substitute for readable state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working Capital Is Just Memory Management
&lt;/h2&gt;

&lt;p&gt;The least glamorous concept in this whole domain turns out to be the most decisive one. Working capital, which Investopedia defines cleanly as the difference between &lt;a href="https://www.investopedia.com/terms/w/workingcapital.asp" rel="noopener noreferrer"&gt;current assets and current liabilities&lt;/a&gt;, is effectively a company's available RAM. Inventory sitting in a warehouse is allocated memory doing nothing. Unpaid invoices are pointers to money that exists in theory. A business can post impressive growth while leaking working capital the way a service leaks memory: everything looks fine on the dashboard until the process gets killed at 3 a.m.&lt;/p&gt;

&lt;p&gt;For anyone freelancing or running a small SaaS, this stops being an analogy and becomes daily reality. Invoicing the day work ships, setting payment terms before delivery rather than after, and knowing your personal runway to the week are not accounting chores. They are the financial equivalent of writing tests before merging: small disciplines that make your entire operation auditable by anyone, including future you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Legibility Is a Feature You Can Ship
&lt;/h2&gt;

&lt;p&gt;Here is the optimistic ending, and it is genuinely optimistic. Unlike growth, which depends heavily on market luck, legibility is fully within your control. You can ship it. A one-page document explaining how your project makes money, a spreadsheet that reconciles with the bank account, a public changelog of pricing decisions, a straight answer to the default-alive question: each of these is a pull request against the fog.&lt;/p&gt;

&lt;p&gt;The companies and the individual developers who win the next few years will not necessarily be the fastest-growing ones. They will be the ones that are easiest to believe, because every claim they make can be traced to evidence in constant time. Make your finances as readable as you wish every codebase were, and you will have built the rarest asset in a skeptical market: a story that survives code review.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
