commit 7cb67429095ae4c2df3ddbe4e35c552ce2706195
parent f0aaf37d50313e7d57369a944d642fc663ccbbed
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Sat, 19 Sep 2026 01:49:58 -0400
umtool: the walk button belongs in the title bar, and the CLI needs clipVerdict
Two fixes found by looking at the thing rather than at the diff.
The "Walk the cut" button was above the clip rows, which is above the rows and
750 px down the page: a project page opens on decisions, sources and the build
chain, so the first control of the walk was off the first screen. It is in the
title bar now, beside the deliverable, with the keys and the coverage under it.
And `umtool window --verdict confirmed` wrote the manifest and then crashed on
`clipVerdict is not defined` -- the import edit that added it silently matched
nothing. It reads back `review: confirmed | corrected | unreviewed` now, and a
patch carrying both a correction and a verdict is refused BEFORE the write, so
nothing lands half-applied.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
2 files changed, 30 insertions(+), 28 deletions(-)
diff --git a/umtool/bin/umtool.mjs b/umtool/bin/umtool.mjs
@@ -41,7 +41,14 @@ import {
resolveProject,
summarise,
} from "../lib/projects/core.mjs";
-import { correctionsOf, readClipDetail, readManifest, reviewOf, sourcesOf } from "../lib/projects/report.mjs";
+import {
+ clipVerdict,
+ correctionsOf,
+ readClipDetail,
+ readManifest,
+ reviewOf,
+ sourcesOf,
+} from "../lib/projects/report.mjs";
import { createSnapshot, listSnapshots, readSnapshot } from "../lib/report/snapshots.mjs";
import { diffManifests, formatChange } from "../lib/report/manifest-diff.mjs";
import { EXPORT_FORMATS, exportProject } from "../lib/report/export.mjs";
diff --git a/umtool/components/projects/ReportProject.tsx b/umtool/components/projects/ReportProject.tsx
@@ -174,6 +174,28 @@ export default async function ReportProject({
)}
</div>
</div>
+ {/* ---- the way in ----
+ Every clip row carries a bench link, which is the right control for
+ "go to that one" and the wrong one for "start". Reviewing a cut is
+ watching every clip in order, and the first clip is where that
+ begins -- so it is a button in the title bar rather than the
+ eleventh link on a page whose first screenful is decisions,
+ sources and the build chain. */}
+ {clips.length > 0 && (
+ <div data-walk-cut="" className="flex flex-col items-start gap-1">
+ <Link
+ href={`/browse/${project.id}/clip/${clips[0].id}`}
+ data-walk-start={clips[0].id}
+ className={buttonVariants({ variant: "primary", size: "lg" })}
+ >
+ Walk the cut → start at {clips[0].id}
+ </Link>
+ <span className="text-[11px] text-[var(--color-dim)]" data-walk-progress="">
+ <kbd>p</kbd> / <kbd>n</kbd> move between clips · {review.reviewed} of {review.total}{" "}
+ reviewed{review.corrected > 0 ? ` · ${review.corrected} corrected` : ""}
+ </span>
+ </div>
+ )}
{build.built && (
<div className="text-right text-[11px] text-[var(--color-dim)]">
<div className="font-mono text-[var(--color-text)]">{build.slug}.mp4</div>
@@ -357,33 +379,6 @@ export default async function ReportProject({
<h2 className="micro mb-1.5">
the cut — {entries.length} entries, in array order
</h2>
- {/* ---- the way in ----
- Every row carries a bench link, which is the right thing for "go
- to that one" and the wrong thing for "start". Reviewing a cut is
- watching every clip in order, and the first clip is where that
- begins -- so it is a button, above the rows, rather than the
- eleventh link on the page. */}
- {clips.length > 0 && (
- <div
- data-walk-cut=""
- className="mb-2 flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded border border-[var(--color-line)] bg-[var(--color-panel)] px-3 py-2"
- >
- <Link
- href={`/browse/${project.id}/clip/${clips[0].id}`}
- data-walk-start={clips[0].id}
- className={buttonVariants({ variant: "primary", size: "lg" })}
- >
- Walk the cut → start at {clips[0].id}
- </Link>
- <span className="text-[11px] text-[var(--color-dim)]">
- <kbd>p</kbd> / <kbd>n</kbd> move between clips
- </span>
- <span className="micro ml-auto" data-walk-progress="">
- {review.reviewed} of {review.total} reviewed
- {review.corrected > 0 ? ` · ${review.corrected} corrected` : ""}
- </span>
- </div>
- )}
<ul className="space-y-1">
{entries.map((e) => {
// Anything that is not a CLIP renders generically. The timeline's