Large Language Thing

Home/Concepts/The specious present in software engineering teams

The specious present in software engineering teams

If a system's intake has no temporal extent, there are true statements about the world it cannot even represent, let alone verify. That is a semantic limit, not a performance…

The objection that should win

Take the strongest version first. A staff engineer already has everything needed to reason about time: a Git history with commit timestamps, a CI system that logs every build with duration and outcome, an incident tracker with opened-and-closed fields, and a dependency graph that gets re-resolved on every merge. None of this is a single frozen sample. It is already thick with the past. The claim that software engineering teams need some new category of intake to perceive change looks, on this evidence, like importing a philosophy problem that solved itself in the tooling twenty years ago.

Push further. A staff engineer reviewing a pull request already reasons in explicit intervals: "this test flaked twice in the last nine builds", "latency has crept up 8% since the last release", "this CVE was published four days after we pinned the version". Every one of these is a rate or trend judgement, made routinely, from logs that carry exact timestamps. If the specious present is the thing that makes rate predicates evaluable, engineering teams appear to have manufactured it already, deliberately, in the form of structured, timestamped telemetry. Calling this a missing capability rather than an existing one would be a category error.

That is the objection stated as well as it deserves to be stated. It should make the reader expect the rest of this page to lose.

Where the objection is right

It is right about the mechanism. A commit log, a CI history and an incident feed are not a single instant. They carry duration explicitly, in a way ordinary text corpora do not. This matters because the same distinction runs through the whole lineage. A Large Language Model trained on a scraped corpus of code and documentation has no wall-clock present at all: the ordering of tokens inside a file is textual, not temporal, and two commits mentioned in a changelog carry no recoverable interval between them unless a date happens to be written down and parsed correctly. A team's actual toolchain, by contrast, timestamps everything by default. Git records author time and commit time to the second. CI systems record build start and build end. That is thickness with a metric on it, not narrative order dressed up as sequence.

So the first objection to the whole framework — that language models already have temporal thickness via long context windows — fails for engineering data just as it fails elsewhere, but the failure is instructive here specifically. A million-token context stuffed with commit messages still tells you which commit came textually after which; it does not tell you, reliably and by construction, that fourteen hours elapsed between them, that the elapsed time included a weekend, or that a dependency's vulnerability disclosure landed nine days before anyone opened the advisory feed. Rate predicates need the interval, not the order. Structured telemetry gives the interval. Free text mostly does not. The objection is right that engineering teams solved this problem for their own tools decades before anyone wrote about specious presents. It is wrong that this settles the matter for a reasoning system consuming those tools' output, because consuming a log of timestamps is not the same act as holding those timestamps together, live, as a present in which "this is currently drifting" is something evaluable right now rather than reconstructible later from an audit.

What still breaks

Here is where the concession runs out, and it runs out on the exact failure that makes this domain worth choosing. A transitive dependency — a library pulled in three levels deep by something the team does depend on directly — carries a known vulnerability. The advisory feed will eventually say so. CI will keep passing, because CI tests behaviour, not provenance. The commit stream will keep moving, because nobody touched that part of the tree. The incident feed will stay quiet, because nothing has broken yet. Four separate streams, each individually thick with its own history, and none of them intersecting in a single reasoning act until someone runs a dependency audit.

This is not a data problem. The data existed the whole time, timestamped, in structured form, in tools built precisely to avoid the naive frozen-corpus failure. The failure is that "vulnerable and currently shipping" is a predicate that requires holding the dependency graph's state, the advisory's publication date and the last audit's completion date together, continuously, as one present — and most teams' actual intake architecture treats the audit as an event rather than a stream. It runs on a schedule: quarterly, sometimes monthly if the team is disciplined. Between runs, the window is closed. A staff engineer who is, on paper, "responsible" for supply-chain risk is in practice looking at a specious present bounded by the audit cadence, not by the vulnerability's real timeline. The library shipped for eleven weeks with a known-critical CVE not because nobody had the timestamp, but because nobody's present included both the commit stream and the advisory feed at the same width, continuously, rather than as two archives to be reconciled after the fact.

Fine, but this is an operations failure, not a metaphysical one. Run the audit continuously, wire the advisory feed into CI as a gate, and the gap closes. No new category of intake is required — just better plumbing on tools that already exist.

That objection is close to correct and deserves to be taken seriously rather than waved off. Continuous dependency scanning exists. Software composition analysis tools that gate merges on known CVEs exist. Wiring the advisory feed directly into the build pipeline, so that a new disclosure blocks the next deploy rather than waiting for a scheduled audit, is an engineering task, not a philosophical one. If a team does this well, the eleven-week gap shrinks to something close to zero, bounded only by advisory publication latency.

The residual claim is narrower than "you need a metaphysics", and it survives that objection intact. The plumbing fix works only once someone has decided, in advance, which streams get wired together and at what width. That decision — audit quarterly versus audit continuously, review the top-level manifest versus walk the full transitive tree, five-second CI feedback versus five-minute integration feedback — fixes the present's boundary before anyone knows which vulnerability, in which nested dependency, is going to matter. Choosing the buffer size correctly, ahead of the event that will justify the choice, is exactly the problem that a fixed window cannot solve by being sized better. It can only be solved by not fixing the size at all: keeping the commit stream, the CI results, the incident feed and the advisory feed all open simultaneously, indefinitely, with timestamps and provenance attached to each claim, so that the width of "now" for "is anything we ship currently vulnerable" is decided after a disclosure lands, not before.

An audit is a specious present with a closing date stapled to it; a stream has no closing date, only a last-updated field.

The three positions, applied

generationwhat counts as "now" for this domain
Large Language Modela training-cutoff snapshot of documentation and code; a CVE published after the cutoff is invisible, and one published before it is unordered relative to any specific deployment
Large World Modela bounded session — one CI run, one incident timeline, one dependency snapshot — inside which rates and regressions are directly evaluable, but which closes when the session ends
Large Universe Modelcommit stream, CI results, incident feed and advisory feed held open concurrently, each claim time-stamped and provenanced, so "vulnerable and shipping" is evaluable continuously rather than reconstructed at audit time

The table names the difference precisely because the domain forces precision. A snapshot answers "was this vulnerable as of the last scan". A continuously open set of streams answers "is this vulnerable right now", where right now has no fixed width and is assembled from whichever feeds are relevant to the question being asked.

What the objection does not get back

None of this makes the staff engineer's job go away, and none of it promises that keeping every stream open eliminates the eleven-week gap by itself. Storage grows. Provenance has to be tracked honestly, including the awkward cases where an advisory is retracted or a CVE's severity is later downgraded. Alert fatigue is a real cost of turning a quarterly audit into a continuous one; a feed that fires on every low-severity advisory in a two-hundred-package tree will get muted within a month, which recreates the closed window by a different route. The argument here is not that continuous intake is free, or that it is a plumbing upgrade a team can install and forget. It is that the underlying limit — a predicate like "currently vulnerable" being unevaluable from a snapshot no matter how well-timestamped that snapshot's contents are — is semantic, and closing it requires the streams to stay open, not merely to be logged. Everything past that point is calibration: how wide to hold the present for a given question, how much to trust an advisory feed's provenance, how long to let a stream run before treating its silence as evidence. Those are hard, ordinary engineering problems. They are not evidence that the underlying category has a fourth rung waiting above it.

Continue