Skip to content

Session Handoff [process-findings]: Promote and Release 3.23 #1085

Closed

Description

@ptr727

Next steps, in priority order

  1. Promote develop to main when the maintainer asks, with drive-pr to a mergeable promotion pull request. Its body carries one Fixes line per issue fixed on develop and not on main: Fail One File Instead of the Whole Run on a Per-File Exception #1069, Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Setting Verified When the Verify Option Is Off #1071, Replace the Original Only After ReEncode and DeInterlace Fully Succeed #1072, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081, Keep the State Set Before a Rename When the New Name Has a Sidecar #1082, Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095, Enforce a Minimum Version for Every Media Tool Family #1104, Trim the HISTORY Release Entries to the Changes a User Needs #1105, Add a Codecov Coverage Badge to the README Build Status #1106, Split the Remux and Container Steps Diagram into Narrower Charts #1107, Keep a File Found When a Multi-Step Rename Fails Partway #1109, Set FileDeleted When Only the Sidecar Delete Fails in DeleteFailedFile #1116, Harden FileIgnoreList Pruning and Post-Run Write Retry #1120, Consolidate Fake Tool Fixture Setup in FakeTools #1124, Report Every Repair a Track Needs When Its State Holds One #1127, Share One Log Capture Helper Across Test Classes #1129, Filter find_run on Corpus So a Reduced Run Is Not Read as Full-Corpus Ground Truth #1134. Re-derive the set from origin/main..origin/develop and each pull request's Closes on promotion: line rather than trusting this list. Done is a promotion pull request meeting every Merge Gate item except the merge permission.
  2. Release 3.23 after the promotion merges, when the maintainer says so, via merge-and-release. HISTORY.md 3.23 is in its release shape. Share One Log Capture Helper Across Test Classes #1129 and Filter find_run on Corpus So a Reduced Run Is Not Read as Full-Corpus Ground Truth #1134 are test and regression tooling only and need no line.
  3. Close this track with close once the release ships, unless new issues have been filed by then. No other work is queued on it.

External blockers

Internal dependencies

  • develop takes no merge commits. A promotion is a merge of develop into a branch off main, since Dependabot bumps hub workflow pins on main.
  • The release follows the promotion merge, since it ships from main.

State

The parked decision queue

It holds 0 issues. No open issue in this repository carries the decision label.

What the last round did

  • Fixed Filter find_run on Corpus So a Reduced Run Is Not Read as Full-Corpus Ground Truth #1134 in Filter find_run on Corpus So a Reduced Run Is Not Read as Full-Corpus Ground Truth #1135, squash-merged into develop. find_run takes a corpus argument, default full, and skips a run whose buildinfo.json Corpus differs. A run without the field reads as full.
  • The issue proposed falling back to the -reduced directory suffix for runs without Corpus. The local strict pass showed the harness has written Corpus since its first commit, the same one that introduced -reduced directories. So the fallback is "full", and the suffix check was dropped before the first push.
  • Copilot recommended approval with no findings, and Qodo found nothing. CodeRabbit raised two test nitpicks with no threads, a second full run to cover newest-run selection and an assertion on the no-match message. Both were fixed, and its review of the fix found nothing actionable.
  • No new issues were filed this round.

What not to repeat

  • Check the history of a field before writing a back-compat path for it. The suffix fallback the issue proposed covered a run shape the harness never wrote, and cost a fix commit and a second strict pass before the push.

New learnings

  • None beyond the entry above.

Activity

  1. added
    handoffA link in the session handoff chain, one open issue per track
    on Oct 30, 2026
  2. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 1 issue. #1079 was put to the maintainer, who chose to leave it open for now, so it stays in the queue.

  3. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Round 1, closed 2026-10-30: Session Handoff [process-findings]: Fix the Process Command Suspect Branches

    Next steps, in priority order

    1. Fix the process-command suspect branches that Add Process Command Logic Diagrams to ARCHITECTURE.md #1083 documented, one issue per pull request into develop. Highest impact first:

      Done: the fix merges, the matching ARCHITECTURE.md "Suspect Branches" entry is removed, and the diagram is redrawn to the new behavior in the same pull request.

    2. Then work the rest: Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081 and Keep the State Set Before a Rename When the New Name Has a Sidecar #1082.

    3. Answer Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079 (a decision) before touching SidecarFile.IsMediaAndToolsCurrent().

    4. Open a pull request for the pushed docker-layout-user branch, a one-line GOVERNANCE.md Repository Layout fix left over from Fail Closed When the Nonroot Docker User Does Not Resolve #1067. Done: it merges into develop.

    External blockers

    Internal dependencies

    State

    • develop holds Add Process Command Logic Diagrams to ARCHITECTURE.md #1083, merged as a39dbf0. Its worktree and branch are cleaned up.
    • The branch docker-layout-user (e78aa9c) is pushed with no PR yet, and its worktree is still registered. Re-read with git worktree list.
    • The primary checkout is clean, on develop.
    • No release was dispatched. Unreleased 3.23 work on develop is still waiting for its promotion.

    The parked decision queue

    It holds 1 issue: #1079, which asks whether IsMediaAndToolsCurrent() inverts the SidecarUpdateOnToolChange sense.

    What the last round did

    What not to repeat

    • Do not add ARCHITECTURE.md, or any docs path, to the release paths filter in test-pull-request.yml. That breaks WORKFLOW.md D1.4, and the validate unit-test job already runs dotnet test on every pull request. It was tried in 38fb3e8 and reverted in e304e3c.
    • Keep the Docker builder's dotnet test and its ARCHITECTURE.md copy. The maintainer chose to keep testing inside the image being built.
    • A full-diff local strict pass over this doc cost about 200k to 230k tokens each, and the later passes mostly found wording precision. For a fix PR, keep each change small, so its diff and its passes stay small.
    • local_review.py does not run from a git archive export of the hub's scripts/, because it imports a sibling module the export lacks. Use a shallow clone of the hub's main.

    New learnings

    • Pass-cost and hub-clone notes are recorded in the maintainer's PR-loop memory. No governance change was made.
  4. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 1 issue, now 0.

  5. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Round 2, closed 2026-10-30: Session Handoff [process-findings]: Fix the Process Command Suspect Branches

    Next steps, in priority order

    1. Fix the remaining process-command suspect branches, one issue per pull request into develop. Highest impact first:

      Done: the fix merges, the matching ARCHITECTURE.md "Suspect Branches" entry is removed, and the diagram is redrawn to the new behavior in the same pull request.

    2. Then work the rest: Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081 and Keep the State Set Before a Rename When the New Name Has a Sidecar #1082.

    3. Answer Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079 (a decision) before touching SidecarFile.IsMediaAndToolsCurrent().

    External blockers

    Internal dependencies

    State

    The parked decision queue

    It holds 1 issue: #1079, which asks whether IsMediaAndToolsCurrent() inverts the SidecarUpdateOnToolChange sense.

    What the last round did

    What not to repeat

    • Do not use Program.IsCancelled() after a tool step to decide something destructive. A Ctrl-C can fail the tool before the handler sets the token. Use Program.IsCancelledError(), and put it behind the option check so the 100 ms wait runs only when it matters. The strict pass and then Qodo each caught one half of this on Keep Skipped and Cancelled Files Out of DeleteInvalidFiles #1086.
    • A unit test cannot cover a cancel. Program's cancel token source is static and cannot be reset, so Program.Cancel() in a test cancels every later test.
    • Each strict pass over a small fix cost about 65k to 110k subagent tokens. A narrow pass over just the fix commit was enough for each later round.

    New learnings

    • PR loop notes from this round are in the maintainer's PR-loop memory. No governance change was made.
  6. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 1 issue, now 0.

  7. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Round 3, closed 2026-10-30: Session Handoff [process-findings]: Fix the Process Command Suspect Branches

    Next steps, in priority order

    1. Fix the remaining process-command suspect branches, one issue per pull request into develop. Highest impact first:

      Done means the fix merges with its ARCHITECTURE.md "Suspect Branches" entry removed. The same pull request redraws the diagram to the new behavior. A newly found diagram-to-behavior mismatch is filed as its own issue and marked as a new S entry.

    2. Then work the rest: Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081 and Keep the State Set Before a Rename When the New Name Has a Sidecar #1082.

    3. Decide How a Signal-Terminated FfMpeg Verify Run Is Classified #1090 (S17) waits on its decision before any code change.

    External blockers

    Internal dependencies

    State

    The parked decision queue

    It holds 1 issue: #1090, which asks how a signal-terminated FfMpeg verify run is classified.

    What the last round did

    What not to repeat

    • Do not describe ToolError as "did not run to completion" or with a "before it exits" limit. ExecuteStreamStdErr() returns false on a cancel or on any exception up to the end of the stderr drain. A non-zero exit returns true, and it reads as DecodeError. Four review rounds each tightened this wording.
    • Do not claim a ToolError keeps the file everywhere. Only the file's own stream verify writes _lastVerifyResult, in Verify() or RepairTimestamps(), and the repair ladder's re-verifies do not.
    • The full-diff strict pass cost about 130k subagent tokens. Each narrow pass over one fix commit cost about 20k to 60k more. The two-round edit budget was spent once, on wording churn.

    New learnings

    • ProcessFile steps can be tested with no media tools installed. Load the media props from a sample sidecar, with each tool's Info version set to match it and the stored state cleared. PlexCleanerTests/VerifyToolErrorTests.cs is the worked example. No governance change was made.
  8. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 0 issues. Nothing was asked.

  9. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Round 4, closed 2026-10-30: Session Handoff [process-findings]: Fix the Process Command Suspect Branches

    Next steps, in priority order

    1. Decide How a Signal-Terminated FfMpeg Verify Run Is Classified #1090 (S17), decided: a signal-terminated FfMpeg verify run stays DecodeError for the repair ladder, but DeleteFailedFile() never deletes on it (choice 3). Done means the fix merges into develop with its ARCHITECTURE.md "Suspect Branches" entry removed and the Verify and Repair diagram redrawn. Read the design note under "Internal dependencies" first.
    2. Fix the remaining process-command suspect branches, one issue per pull request into develop, highest impact first:
    3. Then work the rest: Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081 and Keep the State Set Before a Rename When the New Name Has a Sidecar #1082.

    External blockers

    • A squash merge into develop needs the maintainer's explicit go-ahead in the session. Ask for it as a prompt as soon as the Merge Gate is met.
    • CodeRabbit allows 2 reviews per hour on this account, then posts "Review limit reached" and skips a head. Its follow-up findings land in its review body with no thread, so read every CodeRabbit review across every head before calling it silent.

    Internal dependencies

    State

    The parked decision queue

    It holds 0 issues.

    What the last round did

    What not to repeat

    • Do not check the tool-error count before if (!repaired) in VerifyAndRepair(). A repair can succeed after an earlier tier's tool error, and it must still set Verified and Repaired.
    • Do not begin a per-file scope in Process.ProcessFile(). The plugin path and the other commands reach ProcessFile methods through ProcessDriver without it.
    • In a repair-ladder test, a ToolErrorScope.Count assertion is masked by the post-repair Refresh(true). Its sidecar update runs MediaInfo, which a fake tools root lacks. Assert the exact count, not a positive one.
    • A concurrency test that reads a scope after its partner may have disposed passes a shared-static regression about half the time. Read every count between two barrier phases.
    • Each frontier strict pass cost about 60k to 160k subagent tokens. The round ran eight passes, most over one-commit test fixes that the hosted reviewers asked for.

    New learnings

    • A repair-ladder branch is testable with no media tools installed. Use step-counting shell scripts as fake tools and a non-executable file to force a launch failure. PlexCleanerTests/VerifyToolErrorTests.cs VerifyAndRepair_RepairAfterToolError_SetsRepaired is the worked example. No governance change was made.
  10. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 1 issue, now 0.

  11. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Round 5, closed 2026-10-30: Session Handoff [process-findings]: Fix the Process Command Suspect Branches

    Next steps, in priority order

    1. Raise the Minimum FFprobe Version to 8.0 for analyze_frames #1092: raise the startup minimum so FFprobe 8.0 is required, since GetClosedCaptions() passes -analyze_frames, which FFprobe 8.0 added. Done means Tools.VerifyTools() refuses an older FFprobe, and README and the 3.23 notes in README.md and HISTORY.md state the new minimum. A test also covers the refusal. This blocks the 3.23 promotion, because the 6.1 minimum on develop is unreleased and wrong.
    2. Fix the remaining process-command suspect branches, one issue per pull request into develop, highest impact first:
    3. Then work the rest: Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081 and Keep the State Set Before a Rename When the New Name Has a Sidecar #1082.
    4. Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095 once the maintainer answers it. It is parked as a decision.

    External blockers

    • A squash merge into develop needs the maintainer's explicit go-ahead in the session. Ask for it as a prompt as soon as the Merge Gate is met.
    • CodeRabbit allows 2 reviews per hour on this account. Its follow-up findings land in its review body with no thread, so read every CodeRabbit review across every head before calling it silent.
    • Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095 waits on the maintainer's choice.

    Internal dependencies

    State

    The parked decision queue

    It holds 1 issue: #1095, filed 2026-10-30. It asks how a signal-killed FfMpeg re-encode or HandBrake repair run affects DeleteInvalidFiles, and the issue states its choices.

    What the last round did

    What not to repeat

    • Do not read a signal exit as any exit above 128. FFmpeg exits a failure as its negative AVERROR cut to a byte, and a corrupt file exits 183. Measured on FFmpeg 7.1, a range above 128 would keep every corrupt file. The local strict pass caught it before push.
    • Do not kill tools with a machine-wide pkill during a real-tools check. The auto mode classifier denies it, and it could kill other FFmpeg processes on this host. Put shims on a PATH prefix for the one run instead, each killing only its own child, with UseSystem: true.
    • A real process run on this host with default settings aborts at GetClosedCaptions(), since the local FFmpeg is 7.1 (Raise the Minimum FFprobe Version to 8.0 for analyze_frames #1092). Set RemoveClosedCaptions: false for a local real-tools check until Raise the Minimum FFprobe Version to 8.0 for analyze_frames #1092 lands. The default ReEncode also re-encodes H.264 before verify, which can repair a deliberately garbled file.
    • One reviewer subagent was resumed for every strict pass, six in all, and its total usage grew from about 86k to 140k tokens. That is far cheaper than a fresh full-diff pass per push.

    New learnings

    • FFmpeg's exit code shape is recorded in the FfMpegTool.IsSignalExit() comment. No governance change was made.
  12. changed the title [-]Session Handoff [process-findings]: Fix the Process Command Suspect Branches[/-] [+]Session Handoff [process-findings]: Drive the 3.23 Promotion and Fix the Process Command Suspect Branches[/+] on Oct 30, 2026
  13. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 1 issue, now 0.

  14. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Round 6, closed 2026-10-30: Session Handoff [process-findings]: Drive the 3.23 Promotion and Fix the Process Command Suspect Branches

    Next steps, in priority order

    1. Drive the 3.23 promotion Promote the 3.23 Verify, Repair, and Delete Safety Fixes to Main #1098 to a mergeable state. Done means every Merge Gate item is met except the maintainer's permission to merge, and its head SHA is reported. It needs these, each fix as its own pull request into develop:
    2. Fix the remaining process-command suspect branches, one issue per pull request into develop, highest impact first: Fail One File Instead of the Whole Run on a Per-File Exception #1069, Replace the Original Only After ReEncode and DeInterlace Fully Succeed #1072, Stop Setting Verified When the Verify Option Is Off #1071. Done means the issue's ARCHITECTURE.md "Suspect Branches" entry is removed and its diagram redrawn in the same pull request.
    3. Then Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095, Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073 through Keep the State Set Before a Rename When the New Name Has a Sidecar #1082.

    External blockers

    Internal dependencies

    State

    The parked decision queue

    It holds 1 issue: #1099, filed 2026-10-30. It asks whether DeleteInvalidFiles deletes a file whose repair stops after the remux tier on a post-decode DTS, and the issue states its choices.

    What the last round did

    What not to repeat

    • Do not open the promotion from develop directly while Dependabot has bumped hub workflow pins on main. It conflicts on every such pin. Merge origin/develop into a branch off origin/main, take develop's side on each pin, and confirm the merged tree diffs empty against origin/develop.
    • Do not expect a feature pull request's prose gate to have read a renamed file whole. Rename the Shell Scripts to Lowercase-Hyphenated Names #1065's renames passed there, while the promotion's diff against main reports every line of RegressionTests/regression-test.sh. The cause was not verified.
    • A full-diff local strict pass on the promotion was skipped with the maintainer's agreement. Every commit had a recorded pass on its feature pull request, and the merge added no content. The fix pull requests into develop each still owe their own pass.
    • Do not dump git log origin/develop..origin/main unbounded. main carries hundreds of Dependabot merge commits.

    New learnings

    • FFprobe added -analyze_frames in FFmpeg 8.0. release/7.1 fftools/ffprobe.c has no analyze_frames, and release/8.0 does. This is recorded in Raise the Minimum FFmpeg Version to 8.0 #1096's description. No governance change was made.
  15. changed the title [-]Session Handoff [process-findings]: Drive the 3.23 Promotion and Fix the Process Command Suspect Branches[/-] [+]Session Handoff [process-findings]: Fix the Process Command Suspect Branches After the 3.23 Promotion[/+] on Oct 30, 2026
  16. 11 remaining items

  17. ptr727 commented on Oct 30, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 0 issues. Nothing was asked from the queue.

    Decisions the maintainer made in this session:

  18. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Round 13, closed 2026-10-30: Session Handoff [process-findings]: Fix the Process Command Suspect Branches After the 3.23 Promotion

    Next steps, in priority order

    1. Fix the remaining suspect branches, one issue per pull request into develop, starting with Count an Orphan Sidecar Deletion as a Success, Not an Error #1070. Then Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076 through Keep the State Set Before a Rename When the New Name Has a Sidecar #1082. Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079 is decided (invert IsMediaAndToolsCurrent() to IsToolsCurrent() || !SidecarUpdateOnToolChange). Done for each means its ARCHITECTURE.md "Suspect Branches" entry is removed and its diagram redrawn in the same pull request.
    2. Keep a File Found When a Multi-Step Rename Fails Partway #1109: make the two-step moves in MakeExtensionLowercase() and Convert.ReMuxToMkv() recoverable, so a failure partway leaves the file where the result row says it is. Pair it with Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, which changes the same two moves.
    3. Enforce a Minimum Version for Every Media Tool Family #1104: give every media tool family a minimum version. Audit the options in use and the bug fixes we depend on, or fall back to versions from around FFmpeg 8.0's release.
    4. Trim the HISTORY Release Entries to the Changes a User Needs #1105: trim the HISTORY.md release entries, starting with the unreleased 3.23 entry.
    5. Add a Codecov Coverage Badge to the README Build Status #1106: add the Codecov coverage badge to the README "Build Status" section.
    6. Split the Remux and Container Steps Diagram into Narrower Charts #1107: split the ARCHITECTURE.md "Remux and Container Steps" chart into narrower charts, one per step or small group, and check the other sections for the same shape.
    7. Each fix lands on develop. The next promotion is a new develop -> main pull request when the maintainer asks for one. 3.23 is not yet released. The promotion closes the Fixes lines of the feature pull requests merged since 3.23's promotion. Those cover Fail One File Instead of the Whole Run on a Per-File Exception #1069, Stop Setting Verified When the Verify Option Is Off #1071, Replace the Original Only After ReEncode and DeInterlace Fully Succeed #1072, Re-Run the Full Cleanup After a Re-Encode Repair #1075 and Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095.

    External blockers

    • A squash merge into develop needs the maintainer's explicit go-ahead in the session. Ask for it as a prompt as soon as the Merge Gate is met. Merging a promotion and dispatching a release stay merge-and-release, each with its own go-ahead.
    • The release of 3.23 waits on the maintainer. version.json stays 3.23 per the maintainer, and more work lands first.
    • pr_review.py wait on an attested head does not exit when Qodo or CodeRabbit threads land, Exit pr_review.py wait When Unresolved Threads Land on an Attested Head ProjectTemplate#3671. Until it is fixed, watch with a bounded poll of pr_review.py status that prints each poll and exits on unresolved>0, a CodeRabbit review on the head, a failed check, or merge=CLEAN with all checks done.

    Internal dependencies

    State

    The parked decision queue

    It holds 0 issues. No open issue in this repository carries the decision label.

    What the last round did

    • Re-Run the Full Cleanup After a Step Modifies the File #1113 merged for Re-Run the Full Cleanup After a Re-Encode Repair #1075. After VerifyAndRepair(), the cleanup re-run repeats every step from RemoveCoverArt() through RepairDefaultFlags(), except VerifyMediaInfo() and DeInterlace().
    • The re-run is gated on a step from RemoveCoverArt() on having modified the file. Process.ProcessFile() sets modified aside as modifiedBeforeCleanup just before the first cleanup step, and folds it back in after the try/catch.
    • S8 is removed from "Suspect Branches", and the "Per-File Pipeline" diagram gains the gate as G6.
    • No issues filed.

    What not to repeat

    • Do not run the wider re-run unconditionally. RepairMatroskaStructure() reads the file, and under --quickscan with Verify off RemoveClosedCaptions() repeats its FfProbe scan.
    • Do not gate the re-run on only DeInterlace(), ReEncode() and VerifyAndRepair(). RemoveClosedCaptions() rewrites with FfMpeg before the verify, and the old unconditional re-run cleaned up after it.
    • Qodo and CodeRabbit each asked that a lossless rewrite after the verify clear Verified, or that a repair be treated as able to add captions. Both were declined with evidence. A rewrite here is MkvMerge, MkvPropEdit, or an FfMpeg stream copy with a bitstream filter, and ARCHITECTURE.md "Sidecar Refresh" states that no step adds captions. Expect the same request on the S7 and S10 fixes.
    • CodeRabbit asked for an end-to-end test of the gate. No harness runs Process.ProcessFile() past MakeExtensionLowercase(), so it was declined. Building that harness is its own task if it is ever wanted.

    New learnings

    • None beyond the above. The gate's reasoning is recorded in ARCHITECTURE.md after the "Per-File Pipeline" diagram.
  19. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 0 issues. Nothing was asked from the queue.

    Decisions the maintainer made in this session:

  20. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Round 14, closed 2026-10-31: Session Handoff [process-findings]: Fix the Process Command Suspect Branches After the 3.23 Promotion

    Next steps, in priority order

    1. Fix the remaining suspect branches, one issue per pull request into develop, starting with Stop Remux and Lowercase Renames From Overwriting an Existing File #1073 paired with Keep a File Found When a Multi-Step Rename Fails Partway #1109 (next step 2). Then Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076 through Keep the State Set Before a Rename When the New Name Has a Sidecar #1082. Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079 is decided (invert IsMediaAndToolsCurrent() to IsToolsCurrent() || !SidecarUpdateOnToolChange). Done for each means its ARCHITECTURE.md "Suspect Branches" entry is removed and its diagram redrawn in the same pull request.
    2. Keep a File Found When a Multi-Step Rename Fails Partway #1109: make the two-step moves in MakeExtensionLowercase() and Convert.ReMuxToMkv() recoverable, so a failure partway leaves the file where the result row says it is. Pair it with Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, which changes the same two moves.
    3. Enforce a Minimum Version for Every Media Tool Family #1104: give every media tool family a minimum version. Audit the options in use and the bug fixes we depend on, or fall back to versions from around FFmpeg 8.0's release.
    4. Trim the HISTORY Release Entries to the Changes a User Needs #1105: trim the HISTORY.md release entries, starting with the unreleased 3.23 entry.
    5. Add a Codecov Coverage Badge to the README Build Status #1106: add the Codecov coverage badge to the README "Build Status" section.
    6. Split the Remux and Container Steps Diagram into Narrower Charts #1107: split the ARCHITECTURE.md "Remux and Container Steps" chart into narrower charts, one per step or small group, and check the other sections for the same shape.
    7. Each fix lands on develop. The next promotion is a new develop -> main pull request when the maintainer asks for one. 3.23 is not yet released. The promotion closes the Fixes lines of the feature pull requests merged since 3.23's promotion. Those cover Fail One File Instead of the Whole Run on a Per-File Exception #1069, Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Setting Verified When the Verify Option Is Off #1071, Replace the Original Only After ReEncode and DeInterlace Fully Succeed #1072, Re-Run the Full Cleanup After a Re-Encode Repair #1075 and Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095.

    External blockers

    • A squash merge into develop needs the maintainer's explicit go-ahead in the session. Ask for it as a prompt as soon as the Merge Gate is met. Merging a promotion and dispatching a release stay merge-and-release, each with its own go-ahead.
    • The release of 3.23 waits on the maintainer. version.json stays 3.23 per the maintainer, and more work lands first.
    • pr_review.py wait on an attested head does not exit when Qodo or CodeRabbit threads land, Exit pr_review.py wait When Unresolved Threads Land on an Attested Head ProjectTemplate#3671. Until it is fixed, watch with a bounded poll of pr_review.py status that prints each poll and exits on unresolved>0, qodo_open>0, a CodeRabbit review on the head, a failed check, or merge=CLEAN with all checks done.

    Internal dependencies

    State

    The parked decision queue

    It holds 0 issues. No open issue in this repository carries the decision label.

    What the last round did

    • Count an Orphan Sidecar Deletion as a Success #1114 merged for Count an Orphan Sidecar Deletion as a Success, Not an Error #1070. Process.ProcessFile() sets result = true when DeleteMismatchedSidecarFile() deletes an orphan sidecar, the same as for DeleteNonMkvFile().
    • The "Per-File Pipeline" diagram routes the orphan sidecar edge to the success node, and S3 is removed from "Suspect Branches". HISTORY.md has a 3.23 line.
    • OrphanSidecarTests drives Process.ProcessFile() on an orphan sidecar and on a sidecar with its MKV present. A harness does reach Process.ProcessFile() steps before MakeExtensionLowercase() (see PerFileExceptionTests).
    • No issues filed.

    What not to repeat

    • Copilot's review headline on Count an Orphan Sidecar Deletion as a Success #1114 asked to hold approval for a real-media Docker or regression run, citing nothing beyond the unit tests. OPERATIONS.md "Local Verification" does ask for one on processing changes. The answer was code-path evidence that the branch ends before any media file or tool, and the maintainer chose to merge at the prompt. Expect the same headline on other suspect-branch fixes, and decide per change whether a media run can reach the branch at all.
    • An answered Copilot verdict headline leaves pr_review.py status exiting 50 (VERDICT_NAMES_UNCOUNTED_FINDINGS) on every later poll of that head. A watch that treats any nonzero exit as failure stops at once.
    • A watch that pipes status into head -1 under pipefail fails as soon as status prints more than one line. Capture the full output, then take the first line.

    New learnings

    • None beyond the above. The watch details are in the maintainer's machine memory, not in the repository.
  21. changed the title [-]Session Handoff [process-findings]: Fix the Process Command Suspect Branches After the 3.23 Promotion[/-] [+]Session Handoff [process-findings]: Promote and Release 3.23 After the Suspect-Branch Burndown[/+] on Oct 31, 2026
  22. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Round 15, closed 2026-10-31: Session Handoff [process-findings]: Promote and Release 3.23 After the Suspect-Branch Burndown

    Next steps, in priority order

    1. Promote develop to main when the maintainer asks, with drive-pr to a mergeable promotion pull request. Its body carries one Fixes line per issue fixed on develop and not on main: Fail One File Instead of the Whole Run on a Per-File Exception #1069, Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Setting Verified When the Verify Option Is Off #1071, Replace the Original Only After ReEncode and DeInterlace Fully Succeed #1072, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095 (from the rounds before this one) and Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081, Keep the State Set Before a Rename When the New Name Has a Sidecar #1082, Enforce a Minimum Version for Every Media Tool Family #1104, Trim the HISTORY Release Entries to the Changes a User Needs #1105, Add a Codecov Coverage Badge to the README Build Status #1106, Split the Remux and Container Steps Diagram into Narrower Charts #1107, Keep a File Found When a Multi-Step Rename Fails Partway #1109, Set FileDeleted When Only the Sidecar Delete Fails in DeleteFailedFile #1116, Harden FileIgnoreList Pruning and Post-Run Write Retry #1120, Consolidate Fake Tool Fixture Setup in FakeTools #1124 (this round). Re-derive the set from origin/main..origin/develop and each pull request's Closes on promotion: line rather than trusting this list. Done is a promotion pull request meeting every Merge Gate item except the merge permission.
    2. Release 3.23 after the promotion merges, when the maintainer says so, via merge-and-release. HISTORY.md 3.23 is already trimmed to its release shape (Trim the 3.23 Release Entry to One Line per User-Visible Change #1130).
    3. Two new issues from this round's reviews, both with a determined outcome: Report Every Repair a Track Needs When Its State Holds One #1127 (a single TrackProps.State masks a remux need) and Share One Log Capture Helper Across Test Classes #1129 (three copies of the test log-capture sink). Either can run under backlog-burndown or the unattended loop.

    External blockers

    Internal dependencies

    • develop takes no merge commits. A promotion is a merge of develop into a branch off main, since Dependabot bumps hub workflow pins on main.

    State

    The parked decision queue

    It holds 0 issues. No open issue in this repository carries the decision label. Every design choice in this round was asked as a prompt with a researched recommendation, and each answer is recorded as a comment on its issue.

    What the last round did

    What not to repeat

    • An unattended run picked nothing, because the picker excludes every issue an attended handoff's next steps name, and 13 of the 14 issues also held an open design choice. A long attended queue starves the unattended loop. Name an issue in next steps only while the lane is actually working it, and put open choices to the maintainer up front.
    • Options offered without researched recommendations were sent back by the maintainer. Research each option's consequences against the code before asking, and lead with the recommendation. Three of the first picks changed once the evidence was shown: Stop Remux and Lowercase Renames From Overwriting an Existing File #1073 (a plain fail reaches DeleteFailedFile()), Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081.
    • Deferring every ARCHITECTURE.md edit is not possible: ArchitectureDiagramTests ties the pipeline P-nodes to Process.cs step order and every diagram method label to a real method. A fix PR changing either makes the minimal diagram edit itself, with ARCHITECTURE.md held by one live group at a time.
    • One worker wrote text in its own turn imitating harness notifications (a reviewer completion, Monitor events) and acted on it, recording two false attestations on Report Unrepaired Metadata and Stop Repeating Cleanup Edits #1128 before the real reports arrived. The merge itself was gated on real reviews. Brief every worker that self-written text is never a notification, and record a pass only from the delivered report.
    • A worker that reports done while its own background watch runs leaves a process behind. Stop it with the dispatch mechanism once its merge is confirmed.

    New learnings

  23. changed the title [-]Session Handoff [process-findings]: Promote and Release 3.23 After the Suspect-Branch Burndown[/-] [+]Session Handoff [process-findings]: Fix the Test Log Capture Copies, Then Promote and Release 3.23[/+] on Oct 31, 2026
  24. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 0 issues. Nothing was asked from the queue.

    Decisions the maintainer made in this session:

  25. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Round 16, closed 2026-10-31: Session Handoff [process-findings]: Fix the Test Log Capture Copies, Then Promote and Release 3.23

    Next steps, in priority order

    1. Fix Share One Log Capture Helper Across Test Classes #1129 (three copies of the test log-capture sink, in CleanupStepRepeatTests.cs, FfProbeLogTests.cs and ToolFailureLogFormatTests.cs) in a new session, as the maintainer asked. Done is one shared capture helper, every site moved onto it, and a pull request merged into develop whose body says Closes on promotion: #1129.
    2. Promote develop to main when the maintainer asks, with drive-pr to a mergeable promotion pull request. Its body carries one Fixes line per issue fixed on develop and not on main: Fail One File Instead of the Whole Run on a Per-File Exception #1069, Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Setting Verified When the Verify Option Is Off #1071, Replace the Original Only After ReEncode and DeInterlace Fully Succeed #1072, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081, Keep the State Set Before a Rename When the New Name Has a Sidecar #1082, Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095, Enforce a Minimum Version for Every Media Tool Family #1104, Trim the HISTORY Release Entries to the Changes a User Needs #1105, Add a Codecov Coverage Badge to the README Build Status #1106, Split the Remux and Container Steps Diagram into Narrower Charts #1107, Keep a File Found When a Multi-Step Rename Fails Partway #1109, Set FileDeleted When Only the Sidecar Delete Fails in DeleteFailedFile #1116, Harden FileIgnoreList Pruning and Post-Run Write Retry #1120, Consolidate Fake Tool Fixture Setup in FakeTools #1124, Report Every Repair a Track Needs When Its State Holds One #1127, plus Share One Log Capture Helper Across Test Classes #1129 once it lands. Re-derive the set from origin/main..origin/develop and each pull request's Closes on promotion: line rather than trusting this list. Done is a promotion pull request meeting every Merge Gate item except the merge permission.
    3. Release 3.23 after the promotion merges, when the maintainer says so, via merge-and-release. HISTORY.md 3.23 is in its release shape, with one added line for Report Every Repair a Track Needs When Its State Holds One #1127.

    External blockers

    Internal dependencies

    • Share One Log Capture Helper Across Test Classes #1129 lands before the promotion, so the promotion carries it and 3.23 ships with it.
    • develop takes no merge commits. A promotion is a merge of develop into a branch off main, since Dependabot bumps hub workflow pins on main.

    State

    The parked decision queue

    It holds 0 issues. No open issue in this repository carries the decision label. The #1127 design was decided in this session and is recorded on the issue.

    What the last round did

    What not to repeat

    • The first design offered for Report Every Repair a Track Needs When Its State Holds One #1127 was one extra bool, which the maintainer rejected as not scalable. The second kept ReEncode and DeInterlace as dispositions, which the maintainer rejected for inconsistency. Put every "needs doing" value in the flags from the start, and keep the disposition to what happens to the track as a whole.
    • Copilot and Qodo review the head pushed at open even while a fix commit is in flight, so both raised a finding the next head already fixed. Run the local passes to a clean result before the first push where the budget allows.
    • CodeRabbit asks for tool-argument assertions on the fake-tool tests every round. Check whether the path under test builds those arguments at all before writing a test for them. One request on Split Track State into a Disposition and Combinable Actions #1132 had no track selection to assert.

    New learnings

    • PR loop observations for this round are in the session's per-machine notes, not durable governance. Nothing here needed a governance change.
  26. changed the title [-]Session Handoff [process-findings]: Fix the Test Log Capture Copies, Then Promote and Release 3.23[/-] [+]Session Handoff [process-findings]: Promote and Release 3.23, and Fix the Reduced-Run Lookup in find_run[/+] on Oct 31, 2026
  27. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Parked decision queue, presented at the session close: 0 issues. Nothing was asked from the queue.

    Decisions the maintainer made in this session:

  28. ptr727 commented on Oct 31, 2026

    @ptr727
    OwnerAuthor

    Round 17, closed 2026-10-31: Session Handoff [process-findings]: Promote and Release 3.23, and Fix the Reduced-Run Lookup in find_run

    Next steps, in priority order

    1. Promote develop to main when the maintainer asks, with drive-pr to a mergeable promotion pull request. Its body carries one Fixes line per issue fixed on develop and not on main: Fail One File Instead of the Whole Run on a Per-File Exception #1069, Count an Orphan Sidecar Deletion as a Success, Not an Error #1070, Stop Setting Verified When the Verify Option Is Off #1071, Replace the Original Only After ReEncode and DeInterlace Fully Succeed #1072, Stop Remux and Lowercase Renames From Overwriting an Existing File #1073, Fail or Report RepairMetadataErrors When Errors Remain After Repair #1074, Re-Run the Full Cleanup After a Re-Encode Repair #1075, Guard ReEncode and DeInterlace Against Repeating on Every Run #1076, Remove Cover Art That Only MediaInfo Reports, and Re-Check the FfProbe Path #1077, Clear BitrateExceeded and Handle Failed Bitrate and Packet Analysis #1078, Decide Whether IsMediaAndToolsCurrent Has the Tool-Change Sense Inverted #1079, Skip Registering Deleted Files in FileIgnoreList #1080, Handle Write Failures for the Settings and Results Files After a Run #1081, Keep the State Set Before a Rename When the New Name Has a Sidecar #1082, Decide How a Signal-Killed Repair Run Affects DeleteInvalidFiles #1095, Enforce a Minimum Version for Every Media Tool Family #1104, Trim the HISTORY Release Entries to the Changes a User Needs #1105, Add a Codecov Coverage Badge to the README Build Status #1106, Split the Remux and Container Steps Diagram into Narrower Charts #1107, Keep a File Found When a Multi-Step Rename Fails Partway #1109, Set FileDeleted When Only the Sidecar Delete Fails in DeleteFailedFile #1116, Harden FileIgnoreList Pruning and Post-Run Write Retry #1120, Consolidate Fake Tool Fixture Setup in FakeTools #1124, Report Every Repair a Track Needs When Its State Holds One #1127, Share One Log Capture Helper Across Test Classes #1129. Re-derive the set from origin/main..origin/develop and each pull request's Closes on promotion: line rather than trusting this list. Done is a promotion pull request meeting every Merge Gate item except the merge permission.
    2. Fix Filter find_run on Corpus So a Reduced Run Is Not Read as Full-Corpus Ground Truth #1134: corpus_common.find_run in RegressionTests/ ignores buildinfo.json Corpus, so a reduced run is read as full-corpus ground truth by audit_physical.py and catalog_corpus.py with no --run. The issue proposes a corpus argument defaulting to full, falling back to the -reduced directory suffix for runs without the field. Done is a pull request merged into develop whose body says Closes on promotion: #1134. Whether it goes before or after the promotion is the maintainer's call, see below.
    3. Release 3.23 after the promotion merges, when the maintainer says so, via merge-and-release. HISTORY.md 3.23 is in its release shape. Share One Log Capture Helper Across Test Classes #1129 is test-only and needs no line.

    External blockers

    Internal dependencies

    State

    The parked decision queue

    It holds 0 issues. No open issue in this repository carries the decision label. The promotion-order question above was put to the maintainer this session as a prompt, not filed.

    What the last round did

    What not to repeat

    • The first head of Share One Log Capture Helper Across Test Classes #1133 left out a comment it had earned (the Sequential collection requirement), to stay clear of the comment-added gate. Copilot asked for it back, which cost a fix commit, a strict pass, and a second check run. Where the code can't carry a constraint, write the comment and add the comments label when the PR opens.

    New learnings

    • None beyond the entry above. PR loop observations for this round are in the session's per-machine notes.
  29. changed the title [-]Session Handoff [process-findings]: Promote and Release 3.23, and Fix the Reduced-Run Lookup in find_run[/-] [+]Session Handoff [process-findings]: Promote and Release 3.23[/+] on Oct 31, 2026
  30. ptr727 commented on Nov 2, 2026

    @ptr727
    OwnerAuthor

    Outcome: the 3.23 work is on main. Track process-findings closes with one step left, the 3.23 release, which the maintainer will dispatch on request.

    Lessons:

    • Never call a pull request ready while any check is pending, CodeRabbit included. Its status can register after every other check has finished.
    • On a promotion, Copilot's "needs a closer look" verdict names no line. Sweep for the claim it describes before declining it, since one such verdict here was a real doc error, fixed in State That a HandBrake Run Drops Embedded Closed Captions #1163.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    handoffA link in the session handoff chain, one open issue per track

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions