commit 50a218193ec36dc01e65333a662ad1112fcb7bf1
parent d70dceccc4a3215a35381704782b902863fe9c44
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Mon, 21 Sep 2026 01:49:14 -0400
deliver: an id shared under another name is still shared
Dry-read of the real project (read-only, no writes to ~/reports): 163 clips,
69 confirmed, 10 incorrect, 84 unjudged, 10 confirmed clips with no file -- and
a next batch of SIX, every one of which had already gone out.
The six went out in the emancipation/Ireland set under different ids: em01,
ie01 and their siblings are a separate cut of the same moments, and nothing on
disk ties those files to b02/c08/f01/f05/h01/h02. What ties them is the
sentence the batch that followed wrote down -- "minus the 6 already shared in
the emancipation/Ireland set (b02 c08 f01 f05 h01 h02)" -- so that sentence is
read, as narrowly as prose can be read: the phrase, a parenthesis, and only the
tokens shaped like a clip id. A batch this writes phrases it the same way, so
its own list round-trips through the parser unchanged.
With it the real project reads 59 shared, 0 to ship and 10 to cut, which is the
actual next move rather than a batch of duplicates.
The fixture now carries both kinds: b01 excluded by the file name its list
gives, a02 by a sentence and nothing else.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
4 files changed, 49 insertions(+), 12 deletions(-)
diff --git a/umtool/docs/clip-bench.md b/umtool/docs/clip-bench.md
@@ -387,9 +387,16 @@ python file beside one project's deliverables is not a profile the next project
can reach.
**Exclusions are the folders, not a list.** The next batch skips every id an
-existing `share-*/LIST.md` already shipped (read back from the file NAMES it
-lists, plus the `<!-- shared-ids: … -->` marker this writes) and every clip
-ruled `incorrect`. A `shared.json` would have been a second record to drift.
+existing `share-*/LIST.md` already shipped and every clip ruled `incorrect`. A
+`shared.json` would have been a second record to drift from them. Three ways an
+id counts as shipped, in order of how much they can be trusted: the file NAMES
+a list gives, the `<!-- shared-ids: … -->` marker this writes, and — narrowly —
+the phrase `already shared (…)`, taking only the tokens shaped like a clip id.
+The last one is not decoration: six ElfpireEva clips went out in an earlier set
+under DIFFERENT ids (`em01`, `ie01` — a separate cut of the same moments), and
+the sentence the next batch wrote down is the only thing on disk tying the two.
+Without it, the next batch re-ships all six. A batch this writes phrases it the
+same way, so its own list round-trips.
**Nothing rewrites prose.** `apply-manifest.py` prints the lines of
`content*.py` that cite each clip the walk threw out, and the panel shows the
diff --git a/umtool/e2e/deliver.spec.ts b/umtool/e2e/deliver.spec.ts
@@ -133,22 +133,31 @@ test("the share batch skips every id an existing LIST.md already shipped", async
existsSync(path.join(root, variant, folder, "a01_2025-01-01_A-Fixture-Stream.mp4")),
`${variant}/a01`,
).toBe(true);
- expect(
- existsSync(path.join(root, variant, folder, "a02_2025-01-02_A-Fixture-Stream.mp4")),
- `${variant}/a02`,
- ).toBe(true);
}
- // THE EXCLUSIONS. b01 went out in share-first, and the folders are the
- // record: nothing was written down anywhere else. b02 was ruled incorrect.
+ // THE EXCLUSIONS, and there are three kinds.
+ //
+ // b01 is in share-first by FILE NAME. a02 is in share-first only as a
+ // SENTENCE -- it went out in an earlier set under another id, which is the
+ // real project's case for six clips (em01/ie01 are a separate cut of
+ // b02/c08/f01/f05/h01/h02) and the only record that ties the two. b02 was
+ // ruled incorrect. The folders and their lists are the whole record: no
+ // second file to drift from them.
const list = readFileSync(path.join(root, "LIST.md"), "utf8");
expect(list).toContain("a01_2025-01-01");
+ expect(list).not.toContain("a02_");
expect(list).not.toContain("b01_");
expect(list).not.toContain("b02_");
- expect(list).toContain("1 already shared (b01)");
+ expect(list).toContain("2 already shared (a02 b01)");
expect(list).toContain("1 ruled incorrect (b02)");
+ expect(
+ existsSync(path.join(root, "orig", folder, "a02_2025-01-02_A-Fixture-Stream.mp4")),
+ ).toBe(false);
expect(existsSync(path.join(root, "orig", "B-The-second-fixture-section"))).toBe(false);
+ // …and the list this wrote says it the same way, so the NEXT batch reading
+ // it back excludes all three without anybody restating them.
+
// The std encode is the one people download, and it is EXACTLY 1280x720.
const size = execFileSync("ffprobe", [
"-v", "error", "-select_streams", "v:0", "-show_entries", "stream=width,height",
diff --git a/umtool/e2e/fixtures/make-fixture.mjs b/umtool/e2e/fixtures/make-fixture.mjs
@@ -1078,14 +1078,17 @@ SECTIONS = [
);
// A batch that already went out. The folders ARE the record, so the exclusion
// list is read back from this rather than from a second file that would drift
-// from it.
+// from it -- by FILE NAME for b01, and out of the prose for a02, which is the
+// real project's case: six clips went out in an earlier set under different
+// ids, and the sentence naming them is the only thing that ties the two.
mkdirSync(path.join(DELIVER, "share-first"), { recursive: true });
writeFileSync(
path.join(DELIVER, "share-first", "LIST.md"),
[
"# deliver-fixture — share batch `first`",
"",
- "1 clip, sent before this fixture was born.",
+ "1 clip, sent before this fixture was born — and 1 already shared (a02) in",
+ "an earlier set under another id, which is the only record that it went out.",
"",
"## 2. The second fixture section (`B-The-second-fixture-section/`)",
"",
diff --git a/umtool/lib/report/deliver.mjs b/umtool/lib/report/deliver.mjs
@@ -97,6 +97,24 @@ export async function sharedIdsIn(dir) {
for (const m of list.matchAll(/\b([A-Za-z]{1,3}\d{1,3})_[^\s`*]*\.mp4\b/g)) ids.add(m[1]);
const marked = /<!--\s*shared-ids:\s*([^>]*?)\s*-->/.exec(list);
if (marked) for (const id of marked[1].split(/[\s,]+/).filter(Boolean)) ids.add(id);
+ // AND THE IDS A LIST NAMES AS SHARED SOMEWHERE ELSE.
+ //
+ // Measured on the real project: six clips went out in an earlier set under
+ // DIFFERENT ids (em01, ie01 -- a separate cut of the same moments), and
+ // nothing on disk ties those files to b02/c08/f01/f05/h01/h02. What does
+ // tie them is the sentence the batch that followed wrote down: "minus the
+ // 6 already shared in the emancipation/Ireland set (b02 c08 f01 f05 h01
+ // h02)". Without this the next batch re-ships all six.
+ //
+ // Prose, and read as narrowly as prose can be: the phrase, then a
+ // parenthesis, then only the tokens that are shaped like a clip id. The
+ // batches this writes phrase it the same way, so a generated list round
+ // trips through here unchanged.
+ for (const m of list.matchAll(/already shared[^(\n]*\(([^)]*)\)/gi)) {
+ for (const tok of m[1].split(/[\s,]+/)) {
+ if (/^[A-Za-z]{1,3}\d{1,3}$/.test(tok)) ids.add(tok);
+ }
+ }
}
// And the files themselves, for a batch assembled before anyone wrote a list.
const walk = async (d) => {