diff --git a/CHANGELOG.md b/CHANGELOG.md index a7baefa..e37160c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- `jam`, `jam-to-tasks`, `jam-to-ticket` and `jam-proof-table` handle screenshot, replay and silent Jams, and Jams that raise several problems: the router reads the transcript and a silent Jam's description, a task cites its field when there is no timestamp, a screenshot counts as proof, and an existing ticket covers only its own problem. - Added `jam`: type `/jam` and what you want, and it routes to the matching Jam skill. It also catches a bare jam.dev link or a vague ask, reads the Jam, and routes by what it holds; a clear ask still goes straight to its own skill. - The README lists skills as one bulleted list instead of a table plus a section per skill. `scripts/check.mjs` checks for the list entry. - The skills no longer download and run an installer. If `jam` is missing, they ask you to install it from jam.dev/cli. Addresses the remote-code-execution audit finding on `jam-proof` and `jam-annotate`. diff --git a/skills/jam-proof-table/SKILL.md b/skills/jam-proof-table/SKILL.md index 9ac663a..6292d47 100644 --- a/skills/jam-proof-table/SKILL.md +++ b/skills/jam-proof-table/SKILL.md @@ -79,12 +79,23 @@ the oldest. ```bash jam get jam "$ID" --json # reads back, type, duration -jam get frames "$ID" --at 48000 --size medium --out "$(mktemp -d)" # outside the repo ``` -Open the frame at the moment the claim shows up; `--at` must be below the -Jam's `duration`. A blank page, a single frozen frame, or the wrong tab is -not proof. Record it again with `jam-proof` and say that you did. +Then check it by its `type`; the other types have no video frames: + +```bash +jam get frames "$ID" --at 48000 --size medium --out "$(mktemp -d)" # video; outside the repo +jam get screenshots "$ID" --out "$(mktemp -d)" # screenshot +``` + +A replay has no frames or screenshots: check it in its events, console and +network, and mark the row unconfirmed when they cannot settle the claim. + +For a video, open the frame at the moment the claim shows up; `--at` must be +below the Jam's `duration`. A blank page, a single frozen frame, or the wrong +tab is not proof. A screenshot is one still image by design: it is proof when +the claim is visible in it. When the Jam does not show the claim, record it +again with `jam-proof` and say that you did. Some claims happen off screen: an API status, a count, a sent message. Check those in `jam get network`, `jam get console` or `jam get user-events`, and diff --git a/skills/jam-to-tasks/SKILL.md b/skills/jam-to-tasks/SKILL.md index 850bdf9..3faf873 100644 --- a/skills/jam-to-tasks/SKILL.md +++ b/skills/jam-to-tasks/SKILL.md @@ -56,6 +56,9 @@ the mic off, that answer is final. ## 2. Read the whole transcript +Only a video with the mic on has one. Otherwise skip to step 3 and take the +asks from the title, description and comments. + ```bash jam get transcript "$ID" --json # WebVTT in the "transcript" field ``` @@ -70,8 +73,9 @@ trailing silence ("Thank you.") is transcription noise, not an ask. Open a task each time the person raises something: a bug, wrong data, a visual nit, a behavior change, a feature request. All count. Give each one: -- an id (`T1`, `T2`, ...) and its start time -- the verbatim quote +- an id (`T1`, `T2`, ...) and where it came from: its start time in the + narration, or the field (title, description, a comment) of a silent Jam +- the verbatim quote, from that source - a type: bug, visual, behavior, feature, reference ## 4. Resolve every "this" @@ -87,6 +91,9 @@ jam get frames "$ID" --overview --size medium --out "$FRAMES" jam get frames "$ID" --at 14220,18720,46140 --size medium --out "$FRAMES" ``` +A screenshot Jam has no frames: open `jam get screenshots "$ID" --out +"$FRAMES"` instead. A replay has neither; use its user events. + Open every frame. The cursor is often the only clue to what "here" means. When no cursor shows, or the frame is blurred mid-scroll, pull one 500 ms later. Re-pull at `--size large` when UI text is too small to read. Sample @@ -133,8 +140,9 @@ and then in small units, not one large commit. ## 7. Check coverage and close -Re-read the transcript top to bottom. Every sentence that asks for something -maps to a task id. Then give every id an outcome: done (with files), +Re-read the transcript top to bottom, or with no narration the title, +description and comments. Every sentence that asks for something maps to a +task id. Then give every id an outcome: done (with files), deferred (with the reason), needs an answer, or could not reproduce. Write the totals: "11 asks: 9 done, 1 deferred, 1 needs an answer." diff --git a/skills/jam-to-ticket/SKILL.md b/skills/jam-to-ticket/SKILL.md index 4d3e1a4..502c487 100644 --- a/skills/jam-to-ticket/SKILL.md +++ b/skills/jam-to-ticket/SKILL.md @@ -54,9 +54,13 @@ jam get jam "$ID" --json it, each with `id` and `url`. Then search the tracker for the Jam's id and full URL, then for two or three words from its title. Tracker search is fuzzy and returns near misses: a match is a ticket whose body or -attachments hold this Jam's id. On a match, return that ticket and stop. -That also answers "was this Jam ever ticketed?". Add the new Jam to the -existing ticket only when the user asks. +attachments hold this Jam's id. + +"Was this Jam ever ticketed?" is read-only: return the matches and stop. +Otherwise keep the matches and read on. A match covers only the problems its +ticket describes, so a Jam that raises several problems (step 4) still needs +tickets for the rest. When every problem is covered, return those tickets and +stop. Add the new Jam to an existing ticket only when the user asks. ## 3. Read the Jam diff --git a/skills/jam/SKILL.md b/skills/jam/SKILL.md index d7b1f03..d58986f 100644 --- a/skills/jam/SKILL.md +++ b/skills/jam/SKILL.md @@ -30,9 +30,14 @@ the order asked, and pass what the first one found to the next. ## A Jam link with no clear ask Read the Jam's details first: the `getDetails` MCP tool, or -`jam get jam --json`. Then route by what it holds: - -- A narrated walkthrough that asks for several changes: `jam-to-tasks`. +`jam get jam --json`. For a video with the mic on (`micEnabled`), read +the transcript too (`getVideoTranscript`, or `jam get transcript --json`): +the spoken asks are there, and a title like "Feedback" says nothing about +them. If captions are not ready, wait a minute and retry once, then route on +the details and say so. Then route by what it holds: + +- Several changes asked for, in the narration or in the title, description + or comments of a silent Jam: `jam-to-tasks`. - One bug, an error, or a failed request: `jam-fix`. It diagnoses without changing code, so it is the safe default. - Neither is clear: ask one question that names the options in plain words