# Paragraph cuts: independent technical package review

**Verdict: changes requested — two reproduced P2 verification defects.**

The documented offline workflow works for both retained inputs. Its success
receipts are not reliable for the malformed-input cases below. This is a
guide/package review, not a source-aesthetic or blind review. September 13, 2026.

## Reviewed input

- Sealed archive: `paragraph-cuts-guide-r01.zip`, **841,399 bytes**.
- SHA-256: `fbff95c4b91307917a1ebc4b8498e21ae97ba285695dadf8f6d63fd998083718`.
- **24 archive files**, **1,647,228 uncompressed bytes**; no duplicate, escaping,
  or symlink members. All **24 public-tree files** matched the sealed archive.
- Nested `core-selected.zip`: **23 members**, **166,470 compressed bytes**,
  **441,343 uncompressed bytes**; SHA-256
  `d19ac0ccfde3bbfefb786223685277a1085641150807af6556f306b67db2aab7`.
- All 23 selected-member size/hash bindings and all 23 outer checksum entries
  passed. The original full publication archive was not independently fetched;
  selection ancestry beyond the supplied bindings is not newly authenticated.

## PGC-01 — P2: preparation reports two variants without validating the inventory

**Locations:** `paragraph-cuts/run.mjs:99`, `paragraph-cuts/run.mjs:107`,
`paragraph-cuts/run.mjs:137`, `paragraph-cuts/run.mjs:147`.

The preparer iterates whichever records the supplied index contains, checks each
listed file's hash, then unconditionally reports two variants. It does not check
the six-state inventory or its dwell bindings against the retained recipe.

**Reproduced:** empty, one-entry and five-entry indexes all exit **0**, announce
`"variants":2`, and write successful preparation receipts containing respectively
**0, 1 and 5 records/PNGs**. With all six valid SVGs unchanged, changing only the
first index entry's interval from **[0,7)** to **[99,100)** also exits **0** and
copies that incorrect interval into the preparation receipt.

Minimal reproducer, after the README's environment setup and successful stage;
`CASE` must designate a new, authorized scratch directory:

```bash
mkdir -p "$CASE/svg"
printf '{"files":[]}\n' > "$CASE/svg/index.json"
node "$KIT/run.mjs" --action prepare --project "$WORK/project" \
  --browser "$CHROME" --svg "$CASE/svg" --out "$CASE/prepared"
```

**Impact:** a preparation job can announce completion without the six plates
needed for the Resolve timelines, or export an incorrect timing contract.
The supplied index itself is correct. Following preparation with the full
movie/plate verifier would expose missing files; that later failure does not
make the preparation success truthful. Altered SVG bytes without an updated
hash, and a missing *listed* SVG, correctly fail; those controls do not check
omitted records or dwell metadata.

**Fix:** validate the exact expected filenames, variants and half-open intervals
before starting the browser, and derive the reported counts from validated
completed output. Evidence IDs: `prepare-empty-index`, `prepare-one-state`,
`prepare-five-states`, `prepare-wrong-metadata`.

## PGC-02 — P2: omitted plates turn an unperformed check into a pass

**Locations:** `paragraph-cuts/verify.py:116`, `paragraph-cuts/verify.py:138`,
`paragraph-cuts/verify.py:145`, `paragraph-cuts/verify.py:153`.
Contradictory scope description: `paragraph-cuts/README.md:115`.

`--plates` is optional. Without it, the verifier skips crop comparisons and cut
detection, then defaults each absent `platePass` field to true. The resulting
CLI and JSON report **`platePass: true`**, with exit **0**.

**Reproduced:** encode crop 1 as a constant 33-frame movie, use it for both names,
and omit `--plates`. Both clocks are valid, but there are **zero** detected mask
cuts rather than cuts at 7/16. The verifier nevertheless reports two variants,
66 decoded output frames and a plate pass. Adding the canonical plates to the
same invocation rejects these same movies with exit **1**.

Minimal reproducer, using the README's prepared assets and shared encoder lock:

```bash
mkdir -p "$CASE/renders"
flock "$ENCODER_LOCK" ffmpeg -v error -loop 1 -framerate 24000/1001 \
  -i "$OUT/prepared/original-crop-1.png" -frames:v 33 -c:v libx264 \
  -crf 16 -pix_fmt yuv420p -an -video_track_timescale 24000 -threads 1 \
  "$CASE/renders/original.mp4"
cp "$CASE/renders/original.mp4" "$CASE/renders/adaptation.mp4"
flock "$ENCODER_LOCK" python3 -B "$KIT/verify.py" \
  --renders "$CASE/renders" --out "$CASE/unchecked.json"
```

**Fix:** require plates for the advertised preparation/cut gate, or explicitly
report that those checks were not run in a clock-only mode. Do not default
unperformed checks to passing. The exact README command supplies plates and
does not encounter this defect. Evidence IDs: `verify-no-cuts-without-plates`,
`verify-no-cuts-with-plates`, `boundary-results`.

## What independently passed

| Check | Exact result |
| --- | --- |
| README execution | Both shell blocks completed with exit 0 from a fresh stage; kit path contained a space |
| Dependencies/browser | Existing external resolver; Node 24.13.1, full Chrome 152.0.7977.42, Remotion 4.0.520; no installs, dependency copies or dependency symlinks |
| Supplied tests | 8 Python + 6 Node tests; 14 distinct tests passed; TypeScript diagnostics: 0 |
| Independent inventory/consistency assertions | 71 groups passed; reruns are not additional tests |
| Original SVG states | 6 parsed, regenerated byte-identically and prepared; editable two-line text, matching embedded Geist, no raster images or external asset references |
| Retained movies | 2 fresh renders; 33 frames each, 66 target frame positions checked against plates and recorded RGB frame hashes |
| Cadence/cuts | 1920×1080, silent H.264/yuv420p, progressive, 24000/1001; PTS 0–32032 on 1/24000 clock, end 33033/24000; dwells 7/9/17 and cuts 7/16 |
| Invalid content/widths | All 19 independent invalid cases rejected |
| Preparation input probes | 6 cases: 4 incorrect acceptances described in PGC-01; 2 correct rejections |
| Negative media verification | 3 invocations: no-cuts/no-plates incorrectly passed; no-cuts/plates and wrong-crop plates correctly failed |
| Provenance boundary | 10 cases matched their intended boundaries: 3 acceptances and 7 rejections |
| Additional direct-content use | 1 successful 33-frame color-only custom render through the core CLI and external resolver; no new paragraph-fit claim |
| Resolve documentation | Matching supplied manual PDF hash; 15 control-text checks; 6 cut-table rows and 33 retained clock rows checked arithmetically |

The core verifier correctly rejects changes to the bound recipe, shared source,
used font, movie bytes, missing manifest and a bound custom-content file. It
accepts relocation preserving relative layout and irrelevant files. A variant
render uses the recipe's inline content, not the duplicate example JSON; changing
that unused example is correctly ignored by the core verifier, while the kit's
stricter 23-member check rejects it. These are unsigned reproducibility bindings,
not proof of authorship or complete dependency-tree attestation.

Fresh primary movie hashes exactly match the sealed verification claims:

| Movie | SHA-256 |
| --- | --- |
| `original.mp4` | `24bd8e80dfd0a1f094d916945a18f10d07d45c3b8fe1ff7ea59b8423fc3a71ef` |
| `adaptation.mp4` | `ece7eea3a0ec95e87153fe6b2a866e16bb7df74d6ed43111e81400f1d6eb44d2` |

The six fresh PNG hashes and all 66 primary decoded RGB frame hashes also match
the sealed claims. No unrelated source-critic packet or other kit findings were
used. Full commands, failed probes, derivatives and per-file input/output hashes
are retained privately. No package/shared-repository changes or publication were
performed. The instrumented completed README replay peaked at **38,305,792 bytes**
under the **80,000,000-byte** allowance; that is a phase measurement, not a claim
to have continuously measured the entire review's transient peak.

## Single biggest remaining gap

**Native Resolve execution is unverified: zero native application runs or
exports.** The guide's frame durations, non-drop-frame labels, unchanged-plate
Inspector settings, no-double-transform warning and inclusive export endpoint
are internally consistent and supported by the retained manual. That does not
prove the workflow in an installed Resolve edition, its available encoder,
color handling or actual playback. Close this gap with the two native timelines,
recorded settings and exports, the full plate-aware verifier, and a real playback
review. Browser PNG preparation is not a Resolve run.

The supplied source limits remain untouched: **29/33 native PNGs available**;
local frames **19, 20, 21, 27** missing; source font unrecovered; **PC-03 open**.
No native source frames were reinspected and no source-quality approval or
moving-source judgment is awarded here.
