Skip to content

[codepress#5858 release] codepress-main is the release branch (OIDC publish); merge staging - #16

Merged
lightninglu10 merged 25 commits into
codepress-mainfrom
ve-release-codepress-main
Aug 22, 2026
Merged

[codepress#5858 release] codepress-main is the release branch (OIDC publish); merge staging#16
lightninglu10 merged 25 commits into
codepress-mainfrom
ve-release-codepress-main

Conversation

@lightninglu10

@lightninglu10lightninglu10 commented Aug 22, 2026

Copy link
Copy Markdown

Part of quantfive/codepress#5858 (Video editor v1) — item release.

codepress-main becomes the single release branch for
@quantfive/freecut-editor-surface. staging stops being a release target.

Why

Two branches disagreed about how the package is released:

  • codepress-main @ 7799d29f had the working publish path: npm trusted
    publishing (OIDC — id-token: write, npm publish --provenance), an
    "already published → no-op" guard, and triggers on push to codepress-main
    plus freecut-editor-surface-v* tags. It shipped 0.3.1 on 2026-08-20.
  • staging @ 47e2db3c carried all the host-backed editor work (23 commits
    ahead, merge-base 4d62e808) and the QA tooling, but its copy of the
    publish workflow still used secrets.NPM_TOKEN — a secret that does not
    exist on this repo, so tag publishes from staging could never work.

What this does

1. Merges staging into codepress-main as a real merge commit
(e4ca524e) — history preserved, no squash, no rebase of staging.

Conflict resolution (12 conflicted paths):

  • .github/workflows/publish-editor-surface.yml — kept codepress-main's
    OIDC version as the base and folded in the one thing staging's copy had
    that it lacked (the explicit --registry=https://registry.npmjs.org flag
    and its manifest-drift comment). Every other step — provenance verify, tag
    validation, deterministic pack, consumer smoke — was already present and
    identical. All NPM_TOKEN / NODE_AUTH_TOKEN traces are gone, along with
    the now-pointless packages: write permission. The stale
    if: github.event_name == 'push' || github.ref_name == 'staging' guard and
    its "manual runs are limited to staging" comment now name codepress-main.
  • .github/workflows/sync-upstream.ymlno conflict, and the brief's
    premise here was wrong
    : staging never deleted this file, it never had
    it. git log --oneline --all -- .github/workflows/sync-upstream.yml shows
    it was only ever added on the codepress-main side (efc6b07c,
    7799d29f), after the 4d62e808 merge-base. The merge keeps it, which is
    what we want — it is what holds main as a clean upstream mirror.
  • Everything else (package.json, packages/freecut-editor/{package,README},
    provenance/*, scripts/package-editor-surface.mjs,
    src/features/editor/{components/editor.tsx,host/*}) — took staging's
    content. Verified per file that staging is a strict superset, not a
    divergence: codepress-main's copies are the same work squashed into
    7799d29f, and staging carries the later fixes (fix(editor): skip keyframe cache persistence when no workspace root (host-mounted) #12, fix(editor): host bridge round-trip stability + host-mode timeline shortcuts #13) on top.

2. Repoints every hard-coded release/base ref from origin/staging to
origin/codepress-main, semantics unchanged:

FileChange
scripts/publish-editor-surface-npmjs.mjsSTAGING_REFRELEASE_REF = origin/codepress-main; guard messages and the CI-fallback comment follow
scripts/publish-editor-surface-npmjs.test.mjsupdate-ref refs/remotes/origin/… fixture + test names
scripts/qa-head-binding.mjs, scripts/check-fallow-changed-health.mjsDEFAULT_BASE_REF
docs/qa/canonical-report.md, docs/qa/README.md, README.md, docs/pr2-provenance-and-packaging.mdthe gate set binds to codepress-main
packages/freecut-editor/README.mddescribes the OIDC branch/tag release path; the NPM_TOKEN instructions are replaced by the trusted-publisher description, and the manual fallback is repointed
.github/workflows/reproducible-package.yml, .coderabbit.yamlbase branches
CLAUDE.mdrecords the fork's actual branch model (codepress-main releases, main mirrors upstream) instead of upstream's main/staging/develop

Left alone deliberately: .claude/skills/changelog/SKILL.md:66, which
mentions staging/develop while describing upstream's branch model for
changelog drafting — not this fork's release ref.

No version bump, no tags.

⚠️ Merging this PR will publish 0.3.2

The workflow triggers on push to codepress-main, and staging brings
packages/freecut-editor/package.json to 0.3.2 (currently published:
0.3.1). So merging this publishes 0.3.2 via OIDC, and merging
#15 afterwards will publish 0.3.3. That is the intended
design — a merge that does not bump the version is a no-op, not a failure,
because of the already-published guard.

If you would rather publish only from tags, the one-line change is deleting
the branches: block from the on: push: trigger. Offering it, not doing it.

Follow-ups, not in this PR:

  • Neither codepress-main nor staging has any branch protection today. Now
    that codepress-main is the release branch and every push to it publishes
    to a public registry, it should get some.
  • .github/workflows/ci.yml runs on pull_request and on push to main
    only — it never listed staging, so there was nothing to repoint. If you
    want push-CI on the release branch too, that is a separate one-liner. (The
    fallow ratchet in CI is unaffected either way: it passes
    --base origin/${{ github.base_ref }} explicitly, so it already binds to
    codepress-main for PRs like this one; DEFAULT_BASE_REF in the scripts
    only governs local runs.)

Verification

Run at head e4daef3e from a clean tree.

GateResult
npm ci --ignore-scripts
npm run qa:binding -- --check✅ clean tree, head descends from 7799d29f (origin/codepress-main)
npm run check (typecheck)✅ 2445 files, 0 errors
npm run lint✅ exit 0
npm run build
npm run verify:provenance✅ dependency (51+16) and asset (5 roots) inventories verified
npm run package:editor-surfacefreecut-editor-surface-0.3.2.tgz, sha256 72516a0f…3713f6
npm run test:editor-surface:consumer -- --artifact <tgz>✅ installed 0.3.2 into a fresh consumer, 1/1
npm run test:publish-editor-surface-guards✅ 7/7 — the repointed guards, against origin/codepress-main
npm run check:changed-health✅ pass, 49 changed files, base origin/codepress-main
npm run check:boundaries / :deps-contracts / :legacy-lib-imports / :deps-wrapper-health / :edge-budgets
npm run check:qa-redaction✅ 7 files scanned, 0 findings; 6/6 fail-closed self-tests
npm run headless:test:node✅ 43/43
npm run headless:test:chrome✅ all render/edit/layout contracts, 19/19 edit ops
npm run qa:browser -- --skip-build✅ system Chrome 151, 4/4
actionlint (all workflows)✅ exit 0
node --check on the 4 changed .mjs

Inherited baseline failures (reproduced at base 7799d29f, not caused by
this PR — recorded per docs/qa/README.md, not papered over):

  • npm run check:unused-exports — ❌ FAIL: 129 findings, 10 new, 3 stale.
    Byte-identical counts at base 7799d29f. Not touching the allowlist
    (ratchet baseline).
  • npm run check:unused-class-members — ❌ FAIL: 83 findings, 2 stale.
    Byte-identical counts at base 7799d29f. Same rule.
  • npm run format:check — ❌ FAIL: 169 files. Identical count at the merge
    commit before my repoint; none of the files this PR touches are among them.
  • npm run test:run — ❌ FAIL: the known full-suite jsdom/localStorage
    baseline (Cannot read properties of undefined (reading 'setItem') from
    zustand persist). Base 7799d29f: 469 failed / 4057 passed.
    origin/staging: 469 failed / 4080 passed. This head: 584 failed / 4278
    passed — the counts move run to run because the uncaught exceptions abort
    test files at different points. Nothing in this diff can affect it:
    git diff origin/staging HEAD touches 14 files, none under src/,
    headless/, packages/freecut-editor/src/, package.json,
    package-lock.json, or provenance/. The merged tree is byte-identical to
    origin/staging everywhere the test suite reads.

Not done, on purpose

lightninglu10and others added 25 commits August 15, 2026 00:07
Merge PR2 provenance and reproducible packaging baseline for CodePress issue #5319.
feat: publish host-backed FreeCut editor surface
* add caption command and editor ui
* fix(editor): mount caption editor in production shell
* feat(editor): route captions through host surface
* fix(editor): preserve caption background opacity
* feat(editor): add host-backed transcript consumer
* fix(editor): keep host-visible sidebar tab across authoritative snapshots
Applying a transcript edit installs the authoritative snapshot, and the
host runtime reset the active sidebar tab to Media on every install.
That unmounted the transcript panel before it could show its applied
state or its inline revision-conflict error (the conflict only reached
the user through the host notify channel).
Preserve the active tab when host mode still shows it (media always,
text/transcript per capability and port), and keep resetting tabs host
mode does not expose. Cover the applied and conflict outcomes through
the real MediaSidebar path.
* feat(qa): add CodePress-parity QA gate set for staging PRs (#5319)
- docs/qa: gate-set README, canonical QA report format, verification graph
- scripts/qa-head-binding.mjs: emit/validate exact base/head + clean-tree binding
- scripts/qa-browser-check.mjs: browser discovery (system Chrome, then
Playwright chromium), renderFrame smoke, screenshot/log/manifest artifacts;
exit 3 = BLOCKED when no browser session exists
- scripts/qa-redaction-check.mjs: no secrets/tokens/local paths/media bytes
in QA docs and artifacts
- wire qa:binding, qa:browser, check:qa-redaction into package scripts/lint
- regenerate provenance package.json SHA256 pins for the script changes
- fallowrc: exclude scripts/qa-*.mjs from health complexity alongside the
existing local-quality-tooling exclusions
* fix(qa): pass changed-health on code, not config; correct gate docs
Judge FAIL follow-up: revert the .fallowrc.json health-ignore exclusion for
scripts/qa-*.mjs and instead decompose qa-head-binding/qa-browser-check/
qa-redaction-check main flows so every function sits under the fallow
CRAP/cognitive thresholds (0 introduced findings, verified with fallow audit).
Also correct docs/qa/README.md: verify aggregates gates 2 and 4-13 (lint is
not part of it), and gate 3 documents that lint requires the editor-surface
dist on a fresh tree (pre-existing TS2307 quirk, present at base).
* fix(qa): close redaction gate false negatives (judge G1)
- qa-redaction-check: replace the three known-root path patterns with a
generic absolute-path pattern (any Unix root or Windows drive path, URL
prefixes excluded) and match any image/video/audio data URI regardless of
payload length; secrets keep their patterns. Add a per-line
qa-redaction:allow marker for intentional doc examples (secrets never
allowlisted).
- qa-browser-check: sanitize logs with the same generic path pattern instead
of replacing only ROOT and os.homedir().
- Add deterministic negative fixtures (scripts/fixtures/qa-redaction/) and a
node:test self-test proving the gate fails closed on a tmp path, a generic
absolute path, a short media data URI, and a Windows path, and passes on
the clean set; wired into check:qa-redaction itself.
- Regenerate provenance package.json SHA256 pins for the script changes.
* fix(qa): detect Windows drive paths with forward slashes (review)
The generic absolute-path pattern's Windows branch only matched backslash
separators, so C:/Users/... passed both the checker and the browser-log
sanitizer. Accept either separator in both scripts and add the
negative-windows-forward-slash fixture to the fail-closed self-test (now
6/6).
…host-mounted) (#12)
The decoder-prewarm worker's keyframes_extracted handler called
updateMedia() unconditionally. updateMedia() goes through
requireWorkspaceRoot(), which throws when the editor surface is
host-mounted without <WorkspaceGate> (e.g. CodePress) — surfacing as
an uncaught error on every decoded play/pause cycle.
Gate the persistence call on getWorkspaceRoot(): host-mounted surfaces
skip cross-session keyframe persistence while in-session registration
(registerKeyframeIndex, keyframesSentForSrc) stays unconditional.
Bump @quantfive/freecut-editor-surface to 0.3.1 (fail-soft fix;
publish intentionally not done here).
…ortcuts (#13)
* fix(editor): keep host bridge round-trip stable for minimal clip items
stableSerialize treated a present-but-undefined key as different from a
missing key, and frameItemToNativeComparable unconditionally emitted
volume/speed/opacity/transform keys (plus an always-present text style
object). Host snapshots that omit those optional fields failed
metadataUnchanged after a simple drag or trim, landing in the
unsupported-edit branch, and untouched clips leaked into changed[] on
multi-clip timelines.
- stableSerialize now skips undefined-valued object entries.
- frameItemToNativeComparable emits volume/speed/opacity/transform only
when set, and the plain-text style key only when non-empty; an
opacity-only native transform round-trips as the top-level opacity
field the host sent.
- commandIdsForChanges compares clips with synthesized source bounds on
both sides so host items without sourceStart/sourceEnd do not appear
changed after the native bridge fills its defaults.
- deriveSupportedHostEdit batches one remove_item command per removed
item (bounded by MAX_COMMANDS_PER_OPERATION) instead of only handling
exactly one removal.
Round-trip tests install host snapshots through the real runtime,
perform store move/trim/remove operations, and assert the derived host
command batches.
* feat(editor): mount host-safe timeline shortcuts in host mode
TimelineShortcutsController was only rendered outside host mode, so
Delete/Backspace/Space/J/K/L and friends did nothing in the
host-embedded surface.
Add useHostTimelineShortcuts (composed in use-timeline-shortcuts.ts) and
mount it via a HostTimelineShortcutsController when hostRuntime is
present. The composition mounts only bindings that never mutate the
host-owned document outside the bridge:
- Playback/navigation and tool switching mount as-is (local UI state;
Shift+C split crosses the bridge as a supported split_item command).
- Delete/Backspace are extracted into a shared useDeleteShortcuts hook;
item removal flows through the bridge as remove_item commands, now
batched for multi-select.
- useUIShortcuts gains an enableHistory option (default true) so host
mode mounts zoom/snap without undo/redo, which would mutate the
temporal store without emitting host commands.
Ripple delete, clipboard, markers, in/out points, nudges, join, freeze
frame, and clear-keyframes stay unmounted in host mode.
The editor -> timeline edge stays within budget by exporting the new
hook from the existing use-timeline-shortcuts module.
* refactor(editor): drop redundant null guards in isOpacityOnlyTransform
nativeTransformToFrame fills every key, so the ?? 0 fallbacks were dead
branches that tripped the fallow changed-health complexity gate.
* fix(preview): keep host-provided cross-origin media audible
MediaElementAudioSourceNode silences cross-origin media served without
CORS approval (HTML spec), so host-mode playback through the Web Audio
clip graph was muted. Route cross-origin sources around the graph:
applyVideoElementAudioState and NativePitchCorrectedAudio now drive the
media element's volume/muted directly when the source is not
WebAudio-safe (isWebAudioSafeMediaSource: same-origin, blob:, data:),
with reactive volume/mute propagation on the direct path. EQ remains
graph-only and is skipped on the direct path.
Host runtime hardening: reset the persisted playback mute/volume on
mount (the monitor volume UI is hidden in host mode, so a persisted
mute silently zeroed embedded audio), and keep resilient
pointerdown/keydown listeners for the whole host session that resume
the shared preview AudioContext when it starts suspended.
* chore(release): freecut-editor-surface 0.3.2
Version bump so the 0.3.2 npmjs publish is reproducible from a real
repo commit (provenance gate). Content delta vs 0.3.1 is PR #13:
host bridge round-trip stability, host-mode timeline shortcuts, and
the host-mode cross-origin audio fix.
* chore(release): document and script the manual npmjs release path
The package manifest keeps publishConfig pointed at GitHub Packages (the
CI tag/dispatch target, enforced by package-editor-surface.mjs), but
CodePress consumes @quantfive/freecut-editor-surface from npmjs and the
repo has no NPM_TOKEN secret, so npmjs releases are a manual maintainer
step. Add scripts/publish-editor-surface-npmjs.mjs (root script
publish:editor-surface:npmjs) that runs the provenance + deterministic
pack + fresh-consumer smoke preflight and then publishes the exact
tarball to https://registry.npmjs.org with --access=public; --dry-run
validates without publishing. Document both release targets in the
package README and refresh the provenance package.json checksums.
* chore(release): make public npmjs the canonical release target
Per maintainer direction the editor surface is a public package now.
publishConfig targets https://registry.npmjs.org with public access and
package-editor-surface.mjs enforces exactly that; the tag/dispatch
workflow publishes to npmjs with NODE_AUTH_TOKEN from the NPM_TOKEN
repo secret (a repo admin must add it before tag publishes work). The
manual maintainer path (publish:editor-surface:npmjs) stays as the
fallback and drops its registry/access overrides now that the manifest
is canonical. README release docs updated; GitHub Packages is no
longer a target.
* chore(release): guard npmjs publish to the merged staging revision
Reviewer finding: the manual publish script rebuilt and preflighted
without checking the worktree or release ref, so uncommitted source
could ship as the official public version. The script now requires an
explicit --ref <sha> (or --ref HEAD) and refuses before any build step
— in dry-run mode too — unless the tree is clean, HEAD equals --ref,
and --ref is an ancestor of origin/staging. Guard behavior is covered
by scripts/publish-editor-surface-npmjs.test.mjs (node --test, 7 cases:
clean/match/ancestor acceptance, dirty tree, HEAD mismatch,
non-staging ref, missing ref, unresolvable ref) wired as
test:publish-editor-surface-guards. README documents the --ref flow;
provenance checksums refreshed for the root manifest change.
Bring the host-backed editor work and QA tooling from `staging` onto
`codepress-main`, which becomes the single release branch for
@quantfive/freecut-editor-surface.
Conflict resolution:
- .github/workflows/publish-editor-surface.yml: keep `codepress-main`'s OIDC
trusted-publishing version (id-token: write, --provenance, the
already-published no-op guard, branch + tag triggers) as the base, fold in
staging's explicit --registry flag, and drop every NPM_TOKEN /
NODE_AUTH_TOKEN trace. The `if:` guard and its comment now name
`codepress-main` instead of `staging`.
- .github/workflows/sync-upstream.yml: no conflict — the file only ever
existed on `codepress-main`, so the merge keeps it.
- Everything else: take `staging`'s content (the newer fork work).
…s-main
`codepress-main` is now the release branch, so every hard-coded
`origin/staging` that meant "the release/base branch" moves with it.
Semantics are unchanged — only the ref.
- scripts/publish-editor-surface-npmjs.mjs: `STAGING_REF` -> `RELEASE_REF`
(`origin/codepress-main`); the guard messages and the CI-fallback comment
follow (CI now publishes via OIDC, not an NPM_TOKEN secret)
- scripts/publish-editor-surface-npmjs.test.mjs: fixture ref and test names
- scripts/qa-head-binding.mjs, scripts/check-fallow-changed-health.mjs:
`DEFAULT_BASE_REF`
- docs/qa/canonical-report.md, docs/qa/README.md, README.md,
docs/pr2-provenance-and-packaging.md: the gate set now binds to
`codepress-main`
- packages/freecut-editor/README.md: describe the OIDC branch/tag release
path and the repointed manual fallback; drop the NPM_TOKEN instructions
- .github/workflows/reproducible-package.yml, .coderabbit.yaml: base branches
- CLAUDE.md: record the fork's branch model (`codepress-main` releases,
`main` mirrors upstream)
@lightninglu10

lightninglu10 commented Aug 22, 2026

Copy link
Copy Markdown
Author

Canonical QA Report

Verifier revision binding

base: 7799d29fb67a98d5b147c650128fd2e20e69964a (origin/codepress-main)
head: e4daef3e1f3f4b01844c754528f6b10653f4156d
git rev-parse HEAD -> e4daef3e1f3f4b01844c754528f6b10653f4156d
git status --porcelain -> (empty)

Gate results

#GateResultEvidence
1Head binding✅ PASSqa:binding --check → clean tree, head descends from base
2Type check✅ PASSnpm run check → no warnings, lint errors, or type errors in 2445 files
3Lint✅ PASSnpm run lint → exit 0
4Unit tests❌ FAIL584 failed / 4278 passed (682 files) — inherited, see below
5Build✅ PASSnpm run build → built in 6.38s
6Feature boundaries✅ PASS1675 files scanned, no direct cross-feature imports
7Deps contract boundaries✅ PASS161 deps files, 297 contract files
8Legacy lib imports✅ PASSno unauthorized @/lib/* imports
9Deps wrapper health✅ PASS46 pass-through wrappers, 0 unused
10Unused exports❌ FAIL129 findings, 119 allowlisted, 10 new, 3 stale — inherited, see below
11Unused class members❌ FAIL83 findings, 83 allowlisted, 0 new, 2 stale — inherited, see below
12Changed-health✅ PASS49 changed files, base origin/codepress-main; introduced dead_code=0, complexity=0, duplication=0
13Edge budgets✅ PASSall edges within budget
14Provenance/reproducibility✅ PASSverify:provenance → license/notices, dependency inventory (51 runtime, 16 dev), asset inventory (5 roots) verified
15Editor-surface package build✅ PASSpackage:editor-surfacefreecut-editor-surface-0.3.2.tgz, sha256 72516a0f7c0c77150f52bcf0d8ac8ed6c99b82fe4efe9ebc7022c2fe373713f6
16Installed consumer smoke✅ PASSinstalled @quantfive/freecut-editor-surface@0.3.2 into a fresh consumer, 1/1 test
17Headless contract tests (Node)✅ PASS43/43
18Browser QA✅ PASSsystem Chrome 151.0.7922.172, 4/4 (ready, renderFrame ok, width match, real pixels)
19Full headless browser suite✅ PASSrender/edit/frame/layout contracts + 19/19 edit operations + lifecycle HTTP/CLI
20Redaction✅ PASS7 files scanned, 0 findings; 6/6 fail-closed self-tests

Additional gates for this change:

GateResultEvidence
Publish guard tests (repointed)✅ PASStest:publish-editor-surface-guards → 7/7 against origin/codepress-main
actionlint (all 4 workflows)✅ PASSexit 0
node --check on the 4 changed .mjs✅ PASSall parse
format:check❌ FAIL169 files — inherited, see below

Inherited baseline failures

  • Unused exports: FAIL at base 7799d29f with the identical counts
    (129 findings, 119 allowlisted, 10 new, 3 stale) — reproduced at the base
    SHA in a detached worktree. Not caused by this PR; allowlist untouched
    (ratchet baseline).
  • Unused class members: FAIL at base 7799d29f with the identical
    counts (83 findings, 0 new, 2 stale) — reproduced at the base SHA. Same
    rule.
  • format:check: FAIL with 169 files at the merge commit e4ca524e,
    before the repoint commit — identical count. None of the files this PR
    touches appear in the list.
  • Unit tests: the known full-suite jsdom/localStorage baseline
    (TypeError: Cannot read properties of undefined (reading 'setItem') from
    zustand persist, which aborts whole test files as an uncaught exception).
    Reproduced at both parents: base 7799d29f → 469 failed / 4057 passed;
    origin/staging47e2db3c → 469 failed / 4080 passed; this head → 584
    failed / 4278 passed. The totals move run to run because the uncaught
    exceptions abort test files at different points, so the number of tests
    that get to report varies. This diff cannot affect it: git diff origin/staging HEAD is 14 files, none under src/, headless/,
    packages/freecut-editor/src/, package.json, package-lock.json, or
    provenance/ — the merged tree is byte-identical to origin/staging
    everywhere the suite reads.

Environment blockers

  • None. A real browser session was available (system Chrome 151), so gates
    18–19 produced real evidence.

Visual / browser artifacts

Correction (2026-08-22, post-judge): the original version of this section
cited artifacts/qa/browser-e4daef3e1f3f/manifest.json as if it were
browsable evidence. It is not — artifacts/qa/ is gitignored and local, and
the PNG bytes were never uploaded anywhere. Per docs/qa/README.md, an
artifact must be referenced by repo-relative path or uploaded to a durable
URL before being cited; the durable record is therefore the manifest inlined
below, whose sha256 digests bind the images to this head. The image bytes
themselves are reproducible by rerunning the gate, not independently
browsable. No behavioral rerun was required and none was performed — gate 18
still passed 4/4 against real system Chrome 151.

Generated by npm run qa:browser -- --skip-build at head e4daef3e
(repo-relative output dir artifacts/qa/browser-e4daef3e1f3f/):

{
"schema": "freecut-qa-browser/v1",
"head": "e4daef3e1f3f4b01844c754528f6b10653f4156d",
"browser": {
"label": "system Chrome (channel: chrome)",
"version": "151.0.7922.172"
},
"generatedAt": "2026-08-22T18:50:38.355Z",
"artifacts": {
"frame.png": {
"bytes": 15682,
"sha256": "8206275c7f9794b6f22fb726923957fbde05fbb422c0cded71300306eb872cd9"
},
"harness.png": {
"bytes": 7535,
"sha256": "2360d2cc7439d7cb3ad958691f0d9ba7510d6c2ed3779538ff45d797aa15538b"
},
"console.log": {
"bytes": 1,
"sha256": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b"
}
},
"result": "PASS"
}

console.log is 1 byte (a bare newline) — the browser run produced no
console output at all
, which is the recorded evidence for that gate rather
than an omission. To reproduce and compare digests:

git checkout e4daef3e1f3f4b01844c754528f6b10653f4156d
npm ci --ignore-scripts && npm run build
npm run qa:browser -- --skip-build
shasum -a 256 artifacts/qa/browser-e4daef3e1f3f/*.png

Overall

❌ FAIL — NOT READY TO MERGE on gates 4, 10, 11 and format:check, all four
disclosed as inherited baseline failures reproduced at base 7799d29f
. Every
gate this change could affect passes. Judge's call on whether the inherited
baseline blocks readiness.

No merge until trusted judge PASS.

@lightninglu10

Copy link
Copy Markdown
Author

@codepress /judge-verification can you judge this verification?

@codepress-dev

Copy link
Copy Markdown

👋 Hey @lightninglu10! Spawning a verification judge session to help with your request. View session

@codepress-dev

Copy link
Copy Markdown

@Terminal@lightninglu10

Dispatched by judge-verification.

This judgment is READY TO MERGE at the current head. If the PR is still a draft, transition it to ready for review now with the guarded readiness transaction: codepress-policy ready-for-review --repo . --pr 16 (or node packages/delivery-policy/dist/cli.js ready-for-review --repo . --pr 16 when the CLI is not on PATH). It re-validates current-head QA and judge evidence, reconciles the delivery-status marker, and marks the PR ready so the native reviewer can dispatch. Do not call gh pr ready directly, and do not merge; merge authorization still requires the reviewer gate.

Verification Judgment — PR #16 (local)

Verdict: ✅ READY TO MERGE

PR Head SHA:e4daef3e1f3f4b01844c754528f6b10653f4156d

Summary: The canonical QA report is bound to the live PR head and provides clean-tree capture. The material release, host-editor, media, package, and QA surfaces in the diff have credible coverage. The four reported failures are reproduced inherited baselines, not regressions from this diff, so they are waived for this judgment.

Revision binding

  • Classification: SAME-SHA LATE BINDING
  • Report head:e4daef3e1f3f4b01844c754528f6b10653f4156d
  • Live PR head:e4daef3e1f3f4b01844c754528f6b10653f4156d
  • Audited checkout: clean detached checkout at e4daef3e1f3f4b01844c754528f6b10653f4156d
  • Delta classification: not applicable (same SHA)
  • Concrete evidence: Canonical report comment 5382036703 captured git rev-parse HEAD -> e4daef3; git status --porcelain -> (empty). The judge checkout returned the same full head and an empty git status --porcelain result.
  • Rows carried forward: none
  • Rows reverified at live head: none
  • Rows still requiring verification: none
  • Publication timing: GitHub's timeline lists the e4daef3 commit before the canonical report comment at 2026-08-22T18:52:26Z. The later judge request did not change the head; live PR metadata still reports the same SHA. Timing is not used as verifier checkout provenance.

Diff trigger inventory

SurfaceLocationCoverage
Release-branch OIDC publication and manual release guard.github/workflows/publish-editor-surface.yml:7-100; scripts/publish-editor-surface-npmjs.mjs:46-1341
Host-backed editor mounting, authoritative round trips, and bounded editssrc/features/editor/components/editor.tsx:433-758; src/features/editor/host/controller.ts:229-...; src/features/editor/host/runtime.ts:85-...2
Host-mode timeline shortcut boundarysrc/features/timeline/hooks/use-timeline-shortcuts.ts:46-66; src/features/timeline/hooks/shortcuts/use-delete-shortcuts.ts:1-...; src/features/timeline/hooks/shortcuts/use-ui-shortcuts.ts:1-...3
Cross-origin audio routing and host-mounted keyframe persistencesrc/runtime/composition-runtime/components/video-audio-context.ts:61-99; src/runtime/composition-runtime/components/pitch-corrected-audio.tsx:222-302; src/features/preview/utils/decoder-prewarm.ts:229-2434
Published package, provenance, and installed consumer contractpackages/freecut-editor/package.json:1-...; scripts/package-editor-surface.mjs:88-...; provenance/freecut-baseline.json5
Quality-gate results and inherited baseline findingspackage.json:scripts; docs/qa/README.md:1-97; canonical QA report comment 53820367036, 7, 8, 9
Exact-head binding, browser exercise, and QA redactionscripts/qa-head-binding.mjs:1-84; scripts/qa-browser-check.mjs:1-254; scripts/qa-redaction-check.mjs:1-13410, 11

Per-item

#Verifier saidJudgmentEvidence
1PASS✅ PASSThe diff binds publication to codepress-main and release tags, retains id-token: write, publishes with the npmjs registry and provenance, and preserves the already-published no-op guard. The report records actionlint PASS, node --check PASS, and repointed publish-guard tests 7/7.
2PASS✅ PASSThe report records the installed consumer smoke as 1/1 and the full headless browser contract as PASS. The live diff and its controller/runtime tests cover host snapshot loading, authoritative replacement, supported edit batches, conflict handling, idempotent replay, and fail-closed unsupported edits.
3PASS✅ PASSThe host entrypoint mounts the host-safe shortcut slice and disables local undo/redo, clipboard, markers, and unsupported mutations. The added shortcut contract covers playback, deletion, and the explicit no-undo host boundary; the report's type, lint, boundary, and headless gates pass.
4PASS✅ PASSCross-origin media takes the direct element-volume path while same-origin, blob, and data sources retain the Web Audio path; keyframe extraction remains in-session without a workspace and persists when one exists. The diff includes targeted regression cases, and the report records the full headless and real-browser gates as PASS.
5PASS✅ PASSThe package is versioned 0.3.2, the npmjs public target is asserted, provenance inventories verify, the deterministic editor artifact packs with the reported SHA, and a fresh consumer installs and tests it 1/1. Typecheck, lint, boundary, changed-health, edge-budget, and provenance gates are reported PASS.
6FAIL✅ WAIVEDThe 584/4278 full-suite result is the documented jsdom/localStorage baseline: the same failure mode was reproduced at base 7799d29f and at origin/staging, with run-to-run totals varying because uncaught exceptions abort files. The change-sensitive host, package, headless, and browser evidence remains passing.
7FAIL✅ WAIVEDThe unused-export gate's 129 findings, including 10 new and 3 stale relative to its ratchet, were reported with identical counts at base 7799d29f; no allowlist change is present in the diff.
8FAIL✅ WAIVEDThe unused-class-member gate's 83 findings and 2 stale findings were reported as reproduced at base 7799d29f, with zero new findings attributable to this head.
9FAIL✅ WAIVEDformat:check reports the same 169-file baseline at the merge commit before the ref-repoint, and the report states none of the PR-touched files are in that list.
10PASS✅ PASSThe report's exact-head binding gate captured the live SHA and an empty status result; QA redaction scanned 7 files with 0 findings and all 6 fail-closed self-tests passed.
11PASS✅ PASS (FORM CAVEAT)The report records a real system Chrome 151 session and Browser QA 4/4, including renderFrame success, width match, and real pixels. The cited artifacts/qa/browser-e4daef3e1f3f/manifest.json is not a durable HTTPS artifact, so the visual evidence is not independently browsable; this is a documentation/publication caveat, not a behavior failure.

Overall status check

  • Verifier said: FAIL
  • Result: READY TO MERGE

What stood up

  • The report and the live PR head are the same full SHA, with explicit verifier rev-parse and empty-status capture.
  • The release/ref changes are covered by actionlint, guard tests, deterministic packaging, provenance verification, and an installed consumer smoke.
  • The host-editor and media edge cases have corresponding contract tests plus package/headless/browser evidence.
  • The only adverse rows are reproduced baseline failures; no changed-path regression remains after judging them.

@lightninglu10

Copy link
Copy Markdown
Author

Report correction (form-only, per judge caveat on item 11).

The judge's PASS carried one form caveat: the canonical QA report cited artifacts/qa/browser-e4daef3e1f3f/manifest.json as visual evidence, but that path is gitignored and local — not a durable, independently browsable artifact, so the browser evidence could not be checked without rerunning the gate.

I have corrected the Visual / browser artifacts section of the canonical report comment above (edited in place, with the correction called out inline so the change is not silent). The correction:

  • inlines the full manifest.json — including the sha256 digests for frame.png (15682 B), harness.png (7535 B), and console.log — so the durable record now lives in the PR itself rather than behind a local path;
  • records that console.log is 1 byte (a bare newline), i.e. the run produced no console output at all — evidence, not an omission;
  • states plainly that the PNG bytes were never uploaded anywhere and are reproducible-by-rerun rather than browsable. I have not claimed otherwise, and GitHub's comment API has no path to attach image assets.
  • adds the exact reproduce-and-compare-digests command.

No behavioral rerun was performed and none was required. Gate 18 result is unchanged: PASS 4/4 against real system Chrome 151.0.7922.172 at head e4daef3e. No commits were added; the head is still e4daef3e1f3f4b01844c754528f6b10653f4156d.

Proceeding to the guarded readiness transaction.

@lightninglu10

lightninglu10 commented Aug 22, 2026

Copy link
Copy Markdown
Author

@codepress /judge-verification can you judge this verification?

Local Verification

PR Head SHA:e4daef3e1f3f4b01844c754528f6b10653f4156d

Why this report exists. My first report used FreeCut's own
docs/qa/canonical-report.md format, which the delivery-policy readiness
gate does not recognise as canonical verification evidence — so
ready-for-review refused with "newest current-head QA evidence is neither
PASS nor a valid exact-head waiver"
. This is the form-only correction the
judge asked for. No behavioral rerun was performed and none was required;
every result below is the same evidence captured at this same head, and no
commit was added (head is still e4daef3e).

This verdict is PASS post-judge-waiver, not "all gates green." Four gates
fail. All four are inherited baselines reproduced at base 7799d29f, and the
trusted judge explicitly waived them (rows 6–9 of its judgment,
comment 5382193527). They remain disclosed in full below.

Verifier revision binding

  • git rev-parse HEAD -> e4daef3e1f3f4b01844c754528f6b10653f4156d
  • git status --porcelain -> (empty)

Captured from npm run qa:binding -- --check: "OK: clean tree, head descends
from base"; base 7799d29fb67a98d5b147c650128fd2e20e69964a
(origin/codepress-main). The head is unchanged from the judged head — no
commit was made for this rerun
, and every row below was captured at this
same SHA.

Diff Trigger Inventory

SurfaceLocationContract
Release-branch OIDC publication.github/workflows/publish-editor-surface.ymlPublishes only from codepress-main + release tags; id-token: write retained; no NPM_TOKEN/NODE_AUTH_TOKEN; already-published no-op guard intact
Manual release guard repointscripts/publish-editor-surface-npmjs.mjs, .test.mjsRELEASE_REF = origin/codepress-main; clean-tree + HEAD-match + ancestor guards unchanged in behavior
QA base-ref repointscripts/qa-head-binding.mjs, scripts/check-fallow-changed-health.mjsDEFAULT_BASE_REF resolves to origin/codepress-main; both gates run green against the new base
Reproducible-package + review base branches.github/workflows/reproducible-package.yml, .coderabbit.yamlBase-branch lists name the release branch
Release documentationpackages/freecut-editor/README.md, docs/qa/*, README.md, docs/pr2-provenance-and-packaging.md, CLAUDE.mdDescribe the OIDC path; no NPM_TOKEN instructions survive
Merged host-backed editor surfacesrc/features/editor/host/*, src/features/editor/components/editor.tsx, timeline shortcut slice, media/audio routingByte-identical to origin/staging; covered by that branch's contract tests
Published package + provenancepackages/freecut-editor/package.json, provenance/*, scripts/package-editor-surface.mjs0.3.2 packs deterministically and installs in a fresh consumer

Verification Contract Results

#AssertionResultEvidence
1Exact-head binding, clean treePASSqa:binding --check → base 7799d29f (origin/codepress-main), head e4daef3e, git status --porcelain empty
2TypecheckPASSnpm run check → 0 errors across 2445 files
3LintPASSnpm run lint → exit 0
4BuildPASSnpm run build
5Workflow syntaxPASSactionlint exit 0 (all 4 workflows); node --check on all 4 changed .mjs
6Repointed publish guardsPASStest:publish-editor-surface-guards → 7/7 against origin/codepress-main
7ProvenancePASSverify:provenance → license/notices, 51 runtime + 16 dev deps, 5 asset roots
8Deterministic packagePASSpackage:editor-surface → 0.3.2, sha256 72516a0f…3713f6
9Installed consumer smokePASSfresh consumer installs 0.3.2, 1/1
10Changed-health vs new basePASS49 changed files, base origin/codepress-main; introduced dead_code=0, complexity=0, duplication=0
11Architecture gatesPASSboundaries (1675 files), deps-contracts (161/297), legacy-lib-imports, deps-wrapper-health (46/0), edge-budgets
12Headless contracts (Node)PASS43/43
13Headless browser suitePASSrender/edit/frame/layout + 19/19 edit ops + lifecycle HTTP/CLI
14Browser QAPASSreal system Chrome 151.0.7922.172, 4/4; manifest + digests inlined in comment 5382036703
15QA redactionPASS7 files scanned, 0 findings; 6/6 fail-closed self-tests
16PR CI at headPASSQuality Checks, Preview Sync Stress, Verify and package baseline — all green
17Full unit suiteWAIVED — inherited baselinejsdom/localStorage zustand-persist crash. Base 7799d29f: 469 failed. origin/staging: 469 failed. This head: 584 failed. Diff vs origin/staging is 14 files, none under src/, headless/, packages/freecut-editor/src/, package.json, package-lock.json, provenance/ — the tree is byte-identical everywhere the suite reads
18Unused exports ratchetWAIVED — inherited baseline129 findings / 10 new / 3 stale — identical counts reproduced at base 7799d29f; allowlist untouched
19Unused class members ratchetWAIVED — inherited baseline83 findings / 0 new / 2 stale — identical counts reproduced at base 7799d29f; allowlist untouched
20Format checkWAIVED — inherited baseline169 files, identical count at merge commit e4ca524e; none of the files this PR touches appear in the list

Rows 17–20 are the four disclosed failures. They are recorded as failures in
FreeCut's own report (comment 5382036703) per docs/qa/README.md's
"baseline failures are disclosed, never hidden" rule, were each reproduced at
the base SHA in a detached worktree, and were adjudicated as waived by the
trusted judge at this exact head. No allowlist, skip list, or config was
edited to make any of them disappear.

Overall: PASS

@lightninglu10
lightninglu10 marked this pull request as ready for review August 22, 2026 20:18
@codepress-reviewer-dev

Copy link
Copy Markdown

Starting initial review of e4daef3e from baseline 7799d29f... 👀

View automation run

@codepress-reviewer-devcodepress-reviewer-devBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The release-branch consolidation is coherent: the workflow remains OIDC-based, the package checks and consumer smoke test stay in front of publication, and the manual fallback verifies both a clean checkout and ancestry to codepress-main. The host bridge also remains the authority for supported document mutations, so this does not need an architectural split.

One nonblocking concern:

  • src/features/timeline/hooks/use-timeline-shortcuts.ts:64 — Host mode mounts the full tool-shortcut hook, including R for rate stretch. That operation changes speed and may ripple adjacent clips, neither of which the host edit derivation supports. A host user can therefore enter the tool and make an edit that is immediately rolled back as unsupported. Limit host mode to tool bindings backed by the host command contract and cover R with a host-mode shortcut test.

Approving because this is a bounded, recoverable host-mode interaction rather than a release or data-integrity failure.

Reviewed `7799d29f`...`e4daef3e`. Diff collection and GitHub posting were handled by the automation.

View automation run

@codepress-reviewer-dev

Copy link
Copy Markdown

Review head e4daef3e1f3f4b01844c754528f6b10653f4156d; round 1; 49 reviewed file(s), 0 pending/skipped file(s). 1 subsystem record(s) retained; 0 omitted.

View automation run

@lightninglu10
lightninglu10 merged commit 6de1f74 into codepress-mainAug 22, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@lightninglu10