From 3ab52d3488cf0026160e0d67d218a986a4f85200 Mon Sep 17 00:00:00 2001 From: San Lee <295248956+sanlee-ys@users.noreply.github.com> Date: Tue, 18 Aug 2026 08:20:19 -0400 Subject: [PATCH] docs: the owner drove three captures, and one of them falsified a field The owner drove three captures on 2026-08-17. This records all three. The cursor statusline capture is PAID. A live interactive session at cursor-agent 2026.08.11-e8db854 rendered `ctx 12.7%` after its first reply. So `used_percentage` populates, at one-decimal precision, and the synthesized fixture's assumed shape was correct. That capture ran one build ahead of the section's own pin, and the amendment states it. The agy statusline payload is RE-CAPTURED at 1.1.13, and the pin moves off 1.1.9. Fifteen live payloads confirm FOUR quota buckets rather than two, and the ids are observed rather than inferred from the slash command's human labels. Each of the four carries remaining_fraction, reset_time and reset_in_seconds. `agent_state` is observed live, and it reported one value the documented vocabulary omits. The payload has grown to carry the same context block Claude's payload carries. The same capture FALSIFIED `transcript_path`. The payload drops the `-cli` segment, so it names a directory that exists and is empty while the real transcript sits elsewhere. The refusal to display that field is now a measurement rather than caution. No code follows the path, which was re-checked across the repository, so nothing is broken and nothing is fixed. Nothing new is wired to a renderer or a relay. The composer one-row sighting DOES NOT REPRODUCE. A three-line brief in a live 5-of-5 room at a recorded 170x54 drew three rows, which agrees with the 588-geometry sweep. The sighting is recorded as a probable observation error. The amendment names the limit: 170x54 is a generous geometry and says nothing about the cells near the floor. Two findings go beyond the three captures. A live cursor-agent CLI session draws no HUD row BY DESIGN, because the adapter reads the IDE store and the CLI keeps its own; the ghost-mode hypothesis is therefore recorded as an open measurement about the IDE store instead of as the explanation. And agy sends every context number on the last fire only, with a literal zero before them, which is a zero-versus-absent collapse in the vendor's own serializer. Co-Authored-By: Claude Fable 5 --- STATE.md | 71 ++++++++---- docs/design.md | 199 +++++++++++++++++++++++++++++++++- internal/antigravity/stdin.go | 117 ++++++++++++++++---- 3 files changed, 339 insertions(+), 48 deletions(-) diff --git a/STATE.md b/STATE.md index 49fde3e..4054ab8 100644 --- a/STATE.md +++ b/STATE.md @@ -67,10 +67,12 @@ copies, the gates and the argument; this file does not restate any of them. reaches. It shows no money, and this beat must never promise a price. **Paid, 2026-08-15/16.** A pasted three-line brief was sent with enter: one dispatch, and the newlines verified as bytes in the seat's own - transcript ([design.md §9.38](docs/design.md)'s dated payment). One - caveat rides with it: the composer DREW the three-line draft as one row - (the render gap below), so the demo should type or paste the brief and - trust the wire, not the row count. + transcript ([design.md §9.38](docs/design.md)'s dated payment). + **The render caveat this beat carried is RETIRED, 2026-08-17.** It read + that the composer drew the three-line draft as one row, so the demo should + trust the wire and not the row count. A live 5/5 room at a recorded 170x54 + drew three rows, matching the sweep, so wire AND render are both verified + and the beat can be demonstrated as it reads. 4. **One honesty beat.** A column whose vendor reported no cost renders no cost cell at all. A turn that reported zero renders `$0.0000`. The two states stay apart on screen. The `~` estimate marker is NOT on this @@ -97,8 +99,9 @@ copies, the gates and the argument; this file does not restate any of them. Absent is `null`, a measured zero is `0`, and no optional key is omitted. **The path is frozen as recorded.** Both markers were paid by the owner's - drive on 2026-08-15/16 (race t9), each with a live run behind it. The one - residue is beat 3's render caveat, owned in the gaps below. + drive on 2026-08-15/16 (race t9), each with a live run behind it. Beat 3's + render caveat was the one residue, and it is retired as of 2026-08-17 — the + path now carries no unpaid marker. **Amended 2026-08-17: the beat ORDER is reopened, by the owner's ruling.** A re-cut is planned for the final two weeks before the demo: open on the @@ -148,8 +151,11 @@ copies, the gates and the argument; this file does not restate any of them. under the finish fix (design.md §9.37): 18 seconds to retire, against the 21 minutes that found the bug. §9.38's composer paste is paid too, on Windows Terminal 1.24.11911.0 — one insertion, three composer rows, zero dispatches. - **The one thing still unexercised is named in design.md §9.38** and is not an - arena debt: a pasted multi-line draft has never been sent with enter. + **That §9.38 thread is now closed end to end**, and this line said otherwise + until 2026-08-17: a pasted multi-line draft WAS sent with enter on 2026-08-15/16 + (one dispatch, the newlines verified as bytes in the seat's own transcript), and + the composer's row count — the last half in doubt — reproduced as three rows in + a live 5/5 room at 170x54 on 2026-08-17. Nothing on the paste path is owed. - **How the family got here** (2026-08-09, race t9 on the reference box, after three earlier races each exposed and funded a fix — @@ -333,14 +339,17 @@ Nothing open. The last one here was the 44 seconds, and it was measured - **OBSERVED 2026-08-15/16, the drive that paid the demo path found three. The 2026-08-16 lane batch measured all three, and what is left is smaller.** - 1. **The composer one-row report is unexplained, and its recorded suspect - is refuted.** The render is measured correct at every geometry the room - draws (the 588-combination sweep in §9.38's second dated amendment): the - compose area wraps against the terminal width, so the seat count has no - path to the composer's row count, and the one silent-collapse branch is - unreachable above the 60x10 floor. The wire half was already paid. What - remains is one decisive live measurement: reproduce the paste in a live - 5/5 room and record the terminal's rows and columns with it. + 1. **CLOSED 2026-08-17. The composer one-row report did not reproduce.** The + decisive live measurement named here was taken: a three-line brief into a + live 5/5 room in Windows Terminal at a recorded 170x54 drew **three rows**. + That agrees with the 588-combination sweep, so the render is now verified + both synthetically and live, and the wire half was already paid. The + original one-row sighting stands unreproduced and is recorded as a probable + observation error — §9.38 documents the trap that produces one, the echo's + ambiguous row breaks, and the composer's row count was the one figure still + read by eye. Named honestly in §9.38's dated amendment: 170x54 is a + generous geometry, so it closes the reported defect and says nothing about + the tight cells near the 60x10 floor. 2. **Arena turns were always traced; the record could not name the race.** The "records nothing" premise did not survive measurement — racers' records were emitted all along, and a racer's line now ends @@ -445,18 +454,32 @@ Nothing open. The last one here was the 44 seconds, and it was measured (§7.24). The **Windows `danger-full-access` finding does not port to `codex app-server`** — that path has its own `windowsSandbox/*` surface nobody has probed; any - seat move re-measures rather than inherits. The **agy statusline payload is still pinned at 1.1.9** and - needs an interactive re-capture — expect FOUR quota buckets now, not two - (§3.8); the **multi-chunk transcript** is now PINNED synthetically (§3.8's + seat move re-measures rather than inherits. **The agy statusline re-capture is + PAID (2026-08-17)** and the pin moves to 1.1.13: fifteen live payloads + confirmed FOUR quota buckets rather than two, `agent_state` was observed live + (including one value the documented vocabulary omits), and the payload has + grown to carry the §7.16b context block. It also FALSIFIED `transcript_path` — + the payload names a directory that does not exist, so §2.1's refusal to display + it is now a measurement rather than caution; no code ever followed the path, + which was re-checked across the repo (§3.8's re-capture block). The + **multi-chunk transcript** is now PINNED synthetically (§3.8's 2026-08-16 amendment: the adapter reads the flat file by decision and proved correct under its own contract, and the head/tail overlap guard was shown load-bearing) — the live multi-chunk capture remains the missing instrument, - since a synthetic fixture cannot say which behavior agy actually has. One - capture is owed on the cursor statusline seam (§7.16's - amendment carries the one-minute manual step for a populated - `context_window`). The Claude payload capture landed 2026-08-16: seven live + since a synthetic fixture cannot say which behavior agy actually has. **The + cursor statusline capture is PAID (2026-08-17)**: a live interactive session at + cursor-agent `2026.08.11-e8db854` rendered `ctx 12.7%` after its first reply, + so `used_percentage` is observed populated at one-decimal precision and the + synthesized fixture's assumed shape was correct (§7.16's amendment, which also + names the build caveat — that capture ran one build ahead of the section's own + pin). The Claude payload capture landed 2026-08-16: seven live fires at the pinned 2.1.233 agreed with the source read on every count, and - §7.16b's amended limitation carries the record. + §7.16b's amended limitation carries the record. Two more items from that + batch's tail: the seat's advertised **capabilities are parsed for the record + and gate nothing** (#285) — `subagentStatusLine` was REFUSED as a source and + `FieldSubagents` stays `CapDerived` — and the event sink's **reader exists as + its own foreground mode** (#286, `telltale events view`), reading the day files + rather than the sink's endpoints so it still answers after the sink exits. - **ATTRIBUTED, 2026-08-08. Spawning was never the cost; `wait` is, and only on the three seats that are not persistent.** One traced `@all` turn, all four diff --git a/docs/design.md b/docs/design.md index 6d123b8..d6b30ae 100644 --- a/docs/design.md +++ b/docs/design.md @@ -230,9 +230,25 @@ that agy "never writes that file" was false and is corrected there), but whether PAYLOAD's value points at that real file needs a live capture nobody has run, and displaying an unverified path would be narrating. +**Amended 2026-08-17 — `transcript_path` is no longer unverified. It is verified WRONG.** +The live capture that paragraph asks for was taken (§3.8's re-capture block). The payload's +path drops the `-cli` segment: it names `~\.gemini\antigravity\brain\\…`, while the real +transcript for that same session sits only under `~\.gemini\antigravity-cli\brain\\…`. +The advertised directory exists and is EMPTY, so a reader that trusted the value would open +nothing and could not tell a missing file from a missing session. The refusal above stands +unchanged and its GROUND changes: it was caution about an unverified value, and it is now a +measurement of a false one. No code ever followed the path, which was re-checked across the +repository rather than assumed. + Schema verification record: documented contract (antigravity.google/docs/cli/statusline) cross-checked against a six-payload live capture from a real interactive session on agy -1.1.9, 2026-08-02 (§3.8). Fixtures are synthesized to the observed shapes. +1.1.9, 2026-08-02 (§3.8). **Re-captured 2026-08-17 at agy 1.1.13 — fifteen payloads, one +live interactive turn** (§3.8's re-capture block): quota confirmed at FOUR named buckets +(`3p-5h`, `3p-weekly`, `gemini-5h`, `gemini-weekly`), each carrying `remaining_fraction`, +`reset_time` and `reset_in_seconds`; `agent_state` observed live, including one value the +documented vocabulary omits; `context_window` grown to the §7.16b shape. `vcs` is still the +one documented segment nobody has observed — both capture sessions ran outside a git repo. +Fixtures are synthesized to the observed shapes. @@ -320,8 +336,11 @@ session (the shape with every `context_window` key null — that session had mad call), cross-checked against the vendor's bundled `statusline` skill and a source read of `./src/hooks/use-status-line.ts` and `./src/ui.tsx` at 2026.08.04-aaa8809. Fixtures are synthesized to the observed shapes; the populated-context fixture is synthesized to the -documented one, because no captured payload ever carried a number there. **That is the one -gap in this record** — see §7.16's amendment for the hand-back that closes it. +documented one, because no captured payload ever carried a number there. **That gap is +CLOSED, 2026-08-17**: a live interactive session at cursor-agent `2026.08.11-e8db854` +rendered `ctx 12.7%` after its first reply, so `used_percentage` is observed populated at +one-decimal precision. §7.16's amendment carries the capture and the build caveat. The +fixture's assumed shape was correct and did not move. @@ -1324,6 +1343,91 @@ have. It cannot say which one agy has, and the four conversations that grew a ch still hold one chunk each. The instrument this seam wants is a live multi-chunk conversation, and nothing above substitutes for it. +**Re-capture, 2026-08-17 — the statusline pin moves to agy 1.1.13, and one field is +FALSIFIED.** The statusline seam block above is pinned at 1.1.9 and six payloads. That +record is superseded here and kept as the older reading. Capture method: the same +temporary statusline command as 2026-08-02, appending each stdin payload to its own file; +**fifteen payloads across one live interactive turn**, in Windows Terminal. The session +ran outside a git repo again, so `vcs` is still unobserved. + +**The four-bucket prediction is CONFIRMED, with ids rather than labels.** §3.8's `/quota` +cross-check reported four windows under human labels and refused to call that an +observation of bucket ids, because the labels are not the ids. The payload now names them: +**`3p-5h`, `3p-weekly`, `gemini-5h`, `gemini-weekly`** — a five-hour and a weekly window +for each of two model families. **All four carry `remaining_fraction`, `reset_time` AND +`reset_in_seconds`**; the 1.1.9 record claimed those three keys for two buckets, and they +hold for four. Nothing in the renderer changed, which is what §2.1's verbatim-id rule was +built to buy. The `week` page's fixture already carried all four names, so the fixture was +right before the capture was taken. + +Two quota readings are recorded because both are honesty cases rather than trivia: + +- **Three of the four buckets reported `remaining_fraction` exactly 1**, serialized as the + bare literal `1` rather than `1.0`. That renders `0%` used — a MEASURED zero, drawing a + full empty track, not an absence. §4a.1's zero-versus-absent distinction, arriving off + the wire this time instead of out of the renderer. `week.txt`'s `3p-weekly ─── 0%` row is + the shape this produces, and it was synthesized correctly. +- **`remaining_fraction` never moved across the fifteen fires.** Only `reset_in_seconds` + counted down. The quota a line draws is therefore not the turn it is drawing. This is a + vendor property, it is not hidden, and nothing here compensates for it. + +**`agent_state` is observed live, and the documented vocabulary is incomplete.** The turn +moved `authenticating` → `idle` → `working` → `idle`. `idle` and `working` are on the +documented list; **`authenticating` is not**. The renderer draws an unknown state verbatim +in dim, so an unlisted value costs nothing — which is the point of having built it that +way. The list is documented, not closed, and this is the measurement that says so. +`thinking`, `tool_use` and `initializing` did not appear on this turn. + +**The payload GREW since 1.1.9, into the same shape Claude's block has.** `context_window` +now carries `total_input_tokens`, `total_output_tokens`, `context_window_size`, float +`used_percentage` and `remaining_percentage`, and a populated `current_usage` object +(`input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens`) +— the §7.16b block's shape, on a second vendor. Also present and not previously recorded +here: `conversation_id` (**equal to `session_id` byte for byte on all fifteen fires**), +`exceeds_200k_tokens`, `sandbox.enabled`, `terminal_width` and `model.effort`. The parser +was checked field by field against this capture: it models fourteen of the sixteen +top-level keys. `email` is excluded deliberately and that exclusion is tested. The one +field genuinely unmodelled by silence was `exceeds_200k_tokens`, and +`internal/antigravity/stdin.go` now carries the agy-side reason instead of inheriting a +ruling made about Claude's payload. **Nothing new was wired to a renderer or a relay** — +§7.16's display hold binds this seam. + +**The numbers populate on the LAST fire only, and that is a zero-versus-absent collapse in +the vendor's own serializer.** Through fourteen of fifteen fires the vendor sent +`used_percentage: 0` with the token counters at `0`; every real number arrived at once on +the final fire, after the turn. On the very first fire it sent `used_percentage: 0` +alongside `context_window_size: 0`, which is a placeholder that no pointer type can tell +from a measured zero — the vendor writes a literal `0` instead of omitting the key. So the +statusline honestly draws `ctx 0%` for the length of a turn and then jumps. This is +recorded, not compensated for: inferring "not yet known" from a zero the vendor stated +would be exactly the invention §4a.1 forbids, and the collapse happens upstream of +anything this repo controls. + +**`transcript_path` is FALSIFIED, and §2.1's refusal now has a measured reason.** §2.1 +declined to display the field because the payload's value was *unverified* — the transcript +is real on disk, but nobody had captured a payload to check whether its path pointed at it. +This capture checked. **It does not.** The payload roots the path at +`~\.gemini\antigravity\brain\\.system_generated\logs\transcript.jsonl`, and the real +transcript for that same session exists only under `~\.gemini\antigravity-cli\brain\\`. +The payload drops the `-cli` segment. Both roots exist at 1.1.13 and that is what makes the +trap sharp: `antigravity/brain/` is present and EMPTY while `antigravity-cli/brain/` holds +every conversation, so a reader that trusted the payload would open nothing and could not +distinguish a missing file from a missing session. This is the docs-versus-data tree +disagreement §3.8 recorded in 2026-08-02, still unfixed at 1.1.13 and now measured on the +statusline seam as well as on disk. + +**No code trusted it, and that was checked rather than assumed.** Every use of +`transcript_path` and `TranscriptPath` in the repository was read. No non-test code +dereferences the field — it is parsed and held, never opened, stated or rendered — and +`TestTranscriptPathIsHeldButNeverAPath` already pins that. The HUD adapter reaches the +transcript by its own root by name (`internal/adapter/antigravity`), never by trusting a +path handed to a gauge, which is the decision that makes this vendor bug a non-event here. +So nothing is fixed, because nothing is broken; §2.1's refusal is upgraded from caution to +measurement and the field stays parsed-and-unused, because deleting it would delete the +evidence. One further shape is recorded for whoever reads a raw capture next: before a +session id exists, the vendor joins an EMPTY id segment rather than omitting the key, so +the path collapses to `…\brain\.system_generated\logs\transcript.jsonl`. + **One inventory cell went stale with the re-verify, and is now fixed.** §3.10's canary table read `agy 1.1.9` for the Antigravity row after the adapter moved to `agy 1.1.13`; the row was corrected in the same-day ledger pass. The weakness this exposed stands @@ -1468,6 +1572,34 @@ the derived-percentage path did not fire on live data (no real session was missi `contextUsagePercent` while carrying raw counts), and the corpus is one machine, one day, one Cursor version. +**Observed 2026-08-17: a live `cursor-agent` CLI session drew no HUD row — and that is the +DESIGN, not a defect.** While the operator drove the interactive session that paid §7.16's +context capture, no HUD row appeared for it. The reason is structural and already on the +record: this adapter reads exactly one store, +`%APPDATA%\Cursor\User\globalStorage\state.vscdb`, which is the **IDE's** Composer store, +and the `cursor-agent` **CLI keeps its own** (§7.16's three-excluded-fields block says so in +as many words, and it is why a `conversation_id` is not stored — it would dangle a join that +does not exist). A CLI session was therefore never a row this adapter could draw. The +observation confirms an existing claim rather than opening a question, and it is written +down because "the gauge showed nothing" is the kind of report that gets re-investigated +every few months unless the expected answer is recorded beside it. + +**What the same observation does NOT settle, and it is the measurement worth taking.** The +operator's Cursor configuration carries `ghostMode: true` and `privacyMode: 2`. Neither +setting can explain the missing row above, because that row was never expected. They bear on +a different and live question: **whether those settings suppress session writes to the IDE +Composer store this adapter DOES read.** If they do, then every Cursor row in the HUD is +conditional on a vendor privacy setting nobody has measured, and a reader would see an empty +Cursor section with no way to tell "no sessions" from "sessions not written". That is a +zero-versus-absent failure one layer below the renderer, where §4a.1 cannot reach it. + +Stated as an open item rather than a finding, because nothing here was measured: the hypothesis +is untested, and it must not be repeated as though it were observed. The measurement is +cheap and needs the IDE rather than the CLI — drive a Composer session in the IDE with those +settings on, then off, and compare what `composerHeaders` gains in each arm. Until somebody +runs it, this paragraph is a hypothesis with its reason attached and nothing in the adapter +changes. + ### 3.9a Grok CLI seam — surveyed live 2026-08-09; the first vendor that writes money down @@ -4158,6 +4290,34 @@ thing an agent cannot drive here. Roughly a minute: 3. Read the line above the input. `ctx N%` appearing after the reply is the confirmation; the segment staying hidden means `used_percentage` is null for longer than assumed. +**Paid, 2026-08-17, at cursor-agent `2026.08.11-e8db854`.** The operator ran the three +steps above. The environment was an interactive session in Windows Terminal, from a +PowerShell parent, in this repository's own workspace. After the first reply the line +read: + +``` +Composer 2.5 Fast │ ctx 12.7% │ telltale +``` + +The segment drew, so `used_percentage` populates on a real session. Three things are now +observed rather than assumed. The magnitude is live: `12.7` is a reading, not a null and +not a zero. The precision is **one decimal**, which is the precision the synthesized +fixture already assumed — so the fixture shape stands unchanged. The field populates +**after the first reply**, which answers step 3's alternative outcome; nothing waited +longer than one turn. + +**The build is newer than this section's own pin, and that is stated rather than +smoothed.** Every other measurement in this section came from `2026.08.04-aaa8809`, +including the bundle arithmetic that ruled two fields derived. This capture ran at +`2026.08.11-e8db854`, the build §9.46 pinned. So read the populated shape as confirmed at +the newer build, and the derived-field ruling as measured at the older one. The two do not +substitute for each other. + +**One limit, named.** This capture confirms that the field carries a number. It does not +re-measure `remaining_percentage` or `total_input_tokens`, because §2.2 keeps both out of +the structs and the line renders neither. A capture cannot observe a field the parser +deletes. + ### 7.16a The OTLP collector — what grok spent, pushed rather than hooked (2026-08-10) @@ -12513,6 +12673,39 @@ is bytes in both glyph sets; they render `PlainStyles`, which is the NO_COLOR ha golden moved — a draft that fits its compose area reaches none of this, and that is every room above the floor. +**Amendment, 2026-08-17 — the decisive measurement was taken, and the composer drew THREE +rows.** "What is left, stated rather than rounded up" above named one cheap next step: +reproduce the paste in a live 5/5 room and record the terminal's rows and columns with it. +The operator ran it. A three-line brief went into a live 5-of-5 room in Windows Terminal at +a recorded geometry of **170 columns x 54 rows**, and the composer drew **three rows**. The +geometry was recorded this time rather than read back off the frame, which is the whole +reason the step was specified that way. + +**So the live render agrees with the sweep (#253), and the t9 one-row observation stands +UNREPRODUCED.** The render is now verified twice by two different instruments — 588 +synthesized geometries and one live room — and the wire was never in doubt. Against that, +one unrepeated eyeball reading. The finding is recorded as a **probable observation error**, +and this section already documents the trap that produces one: the echo's row breaks are +ambiguous between a newline and a word wrap. That warning was applied to the column echo at +the time and the wire was checked against the vendor's transcript because of it. The +composer's own row count was the one thing still read by eye, and it is the one thing that +did not reproduce. + +**What this run does NOT establish, because the geometry is the generous kind.** 170x54 sits +inside the swept band on width (60 to 240) and ABOVE it on height (`MinHeight` to 40), and +above means MORE compose room, never less. It is nowhere near the 60x10 floor where the +amendment above found forty cells that used to flatten. At 170x54 the pre-marker code and +the marker code draw the same three rows, so this run cannot tell them apart and is not +evidence about either. It closes the reported defect and it closes nothing else. The +one-row branch is still exercised only by `composer-clipped-to-one-row.txt` and its ascii +partner, which is where that claim belongs. + +**One independent corroboration of the column figure, and only the column figure.** The agy +statusline capture taken on the same machine the same evening (§3.8's re-capture block) +carried `terminal_width: 170` on all fifteen fires. That is a second instrument reading the +same terminal width, which is worth one sentence because the geometry is the evidence here. +It says nothing about the row count, which no payload carries. + **Amendment, 2026-08-09 — the ergonomic other half: ctrl+u clears the draft.** Paste changed the arithmetic on regret. A draft used to cost at most a typed sentence, so backspace's rune-at-a-time delete was proportionate to any mistake the composer could hold; one wrong diff --git a/internal/antigravity/stdin.go b/internal/antigravity/stdin.go index 7e2d440..2b67ee0 100644 --- a/internal/antigravity/stdin.go +++ b/internal/antigravity/stdin.go @@ -7,17 +7,39 @@ // §3.8). Pointer types mark fields observed or documented as conditionally // absent — absence must stay distinguishable from a zero value. // -// That pin is STILL 1.1.9 and the 2026-08-15 re-verification at agy 1.1.13 did -// not move it, because moving it needs a live payload capture and a capture -// needs an interactive session. What the re-verification did measure on the -// quota surface is one rung less direct and is recorded as such: `agy -p -// "/quota"` reported FOUR windows — a weekly and a five-hour one for each of -// "Gemini Models" and "Claude and GPT models" — where §3.8 observed two weekly -// buckets in the payload. Those are the slash command's human labels, not the -// payload's bucket ids, so this is a reason to expect more buckets and NOT an -// observation of their ids. Nothing here needs changing either way: the ids are -// relayed verbatim and the renderer draws one segment per named bucket, so a -// third and fourth bucket already render without a vocabulary to update. +// That pin was STILL 1.1.9 until 2026-08-17, because moving it needs a live +// payload capture and a capture needs an interactive session. The 2026-08-15 +// re-verification measured the quota surface one rung less directly and was +// recorded as such: `agy -p "/quota"` reported FOUR windows — a weekly and a +// five-hour one for each of "Gemini Models" and "Claude and GPT models" — where +// §3.8 observed two weekly buckets in the payload. Those are the slash command's +// human labels, not the payload's bucket ids, so that was a reason to expect +// more buckets and NOT an observation of their ids. +// +// # Re-captured 2026-08-17 at agy 1.1.13 — the pin MOVES +// +// Fifteen payloads from one live interactive turn (docs/design.md §3.8's +// re-capture block). The six-payload 1.1.9 record above is superseded on every +// point below, and is kept as the older reading rather than deleted. +// +// The expect-four prediction is CONFIRMED, and the ids are now OBSERVED rather +// than inferred from human labels. The payload carries four named buckets: +// "3p-5h", "3p-weekly", "gemini-5h" and "gemini-weekly". Each of the four +// carries remaining_fraction, reset_time AND reset_in_seconds — the 1.1.9 record +// claimed those three keys for two buckets and they hold for all four. The +// renderer needed no change, exactly as the paragraph above predicted: the ids +// are relayed verbatim and one segment is drawn per named bucket. +// +// Two quota readings are worth carrying, because both are honesty cases: +// +// - three of the four buckets reported remaining_fraction exactly 1, and agy +// serializes it as the bare literal `1` rather than `1.0`. Go reads that +// into a float64 without complaint. It renders `0%` used, which is a +// MEASURED zero and not an absence — §4a.1's distinction, arriving from the +// wire this time rather than from the renderer. +// - remaining_fraction never moved across the fifteen fires; only +// reset_in_seconds counted down. So the quota a line draws is not the turn +// it is drawing. Nothing here should be changed to hide that. // // Detection: every observed payload carries `"product": "antigravity"`, which // Claude Code's statusline payload does not. cmd/telltale routes on that @@ -25,13 +47,20 @@ // // What this payload has that no other vendor's statusline seam offers: // -// - quota as NAMED BUCKETS (observed: "gemini-weekly", "3p-weekly"), each -// with remaining_fraction and an exact reset_time; +// - quota as NAMED BUCKETS (observed at 1.1.13: "3p-5h", "3p-weekly", +// "gemini-5h", "gemini-weekly"), each with remaining_fraction, reset_time +// and reset_in_seconds; // - agent_state — the first vendor-REPORTED liveness signal in this -// product's universe (idle/thinking/working/tool_use/initializing); +// product's universe. The documented vocabulary is +// idle/thinking/working/tool_use/initializing. The 2026-08-17 capture +// observed "idle" and "working" from that list, and one value that is NOT +// on it: "authenticating", on the first fire of the turn. An unlisted value +// is not a defect here — the renderer draws an unknown state verbatim in +// dim by design — but the vocabulary above is a documented list and not a +// closed set, and this line is the measurement that says so; // - vcs — branch and dirty state in the payload itself, so a branch segment -// needs no exec (documented; not yet observed live — the capture session -// ran outside a repo). +// needs no exec (documented; STILL not observed live — the 1.1.9 capture and +// the 2026-08-17 re-capture both ran outside a git repo). // // # transcript_path, and a correction (2026-08-15, agy 1.1.13) // @@ -57,9 +86,35 @@ // separate and unchanged decision: this is the statusline seam, whose whole // contract is that it does no I/O beyond stdin (§2). The HUD adapter reaches // the transcript by its own root, never by trusting a path handed to a gauge. -// Whether the payload's transcript_path string now points at the real file or -// still at the docs' `antigravity/` tree is UNMEASURED at 1.1.13 — confirming it -// needs a live payload capture, and the 2026-08-15 re-read captured none. +// +// # transcript_path is FALSIFIED at 1.1.13 (measured 2026-08-17) +// +// The paragraph above left one question UNMEASURED: whether the payload's +// transcript_path now points at the real file or still at the docs' +// `antigravity/` tree. The 2026-08-17 capture measured it. It points at the +// docs' tree, and that directory does not hold the file. +// +// The payload's value is rooted at `~/.gemini/antigravity/brain//...`. The +// real transcript for the SAME session exists only at +// `~/.gemini/antigravity-cli/brain//...`. The payload drops the `-cli` +// segment. Both roots exist on disk at 1.1.13, which is what makes this worth +// pinning: `antigravity/brain/` is present and EMPTY, `antigravity-cli/brain/` +// holds every conversation. A reader that trusted the payload would open +// nothing and could not tell a missing file from a missing session. +// +// So §2.1's refusal to display this field now rests on a measurement rather than +// on caution. The field was withheld because it was unverified; it is now +// verified WRONG. Nothing about the code changes, because nothing ever followed +// the path — no non-test code dereferences TranscriptPath, in this package or +// any other, and TestTranscriptPathIsHeldButNeverAPath pins that it is held as a +// string and never resolved. The value stays parsed and unused on purpose: it is +// evidence about the vendor, and deleting the field would delete the evidence. +// +// One more shape, recorded because it would confuse a future reader of a raw +// capture: on the fires before a session id exists, the vendor joins an EMPTY +// id segment rather than omitting the field, so the path collapses to +// `~/.gemini/antigravity/brain/.system_generated/logs/transcript.jsonl`. That is +// a second reason never to hand this string to a file operation. // // # email is never parsed and must never be rendered // @@ -98,8 +153,9 @@ type StatuslineInput struct { Workspace *Workspace `json:"workspace,omitempty"` ContextWindow *ContextWindow `json:"context_window,omitempty"` // Quota is a map of bucket id to window; bucket ids are vendor-defined - // (two weekly buckets observed on the Starter tier) and are rendered - // verbatim rather than translated through an assumed vocabulary. + // (FOUR observed at 1.1.13 — a weekly and a five-hour window for each of + // two model families) and are rendered verbatim rather than translated + // through an assumed vocabulary. Quota map[string]*QuotaBucket `json:"quota,omitempty"` AgentState string `json:"agent_state,omitempty"` VCS *VCS `json:"vcs,omitempty"` @@ -118,6 +174,25 @@ type StatuslineInput struct { ToolConfirmationPending bool `json:"tool_confirmation_pending,omitempty"` TerminalWidth int `json:"terminal_width,omitempty"` ExecutionMode string `json:"execution_mode,omitempty"` + + // exceeds_200k_tokens is DELIBERATELY NOT MODELLED, and this comment is the + // agy-side record of that decision, which did not exist before 2026-08-17. + // The 1.1.13 capture carries the key on every fire. design.md's + // unmodelled-field list covers the same key on the CLAUDE payload; that is a + // different vendor and its ruling does not transfer, so the field was + // unmodelled here by silence rather than by decision. It is a decision now. + // + // Two reasons to leave it out. It is a THRESHOLD the vendor computed, not a + // reading — context_window already carries the tokens and the window size a + // gauge would need, so modelling this would be storing someone else's + // comparison beside the operands. And nothing renders it: §7.16's display + // hold binds this seam, so a parsed field with no destination is exactly the + // "modelling a field nothing reads" case §7.16b says needs a reason. + // + // Recorded honestly: it is three-state in practice (null before the turn's + // numbers land, then false or true), so a future bool field would collapse + // "not yet known" into "no". A *bool is the only correct shape if it is ever + // wanted, and it is not wanted today. } type Model struct {