Skip to content

feat: Deliver the explainer on the tracker item (screenshot + attached HTML) #75

Description

@tbrownio

type: feature-ticket
id: tracker-explainer-surface
status: ready
zone: 1

Feature: Deliver the explainer on the tracker item (screenshot + attached HTML)

Intent

The user's interface to agent work is the tracker (Linear here) — runs
happen on VMs, so the skills' current alignment surface, opening
refs/explainer.html in a local browser, never reaches them. And on the
tracker itself the explainer exists only as a raw marker-delimited
comment blob. The human view of a work item must live cleanly on the
tracker item: an inline screenshot of the explainer for at-a-glance
reading, plus the self-contained explainer HTML as a downloadable
attachment for full fidelity (in-page nav to appended docs), kept
current as the item accrues plan.md, wrapup.md, and other docs.
Download-and-open is an accepted temporary pain until a self-hosted
viewer exists (Linear TM-393).

Desired end state

  • Every published work item shows, on the tracker item itself: an inline
    screenshot image of the current explainer, and the current
    self-contained explainer HTML as a downloadable attachment that renders
    fully offline (master page with in-page navigation to each appended
    doc and back).
  • When /do (or any skill) appends a doc to the item's refs, the
    explainer is re-rendered and the screenshot + attachment are replaced —
    one current version on the ticket, never a pile of stale copies.
  • Alignment works without a local browser: in Linear-driven sessions the
    draft explainer reaches the user in the session's chat thread and their
    reply is the nod. The local browser auto-open remains (attempted
    everywhere, silently tolerated when no browser exists).
  • Agents' machine-readable path is untouched: item.md and refs are still
    harvested from the tracker's marker mechanism, never from the
    screenshot or attachment.

Key architecture directions

  • D1 — Linear-class trackers (those with a native upload API) get
    the full treatment: inline screenshot + HTML file attachment. Trackers
    without an upload API (GitHub issues included) keep the existing
    marker-comment mechanism as the documented degraded fallback — no
    screenshot embed is claimed where the API can't deliver one. Wording
    in the synced references stays tracker-neutral ("where the destination
    supports uploads…"); no tracker becomes a hard dependency.
  • D2 — Two renditions, one source: the inline screenshot is for
    glanceability, the attached HTML is the full-fidelity view; both are
    regenerated from the same explainer.html on every change. Replacement,
    not accumulation — clean tickets are the point.
  • D3 — No external hosting of any kind: no Claude artifacts, no
    third-party file hosts. Content goes only to the tracker the repo
    already publishes to. (Self-hosted viewer is future work, TM-393.)
  • D4 — Alignment happens wherever the conversation with the user
    already is. The browser auto-open is attempted everywhere and allowed
    to fail silently (no browser on the daemon/VM — that's fine). In a
    Linear-driven session, the agent posts the explainer rendition into
    the session's chat thread for review — Linear lets the agent message
    the user — and the user's chat reply is the alignment nod the session
    receives; no polling, no draft-status issue created for alignment. No
    path may silently skip the alignment pause itself.
  • D5 — The screenshot is best-effort: rendered when a headless
    browser/renderer is available in the environment, skipped (with the
    HTML attachment still delivered) when not. Publish and alignment are
    never blocked by a missing renderer; the reference states the
    capability requirement, not a specific tool, and introduces no new
    hard dependency for consumers.
  • D6 — Machine source of truth unchanged: marker-comment harvest of
    item.md/refs stays exactly as is; screenshot and attachment are
    presentation only.

Starting points (non-exhaustive)

  • references/html-explainer.md — owns render-and-open today; gains the delivery + regeneration procedure
  • references/publish-work-item.md — publish step gains screenshot + attachment; already defines the marker mechanism
  • claude/skills/do/SKILL.md — appends docs over the item's life; triggers re-render + replace
  • daemon/ — NOT touched; future hosting lives in TM-393

Verification criteria

  • AC1 — WHEN a work item publishes to a Linear-class tracker (native
    upload API) per the updated references, the tracker item shall carry
    an inline screenshot of the explainer (when a renderer is available)
    and the self-contained explainer HTML as a downloadable attachment;
    WHEN it publishes to a tracker without an upload API, the existing
    marker-comment mechanism shall carry the explainer unchanged.
  • AC2 — WHEN the attached HTML is opened from a fresh download with
    no network, it shall render completely, and each appended doc shall be
    reachable from the master page and link back to it.
  • AC3 — WHEN a doc is appended to a published item, the tracker item
    shall show exactly one current screenshot and one current HTML
    attachment reflecting the appended doc (no stale duplicates remain).
  • AC4 — WHEN alignment runs in a Linear-driven session, the skill
    shall post the explainer rendition into the session's chat thread and
    proceed to publish only after the user's chat reply confirms; WHEN it
    runs locally, the skill shall attempt the browser open, and a failed
    open shall not abort the flow.
  • AC5 — WHEN the synced directories are grepped after the change, no
    consumer-specific names/paths/IDs shall appear and no external hosting
    service shall be referenced.

Verification map

Criterion Method Command / flow
AC1 script (live drive) publish a scratch item to a Linear-class tracker (scratch issue in the user's workspace); inspect via API for image + attachment; confirm marker fallback text for upload-less trackers [ ]
AC2 script + review download the attachment, open offline, click through nav both ways [ ]
AC3 script (live drive) append a doc to the scratch item, re-publish; count attachments/screenshots via API [ ]
AC4 review walk the updated skill text's Linear-session and local branches; confirm no publish path skips alignment and no path aborts on a failed browser open [ ]
AC5 script grep synced dirs for consumer identifiers and hosting-service names [ ]

Out of scope

  • Self-hosted / daemon-hosted artifact viewer (Linear TM-393).
  • Claude artifacts or any claude.ai upload.
  • Invocation-gate changes (separate item: agent-invocable-capture).
  • Any daemon/ code change.

Justification

  • Why move the human view to the tracker — runs happen on VMs and the
    user's only interface is Linear; the local browser-open never reaches
    them, and the marker-comment blob is unreadable as a human surface.
  • Why not Claude artifacts — private-by-default with no programmatic
    sharing, Claude-harness-only, and off-infra copies for every consumer
    (gate round 1 on the combined draft; replacement tracked in TM-393).
  • Per-tracker mechanism — resolved by tracker class: native-upload
    trackers (Linear class) get screenshot + attachment; upload-less
    trackers (GitHub issues) keep marker comments as the documented
    degraded fallback. Accepted cost: no glanceable rendition on GitHub.
  • Headless alignment loop — the Linear agent-session chat carries the
    draft explainer and the user's in-chat reply is the nod; no polling,
    no draft-status issues, no new confirmation machinery.
  • Headless-renderer dependency — screenshot is best-effort; the browser
    open is attempted and silently tolerated when absent; publish and
    alignment never block on a missing renderer. The env-var switch was
    considered and dropped for attempt-and-tolerate.
  • Zone 1 held: rewires the alignment checkpoint every consumer inherits
    via sync.

Open questions

  • None.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions