From 94e1c383f4410fb96953f6b3f1b4c97fdb9c595f Mon Sep 17 00:00:00 2001 From: Hongbin Li Date: Sun, 11 Oct 2026 01:02:19 -0700 Subject: [PATCH 1/2] The action renders the release's videos, no stills The default channel set is the README loop, the only cut a short CI take fits, and the comment's table drops the poster and moment columns that belonged to stills. The dogfood take is long enough for the loop's spec. --- .github/workflows/ci.yml | 4 ++-- README.md | 17 ++++++++--------- action.yml | 10 +++++----- scripts/comment.mjs | 6 ++---- test/actions.json | 2 +- 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 00e3174..0053be7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ permissions: jobs: dogfood: # The action run on itself: record vos.so's own CLI page, deliver the - # store set, verify it, and on a pull request keep the comment. Only a + # README loop, verify it, and on a pull request keep the comment. Only a # push to main versions the tracked vos in test/vos.json (the dogfood # take on the vos.so shelf): a pull request run gets no key, so two # branches never race for the same base, and the base main pushes from @@ -23,7 +23,7 @@ jobs: with: actions: test/actions.json doc: '' - channels: cws,og + channels: github release: ci-${{ github.run_number }} tracking: test/vos.json key: ${{ github.event_name == 'push' && secrets.VOS_API_KEY || '' }} diff --git a/README.md b/README.md index 8dcd31d..beff245 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # vos release media, on every pull request -A GitHub Action that records the real product in CI, cuts the release's media from it (store screenshots, cards, the README loop, the demo), verifies every asset against its channel spec, pushes the take to [vos.so](https://vos.so), and keeps **one comment on the pull request** with the watch page and the kit. The next release is a re-render of the same click script, not a re-shoot. +A GitHub Action that records the real product in CI, cuts the release's videos from it (the README loop, the feed and vertical cuts, the demo), verifies every cut against its channel spec, pushes the take to [vos.so](https://vos.so), and keeps **one comment on the pull request** with the watch page and the kit. The next release is a re-render of the same click script, not a re-shoot. ```yaml name: release media @@ -29,12 +29,12 @@ What lands on the pull request: > > **Watch** https://vos.so/vos/… (v3) · **edit** https://vos.so/studio?vos=… · `vos pull` brings studio edits back. > -> | Channel | Asset | Size | Bytes | Length | Moment | -> | --- | --- | --- | --- | --- | --- | -> | cws | screenshot | 1280x800 | 260 KB | | 14.5 s | -> | github | readme-loop | 1920x1080 | 880 KB | 16.0 s | | +> | Channel | Asset | Size | Bytes | Length | +> | --- | --- | --- | --- | --- | +> | github | readme-loop | 1920x1080 | 880 KB | 16.0 s | +> | x | feed-cut | 1920x1080 | 4.1 MB | 42.0 s | > -> **Verifier:** 0 problems across 11 assets, re-measured from their bytes. +> **Verifier:** 0 problems across 2 assets, re-measured from their bytes. The comment is found by its marker and updated in place, so a pull request with ten pushes has one comment, not ten. Reviewers, QA and marketing sign off on a link instead of pulling the branch. The same run on a tag is the release. @@ -45,7 +45,6 @@ media/ actions.json the click script (the next release's script too) doc.json the signed-off cut (zooms, trims, speed, all data); carried onto new footage by vos plan --reuse vos.json which vos on the shelf the pushes version - poster/ the poster documents the card destinations render from, one per aspect class, optional BRAND.md the brand kit; write it once with `vos brand https://your.app` ``` @@ -57,7 +56,7 @@ Start with the [launch-kit skill](https://github.com/vosjs/skills) (`npx skills | --- | --- | --- | | `actions` | `media/actions.json` | The click script `vos record` drives. | | `doc` | `media/doc.json` | The committed cut to carry onto the new footage. Skipped when the file is absent. | -| `channels` | `cws,og,github` | The channel set `vos deliver` renders (`cws,producthunt,x,linkedin,og,github,youtube` or `all`). | +| `channels` | `github` | The channel set `vos deliver` renders (`youtube,x,shorts-linkedin,github` or `all`). A cut longer than the take allows is skipped with the reason. | | `release` | tag, or `pr-` | The name on the kit and the push label. | | `key` | | A vos.so content key. Without one the take is not pushed; the kit and the comment still land. | | `tracking` | `media/vos.json` | Which vos the pushes version. After a push the action writes the new base back to this file; commit it (a step in your workflow, or a bot commit) or the next push is refused as a stale base. | @@ -68,7 +67,7 @@ Outputs: `kit`, `vos-id`, `version`, `watch-url`. ## What it refuses -`vos record --strict` fails the job on a skipped selector instead of shipping around it. A push against a stale base fails with the changelog of what changed on the shelf. A kit that fails its own verifier (`vos validate`) fails the job after the comment says why. Store uploads stay yours: the kit is an artifact on the run, never uploaded to a store. +`vos record --strict` fails the job on a skipped selector instead of shipping around it. A push against a stale base fails with the changelog of what changed on the shelf. A kit that fails its own verifier (`vos validate`) fails the job after the comment says why. Uploads stay yours: the kit is an artifact on the run, never uploaded anywhere for you. MIT. The CLI it installs, `@vosjs/cli`, is MIT too. diff --git a/action.yml b/action.yml index b9910ac..9cdad8e 100644 --- a/action.yml +++ b/action.yml @@ -1,8 +1,8 @@ name: vos release media description: >- - Record the real product in CI, cut the release's media from it (store - screenshots, cards, the README loop, the demo), verify every asset against - its channel spec, push the take to vos.so, and keep one comment on the pull + Record the real product in CI, cut the release's videos from it (the README + loop, the feed and vertical cuts, the demo), verify every cut against its + channel spec, push the take to vos.so, and keep one comment on the pull request with the watch page and the kit. The next release is a re-render, not a re-shoot. author: vosso @@ -18,8 +18,8 @@ inputs: description: The committed cut to carry onto the new footage (vos plan --reuse --from). Skipped when absent. default: media/doc.json channels: - description: The channel set vos deliver renders (cws,producthunt,x,linkedin,og,github,youtube or all). - default: cws,og,github + description: The channel set vos deliver renders (youtube,x,shorts-linkedin,github or all). + default: github release: description: The release name stamped on the kit and the push label. Defaults to the tag, or pr-. default: '' diff --git a/scripts/comment.mjs b/scripts/comment.mjs index c3607c8..00de5a8 100644 --- a/scripts/comment.mjs +++ b/scripts/comment.mjs @@ -49,11 +49,9 @@ if (push?.vosId) { ) } if (kit?.assets?.length) { - lines.push('| Channel | Asset | Size | Bytes | Length | Moment |', '| --- | --- | --- | --- | --- | --- |') + lines.push('| Channel | Asset | Size | Bytes | Length |', '| --- | --- | --- | --- | --- |') for (const a of kit.assets) { - lines.push( - `| ${a.channel} | ${a.asset}${a.source === 'poster' ? ' (poster)' : ''} | ${a.w}x${a.h} | ${kb(a.bytes)} | ${secs(a.seconds)} | ${a.frameTime !== null && a.frameTime !== undefined ? `${a.frameTime.toFixed(1)} s` : ''} |`, - ) + lines.push(`| ${a.channel} | ${a.asset} | ${a.w}x${a.h} | ${kb(a.bytes)} | ${secs(a.seconds)} |`) } lines.push('') } diff --git a/test/actions.json b/test/actions.json index 0a6d5e8..cbd8e8f 100644 --- a/test/actions.json +++ b/test/actions.json @@ -9,6 +9,6 @@ { "id": "scroll", "do": "scroll", "dy": 700 }, { "id": "settle", "do": "wait", "ms": 1200 }, { "id": "section", "do": "hover", "selector": "h2", "ms": 900 }, - { "id": "end", "do": "wait", "ms": 1500 } + { "id": "end", "do": "wait", "ms": 6000 } ] } From c6c897ea52db464fb452d3cd712d070eda198e69 Mon Sep 17 00:00:00 2001 From: Hongbin Li Date: Sun, 11 Oct 2026 09:25:13 -0700 Subject: [PATCH 2/2] The dogfood take records /agents, where /cli now redirects --- .github/workflows/ci.yml | 2 +- test/actions.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0053be7..bc4021f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ permissions: pull-requests: write jobs: dogfood: - # The action run on itself: record vos.so's own CLI page, deliver the + # The action run on itself: record vos.so's own agents page, deliver the # README loop, verify it, and on a pull request keep the comment. Only a # push to main versions the tracked vos in test/vos.json (the dogfood # take on the vos.so shelf): a pull request run gets no key, so two diff --git a/test/actions.json b/test/actions.json index cbd8e8f..32ac1cd 100644 --- a/test/actions.json +++ b/test/actions.json @@ -1,5 +1,5 @@ { - "url": "https://vos.so/cli", + "url": "https://vos.so/agents", "viewport": { "width": 1280, "height": 800 }, "steps": [ { "id": "open", "do": "wait", "ms": 1200 },