Skip to content

feat(work-log): native app and browser icons, honest failure and idle states - #444

Merged
rynfar merged 5 commits into
pylonfrom
upstream/2026-09-09-worklog-icons
Sep 10, 2026
Merged

feat(work-log): native app and browser icons, honest failure and idle states#444
rynfar merged 5 commits into
pylonfrom
upstream/2026-09-09-worklog-icons

Conversation

@rynfar

@rynfar rynfar commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Work logs showed a generic glyph for every tool, so a Chrome step, a native app
launch and a shell command all looked alike. A failed call replaced its icon with
an alert mark, losing the only cue for what had failed. And an Antigravity
subagent batch kept its running summary after its parent turn ended, implying
work was still happening when the batch could no longer report anything.

What changed

  • Native app and browser icons. Work log rows show the app's own artwork or
    the page's favicon, resolved server-side and cached per environment.
  • Failed calls keep their icon. A failed command still looks like a command,
    with a muted tint; icons that cannot take a tint get a trailing mark instead.
  • Idle batches stop claiming a result. A batch whose parent turn ended shows
    the explanation rather than a stale running summary, and the conversation
    summary counts it without a completion checkmark.

Adopted from T3 Code

  • 6cf0c6ea55d281f65c80502ec1871b0adf472025 (#9093) native app and browser icons
  • c3b8825bf476cbce5e061c0f99570cf1f6723b89 (#9606) preserve tool icons on failed calls
  • 00f8b7c28056188e3c5630160806a0afe51c9010 (#9616) idle subagent batches

Pylon adaptations

  • Favicon host guard kept. Pylon refuses to build favicon URLs for private
    and reserved hosts; upstream's new page-derived lookup has no such filter. The
    guard now covers it, because a work log can be read from a remote client where
    http://localhost:5173 resolves against the viewer's network rather than the
    environment that browsed the page. One upstream test asserted that localhost
    returns a URL; it now asserts the refusal.
  • Prime tool detail stays suppressed. The new presentation fields flow for
    every provider, but detail-like fields remain behind Pylon's primeAgentTool
    gate.
  • Queued and waiting survive. Upstream's extracted spawn summary reports a
    live run with nothing running as "working". Pylon distinguishes N queued,
    queued, N waiting and working; the helper now carries that, since a
    spinner that claims work nobody is doing is the defect this repo cares about.

Converged on upstream

  • One shimmer, not two. Pylon's live row hand-rolled an IntersectionObserver
    plus visibilitychange, focus and blur listeners to gate a per-label
    shine, because no shared gate existed when it was written. visibleAnimation.ts
    now provides exactly that for every animation in the app, so this adopts
    upstream's sweeping overlay, registers its container with the shared gate, and
    deletes 28 lines of bespoke wiring.
  • One spawn summary. Upstream's deriveAgentSpawnSummary preserves Pylon's
    coordinator-authoritative live rule, so Pylon's inline duplicate is gone.
  • One lifecycle extractor. Upstream defines a local copy of
    extractWorkLogToolLifecycleStatus; Pylon's shared version in
    client-runtime already encodes the same idle-batch rule, so the local copy
    was dropped rather than shadowing it.

Fixed along the way

docs/user/providers-antigravity.md shipped in #440 with 22 "T3 Code" mentions,
because that file was taken wholesale from upstream. All of them are the running
product referring to itself and now read "Pylon". The two mentions in
docs/user/install.md are left alone: they describe installing beside T3 Code as
a separate product, which is accurate.

Verification

  • Tests: 415 across seven suites — subagent runtime, work-log presentation,
    favicon, mobile thread activity, spawn summary, and both timeline suites.
  • Types: all packages clean.
  • vp check: 0 errors across 3367 files.
  • Unused exports and files: knip:check clean.

Model and harness: Claude Opus 5 via Claude Code.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Keeps Pylon's public-host favicon guard on the new page-derived lookups: a
work log can be read from a remote client, where a private-host favicon URL
resolves against the viewer's network rather than the environment that browsed
the page.

Keeps the shimmer gating AGENTS.md requires instead of upstream's overlay, and
leaves Pylon's Prime tool-detail suppression in place while the new
presentation fields flow for every provider.

Adopted from 6cf0c6ea55d281f65c80502ec1871b0adf472025.
Failed calls keep their tool icon with a muted tint instead of collapsing to
an alert glyph, with a trailing mark where the icon cannot take a tint.

Also converges the live row on upstream's sweeping shimmer overlay. Pylon's
per-label shine hand-rolled its own IntersectionObserver plus visibility and
focus listeners because no shared gate existed when it was written;
visibleAnimation.ts now provides that for every animation in the app, so the
overlay pauses offscreen with 28 fewer lines and one shimmer instead of two.

Keeps the Pylon mark and Pylon branding in the docs, and Pylon's warning tone
alongside the new muted failure tint.

Adopted from c3b8825bf476cbce5e061c0f99570cf1f6723b89.
An Antigravity batch goes idle when its parent turn ends, which is not a
result. Pylon kept the stale running summary on the row, so a batch that had
stopped reporting still looked like work in progress; it now shows the
explanation instead.

Converges the spawn summary on upstream's extracted helper, which preserves
Pylon's coordinator-authoritative live rule, and extends it with Pylon's
queued/waiting distinctions: upstream reports a live run with nothing running
as 'working', which is a lying label.

Adopted from 00f8b7c28056188e3c5630160806a0afe51c9010.
@github-actions github-actions Bot added size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Sep 10, 2026
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.7 KiB 13.9 KiB +158 B (+1.1%) 15.1 KiB
Codex Thread snapshot wire 7.1 KiB 7.2 KiB +106 B (+1.5%) 7.3 KiB
Codex Live turn WebSocket wire 6.6 KiB 6.7 KiB +52 B (+0.8%) 7.8 KiB
Codex Live turn WebSocket decoded 57.3 KiB 58.0 KiB +700 B (+1.2%) 66.4 KiB
Codex Live turn messages 8 8 0 (0.0%) 21
Claude Total thread wire 13.8 KiB 14.1 KiB +268 B (+1.9%) 15.1 KiB
Claude Thread snapshot wire 7.1 KiB 7.2 KiB +108 B (+1.5%) 7.3 KiB
Claude Live turn WebSocket wire 6.7 KiB 6.9 KiB +160 B (+2.3%) 7.8 KiB
Claude Live turn WebSocket decoded 58.2 KiB 59.7 KiB +1.5 KiB (+2.6%) 66.4 KiB
Claude Live turn messages 10 10 0 (0.0%) 21

Baseline: ab49d53 · PR result: 5a0c8f3 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 115.6 KiB
  • Claude decoded thread snapshot: 116.3 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

- Restore the containing block on the live row so the absolute shimmer
  overlay cannot escape it and paint over neighbouring content.
- Guard explicitFaviconUrl by host: a provider-reported tab favicon is still a
  page host, so a private one would resolve against a remote viewer's network.
- Stop the raw payload status from overriding the normalized lifecycle status.
- Make the muted mobile failure tint reachable; severe failures stay red.
- Render displayText so an expanded command row reads 'Command'.
- Keep the visible 'Failed - reason' status in the agents panel.
- Add the unfocused-window gate to visibleAnimation, which AGENTS.md requires
  alongside reduce-motion and backgrounding; this covers every animation in the
  app, not just this row, and gains a regression test.
- Drop the now-dead live-tool-shine CSS and keep technical browser backends
  such as 'cdp' out of user-visible source names.
The review flagged the payload status as duplicating toolLifecycleActivityStatus,
but only tool.started and tool.completed call that helper. task.progress and
item.updated have no normalized status, so removing the spread there left those
activities with no status at all.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant