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
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.htmlin a local browser, never reaches them. And on thetracker 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
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).
/do(or any skill) appends a doc to the item's refs, theexplainer is re-rendered and the screenshot + attachment are replaced —
one current version on the ticket, never a pile of stale copies.
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).
harvested from the tracker's marker mechanism, never from the
screenshot or attachment.
Key architecture directions
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.
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.
third-party file hosts. Content goes only to the tracker the repo
already publishes to. (Self-hosted viewer is future work, TM-393.)
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.
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.
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 procedurereferences/publish-work-item.md— publish step gains screenshot + attachment; already defines the marker mechanismclaude/skills/do/SKILL.md— appends docs over the item's life; triggers re-render + replacedaemon/— NOT touched; future hosting lives in TM-393Verification criteria
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.
no network, it shall render completely, and each appended doc shall be
reachable from the master page and link back to it.
shall show exactly one current screenshot and one current HTML
attachment reflecting the appended doc (no stale duplicates remain).
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.
consumer-specific names/paths/IDs shall appear and no external hosting
service shall be referenced.
Verification map
Out of scope
Justification
user's only interface is Linear; the local browser-open never reaches
them, and the marker-comment blob is unreadable as a human surface.
sharing, Claude-harness-only, and off-infra copies for every consumer
(gate round 1 on the combined draft; replacement tracked in TM-393).
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.
draft explainer and the user's in-chat reply is the nod; no polling,
no draft-status issues, no new confirmation machinery.
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.
via sync.
Open questions