fix(story-mode): a phone you can use with a thumb, and saves that say what they saved

From review round 5 (a phone with touch):

- Touch screens: every control at least 44 px (prev/next, close, the
  Story/Director's cut toggle, Save image, the final panel's chips, drawer
  buttons and links), and the small type at 13 px.
- The drawer on a phone starts below the bar (it cut through it), closes by
  dragging its head down, and keeps its head small in landscape.
- The turn picker says where you are ("Turn 2 of 5"), learns about new
  turns while you look at an older one, and a turn you picked yourself is
  not announced as news.
- A check whose command also wrote files offers "See the 2 files it wrote".
- Test counts are read from the whole output: a later command's lines had
  pushed pytest's "5 passed" out of the kept tail.
- A save names its commit: "Claude saves the work: "feat: add wrap() for
  modular wrapping into a range"." (from -m, -am, --message or the
  here-document of git commit -F -; a trailer is never the subject).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer committed 2026-10-18 12:43:59 +02:00
1 parent cdb7b5d55f
commit 3f1ecfe83a
11 files changed
+118 -22

No files matched your search

@@ -63,7 +63,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"feat: add clamp() with pytest coverage\".",
"director": "git commit -q -F -",
"balloon": null,
"tests": null,
@@ -213,7 +213,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"feat: add wrap() for modular wrapping into a range\".",
"director": "git commit -q -F -",
"balloon": null,
"tests": null,
@@ -63,7 +63,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"feat: add slugify module with node:test suite\".",
"director": "git commit -q -F -",
"balloon": null,
"tests": null,
@@ -117,7 +117,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"test: cover empty-string input for slugify\".",
"director": "git commit -q -F -",
"balloon": null,
"tests": null,
@@ -180,7 +180,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"docs: changelog\".",
"director": "git commit -m \"docs: changelog\" -m \"Co-Authored-By: Claude…",
"balloon": "Step 10:",
"tests": null,
@@ -228,7 +228,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"docs: changelog entry\".",
"director": "git commit -am \"docs: changelog entry\" -m \"Co-Authored-By:…",
"balloon": "Step 15:",
"tests": null,
@@ -54,7 +54,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude writes 1 file and saves the work.",
"story": "Claude writes 1 file and saves the work: \"chore: ignore Python and pytest caches\".",
"director": "git commit -q -m \"chore: ignore Python and pytest caches · writes 1 file",
"balloon": null,
"tests": null,
@@ -42,7 +42,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude writes 2 files and saves the work.",
"story": "Claude writes 2 files and saves the work: \"feat: add package.json and index.js with add and slugify\".",
"director": "git commit -q -m \"feat: add package.json and index.js with… · writes 2 files",
"balloon": null,
"tests": null,
@@ -72,7 +72,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"test: add node:test suite for add and slugify\".",
"director": "git commit -q -m \"test: add node:test suite for add and slu…",
"balloon": null,
"tests": null,
@@ -123,7 +123,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"docs: add CONTRIBUTING.md\".",
"director": "git commit -q -m \"docs: add CONTRIBUTING.md",
"balloon": null,
"tests": null,
@@ -240,7 +240,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"refactor: split index.js into lib/ modules behind an index.…\".",
"director": "git commit -q -m \"refactor: split index.js into lib/ module…",
"balloon": null,
"tests": null,
@@ -261,7 +261,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"docs: add full JSDoc to every function and module\".",
"director": "git commit -q -m \"docs: add full JSDoc to every function an…",
"balloon": null,
"tests": null,
@@ -72,7 +72,7 @@
{
"kind": "save",
"ok": true,
"story": "Claude saves the work.",
"story": "Claude saves the work: \"feat: add pomodoro timer with tests\".",
"director": "git commit -q -m \"feat: add pomodoro timer with tests\" -m \"…",
"balloon": null,
"tests": null,
+1 -1
View File
@@ -794,7 +794,7 @@ describe('buildStoryPage', () => {
expect(byKind.backup.caption.director).toContain('3 calls inside');
expect(byKind.loop).toMatchObject({ rounds: 2, ok: true, added: 2, removed: 1 });
expect(byKind.loop.caption.story).toBe('Fix and test: the first run fails, the second passes.');
expect(byKind.save.caption.story).toBe('Claude saves the work.');
expect(byKind.save.caption.story).toBe('Claude saves the work: "fix: banner".');
expect(byKind.complete.caption.story).toBe('Done in 7 minutes.');
expect(byKind.complete.caption.director).toContain('7 min 12 s');
});