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 {