IRFlow Timeline 1.0.11 — Computer History, Verified Against the Artifact
Published August 16, 2026
1.0.10 shipped ChatGPT Computer History support built partly on reasoning about how the feature ought to behave. 1.0.11 is what happened when we tested that reasoning against a live 9,000-event capture: four things we told analysts were wrong, and three artifacts were not being collected at all.
Then we asked the same question of Grok Build and Claude Desktop, which had both shipped updates, and found six more stores nobody was reading.
The one that mattered most
We said a credential row could recover the password. The wording was that macOS withholds the field's value "but the keystrokes are captured at hardware level, so typed characters can still appear."
They cannot. When a password field takes focus, macOS engages Secure Input Mode, which blocks the event tap the recorder reads from. The keystrokes consume event ids and are never written. Across the capture, keyboard.text_input records carrying text while secure input was engaged: zero.
The artifact says so plainly once you look. A login sequence recorded the typed username, then a tab into the password field, then two consumed ids with nothing persisted. A loginwindow prompt left a single submit event with text: null.
What a credential row actually gives you is still worth having — a password was entered here, in this app, in this field, at this second — which is enough to time-anchor an authentication event against other logs. It is not the credential, and a report that says otherwise will not survive review.
One value does surface: selecting a secure field yields its masked rendering, a run of bullet characters. Verified byte-level, nothing but U+2022. That discloses the password's length and nothing else.
A check that cleared what it never examined
EventId looked like a capture-global counter. It is not — it restarts at 1 every time the recorder does, and the events carry no session identifier, so the reset is the only run boundary that exists.
Our gap detection compared the last id before a hole with the first id after it. Across a restart that arithmetic goes negative, and a negative shortfall fell into the reassuring branch. The result on a real capture: 183 of 186 gap rows asserted "ids run continuously (17169 → 1), so no events are missing" — clearing thirteen-hour holes it had never assessed.
A check that cannot answer must say so. Restart-spanning gaps are now reported as unassessed, and continuity is only tested within a single run.
Fidelity is measured, not assumed
We had Slack pinned as a metadata-only app on the reasoning that hardened messaging clients do not expose their content. Slack is Electron. It exposed 53,590 characters including channel message text, thread markers and per-message timestamps.
Telegram, in the same capture and the same product category, exposed 144.
The predictor is the UI toolkit, not what the app is for. The tier now takes the more capable of the known-app table and what the application actually produced — so a stale entry can be corrected by evidence, while an app that was only briefly on screen can never be demoted for lack of opportunity. Getting this backwards produced exactly the wrong sentence in a report: we only have one side of the conversation, while the inbound messages sat in ScreenText.
The copy that outlives the evidence
Computer History is not where this data stops. The summariser's own instructions tell the Codex memory consolidator to mine the activity summaries — naming the user-profile section explicitly — and fold them into ~/.codex/memories/.
That store is a different subsystem. It is not purged at 48 hours and it is not cleared with Computer History.
| Copy | Retention |
|---|---|
| Raw event stream | ~48 hours |
| Activity summaries | until the user clears Computer History |
| Consolidated memory | indefinite |
On a stale host, that inverts the collection priority. 1.0.11 collects the lines carrying the [skysight memory] provenance tag and the blocks citing a Skysight resource, and leaves the rest — ordinary conversation memory is a different artifact family.
We were also flattening each summary into one row. The body holds three structurally different assertions, and the largest was invisible: a model-written dossier naming documents, typed search terms and application roles, which survives the raw purge. On the measured host it still named a search term whose primary record was long gone. It now gets its own row, as does the section that carries context in from earlier windows — labelled, because its timestamp does not bound what it describes.
Smaller things that were missing
Mouse modifiers were dropped entirely. A command-click on a link opens it in a background tab: deliberate non-navigation, the signature of bulk-opening results rather than reading one.
Click multiplicity produced ten Activity values — Click (x2) through Click (x10) — for a single action, so filtering for clicks meant ten checkboxes. They are now named for what they mean: Click, Double-Click, Triple-Click, Multi-Click. The exact number was never lost; it has always had its own column.
The same question, asked of two other apps
Computer History was not the only place we had assumed rather than checked. Grok Build and Claude Desktop both shipped updates, so we inventoried what is actually on disk against what the parsers read. Six stores were unread — and every one of them survives deleting the conversation it belongs to, which is exactly when an analyst needs it.
Claude Desktop dates its deletions. Remove a conversation and a file named deleted_<session-uuid> is left in its place. It is thirteen bytes: an epoch-ms timestamp. The filename gives the session, the content gives the moment. Both halves of the finding come from the artifact, and neither was being read. On the measured host, two tombstones sat beside five live sessions.
And it keeps what you sent it. pending-uploads/ retains the files a user attached or pasted into a chat — 84 of them on the measured host, 58.7 MB, spanning six months — held independently of the conversations they went to. We inventory them by path, size and staging time and never read the content: the bytes are evidence to preserve, not text to sweep into a grid.
Grok keeps a second copy of the transcript. sessions/session_search.sqlite is an FTS5 index over session bodies, structurally the same artifact as Cursor's conversation-search.db. It mirrors the session directory and outlives it. Its logs/unified.jsonl separately timestamps every tool execution with an outcome and duration — 4,117 of them across ten days — though never the command itself, which only ever lives in the session's own updates.jsonl. Saying so in the row matters more than the row.
One thing we did not parse. ~/.grok/memtrace/ is 59 MB of JSONL with a name that promises agent memory. It is a memory profiler: allocation samples, resident-set sizes, nothing else. It would have been a day's work to parse and worth nothing. Checking cost ten minutes.
On the shape of this release
Every correction here came from parsing the artifact and comparing it with what we had written, not from re-reading our own notes. Three of the four errors were confident, plausible, and would have survived any amount of internal review — they only fell over against the data. The six missing stores are the same lesson from the other direction: we were not wrong about them, we simply had never looked.
No schema changed. Computer History keeps its 54 columns and the AI history grid keeps its 26 — every new artifact is carried by existing columns under new RecordType values, so existing tabs and saved sessions need no migration.