feat(website): recording pages ship session.gif for X; eight t27 tri commands recorded - #1295
Merged
Merged
Conversation
… X animates A tweet that links t27.ai/term/ID/ shows card.png: X renders a link card as a still image, and only an animated GIF attached to the tweet as media moves. An intent link cannot attach media, so the page now carries the GIF the owner attaches by hand. The ten published recordings gain session.gif, rendered by `tri cast gif ID --repo` inside X's animated-GIF limits (15 MB, 1280x1080, 350 frames, 300M pixels of w*h*frames). meta.json names it under "gif", and each page links it next to the preview card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ts run t27's tri had 0 of 52 cards with a recording. Eight now have one, each run with target/release/tri built from gHashTag/t27 at 1b12580ce699, every exit code 0, home path scrubbed: tri misread tri discard top tri census audit tri seals fresh/hollow tri prose report tri lean vacuous/reach tri competitors audit tri vectors debt Each gets public/term/t27-tri-*/ (page, cast, card, GIF, meta.json). The IDs say t27 because Trinity and trios each have a tri too; check:tools-coverage confirms none of the eight command words is in another CLI. The cards are gHashTag/t27's (specs/tools/README.md: edit there, re-vendor here). The eight vendored cards carry the same hunks as gHashTag/t27#5775, line for line; the rest of each file stays at the vendored t27@bf7d8eea9 until the next world refresh. Merge after gHashTag/t27#5775. Recorded but left out: `tri ledgers audit` exits 1, `tri status` and `tri health` print ring-47 data from 2026-04-06, `tri worktrees` ran past 120 s. agents-from-specs.test.mjs pinned withCast at 2 while main already had 10; it now pins 18 and checks the t27 tri misread card too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
github-actions Bot
added a commit
that referenced
this pull request
Oct 3, 2026
feat(website): recording pages ship session.gif for X; eight t27 tri commands recorded (#1295) * feat(website): every recording page ships session.gif, the one format X animates A tweet that links t27.ai/term/ID/ shows card.png: X renders a link card as a still image, and only an animated GIF attached to the tweet as media moves. An intent link cannot attach media, so the page now carries the GIF the owner attaches by hand. The ten published recordings gain session.gif, rendered by `tri cast gif ID --repo` inside X's animated-GIF limits (15 MB, 1280x1080, 350 frames, 300M pixels of w*h*frames). meta.json names it under "gif", and each page links it next to the preview card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(website): eight t27 tri commands recorded, each card ends with its run t27's tri had 0 of 52 cards with a recording. Eight now have one, each run with target/release/tri built from gHashTag/t27 at 1b12580ce699, every exit code 0, home path scrubbed: tri misread tri discard top tri census audit tri seals fresh/hollow tri prose report tri lean vacuous/reach tri competitors audit tri vectors debt Each gets public/term/t27-tri-*/ (page, cast, card, GIF, meta.json). The IDs say t27 because Trinity and trios each have a tri too; check:tools-coverage confirms none of the eight command words is in another CLI. The cards are gHashTag/t27's (specs/tools/README.md: edit there, re-vendor here). The eight vendored cards carry the same hunks as gHashTag/t27#5775, line for line; the rest of each file stays at the vendored t27@bf7d8eea9 until the next world refresh. Merge after gHashTag/t27#5775. Recorded but left out: `tri ledgers audit` exits 1, `tri status` and `tri health` print ring-47 data from 2026-04-06, `tri worktrees` ran past 120 s. agents-from-specs.test.mjs pinned withCast at 2 while main already had 10; it now pins 18 and checks the t27 tri misread card too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A tweet that links a recording page (for example https://x.com/t27_dev/status/2106387834085220452) shows
card.png, a still. X renders a link card as an image and animates only a GIF attached to the tweet as media, and an intent link cannot attach media. This PR gives every recording page asession.gifthat fits X's animated-GIF limits, so the owner can attach it. It also publishes eight new recordings of t27'stri, which had 0 of 52 commands recorded.Merge after gHashTag/t27#5775. The eight t27 tri cards are vendored from gHashTag/t27 (
specs/tools/README.md: edit there, re-vendor here). Their vendored copies here carry the same CAST hunks as that PR, line for line, and the rest of each file stays at the vendoredt27@bf7d8eea9. The recordings and the CASTs have to land together:check:tools-coveragefails on a recording whose card has no CAST, andcheck:toolsfails on a CAST whose recording is missing.Commit 1:
session.gifon every recording pagepublic/term/<id>/session.gif, rendered bytri cast gif <id> --repo. Each GIF fits X's limits: at most 15 MB, 1280x1080, 350 frames and 300M pixels of whframes. The largest,x7-board, is 0.79 MB.meta.jsonnames the file under"gif". Each page links GIF next to Preview card.Commit 2: eight t27 tri recordings
term/t27-tri-misread/tri misreadterm/t27-tri-discard/tri discard topterm/t27-tri-census/tri census auditterm/t27-tri-seals/tri seals fresh,tri seals hollowterm/t27-tri-prose/tri prose reportterm/t27-tri-lean/tri lean vacuous,tri lean reachterm/t27-tri-competitors/tri competitors auditterm/t27-tri-vectors/tri vectors debttarget/release/tribuilt from gHashTag/t27 at 1b12580ce699. Every exit code is 0, and the home path is scrubbed.t27because Trinity and trios have atritoo.meta.json, and the gallery now lists 18.agents-from-specs.test.mjspinnedwithCastat 2, but main already had 10. It now pins 18 and also checks the t27tri misreadcard.The tooling side (
termgif.pyandtg.pyin~/skills, which are not in this repository) now writessession.gifonpublish/ship. Thex.txtdraft says to attach it, and the Telegram follow-up after the tap sends the GIF as a file to attach on X.{ "version": 1, "head_sha": "509ef43df34d522f380fa5a04d1af0288d51e028", "summary": "Every recording page now ships a session.gif within X's animated-GIF limits, because X animates only an attached GIF, never a link card; eight t27 tri commands are recorded, so t27 goes from 0 to 8 of 52 recorded commands.", "changes": [ "apps/website/public/term/{devkit-flow,tri-blog-list,tri-fpga-keycheck,tri-fpga-selftest,tri-fpga-specs,tri-game-selftest,tri-game-tick,tri-game-vault,tri-selftest,x7-board}/: session.gif added, meta.json gains \"gif\", index.html links it", "apps/website/public/term/t27-tri-{misread,discard,census,seals,prose,lean,competitors,vectors}/: eight new recording pages (index.html, session.cast, session.gif, card.png, meta.json) and the gallery index", "apps/website/public/t27/files/specs/tools/tri/{misread,discard,census,seals,prose,lean,competitors,vectors}.t27: the CAST hunks of gHashTag/t27#5775, vendored line for line", "apps/website/public/tools/spec-tools.json: regenerated, 18 cards with a recorded run", "apps/website/scripts/agents-from-specs.test.mjs: withCast pinned at 18 instead of a stale 2, and the t27 tri misread card checked" ], "tests": [ {"command": "npm run check:tools-coverage", "status": "passed", "result": "t27 8 of 52 recorded, trios 10 of 295, trinity 0 of 249; every unambiguous recorded command has its CAST", "evidence": "local run of this head, 2026-10-03"}, {"command": "npm run check:tools", "status": "passed", "result": "607 cards, with a recorded run 18", "evidence": "local run of this head, 2026-10-03"}, {"command": "npm run check:tools-site && npm run check:agents && npm run check:onboarding && npm run check:subpath-urls && npm run check:shared-core", "status": "passed", "result": "all five exit 0", "evidence": "local run of this head, 2026-10-03"}, {"command": "node --test scripts/tri-commands.test.mjs scripts/agents-from-specs.test.mjs", "status": "passed", "result": "63 of 63 pass; before the test edit, 1 failed on the stale withCast count (18 !== 2)", "evidence": "local run of this head, 2026-10-03"}, {"command": "tri cast check public/term/t27-tri-*/session.cast", "status": "passed", "result": "8 of 8: exit codes 0, key hits 0, home directory shown as ~", "evidence": "local run of this head, 2026-10-03"}, {"command": "termgif.x_over on all 18 public/term/*/session.gif", "status": "passed", "result": "18 of 18 within X's animated-GIF limits; largest 0.79 MB", "evidence": "local run of this head, 2026-10-03"}, {"command": "npm run check:spec-catalog", "status": "failed", "result": "the atlas records sha256 of the vendored files at t27@bf7d8eea9, and the eight edited cards no longer hash to those ids; check:spec-catalog runs only in the nightly t27-world-scan, which re-vendors from t27 master and rebuilds the atlas before it checks", "evidence": "local run of this head, 2026-10-03: assertion at qa/spec-catalog-contract.mjs:32"}, {"command": "npx vite build (apps/website)", "status": "not_run", "result": "not run locally; the website CI build covers it", "evidence": "no local build was run for this head"} ], "limitations": [ "Nothing was posted. Whether X keeps the attached GIF animated was not tried here: the GIFs fit X's documented limits, and the owner attaches one by hand.", "Until the next t27 world refresh, check:spec-catalog fails on the eight vendored cards, as stated in tests. If that refresh runs before gHashTag/t27#5775 merges, it drops the CASTs, and check:tools-coverage fails in the refresh PR.", "Not recorded: tri ledgers audit exits 1, tri status and tri health print ring-47 data from 2026-04-06, and tri worktrees ran past 120 s.", "Not opened in a browser: the pages were generated and the cards looked at as PNGs." ], "tags": ["Tooling", "Website"], "blog": { "title": "Why a recording posted on X showed a still, and the GIF that fixes it", "summary": "A link card on X is always a still image, so every recording page now ships a session.gif within X's limits, and eight t27 tri commands joined the gallery.", "outline": [ "A post linking a recorded tri session showed a static preview card, because X renders link cards as images and animates only GIFs attached as media, which an intent link cannot attach.", "tri cast now renders session.gif inside X's animated-GIF limits on every publish, the drafts and the Telegram follow-up hand that file to the owner, and eight t27 tri commands were recorded with every exit code 0.", "Posting stays the owner's click, the vendored t27 cards wait for gHashTag/t27#5775 and the next world refresh, and four popular commands were left unrecorded because their output was failing, stale or too slow." ], "cast": "term/t27-tri-misread/session.cast", "reproduce": ["tri cast gif t27-tri-misread --repo <trinity checkout>/apps/website"] } }🤖 Generated with Claude Code