Skip to content

Add interactive cleanup dashboard and Phase 15 evidence - #1

Merged
markintux merged 10 commits into
mainfrom
validation/phase-15-final-gates
Sep 24, 2026
Merged

markintux merged 10 commits into
mainfrom
validation/phase-15-final-gates

Conversation

@markintux

@markintux markintux commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Add an interactive cleanup dashboard with account emphasis, aligned run table, progress bars, overlap protection, and a bounded batch picker.
  • Improve the exact-item confirmation screen and show a compact result after each menu batch, with Enter returning to the dashboard.
  • Preserve the existing Core confirmation and executor boundaries; every batch still requires its own review and exact APAGAR confirmation.
  • Record sanitized Phase 15 owner validation and stabilize synthetic browser CI on shared runners.

Verification

  • npm run check: 47 test files, 213 tests, typecheck, lint, formatting, build.
  • Local coverage, private-artifact scan, package inspection (222 files), and git diff --check passed.
  • CI on the final commit passed on macOS, Ubuntu, and Windows, including coverage and package inspection.
  • Owner-operated POST batches of 1 and 5 completed; the latest batch left the run paused with 34 completed and 234 pending. All six exact statuses were independently observed as absent on X using the dedicated profile.

Release boundary

The repository remains private. This PR does not publish a package or authorize further destructive batches. Final owner approval for release is still pending.

markintux and others added 10 commits September 22, 2026 14:07
Field work from the Phase 15 validation session against a real archive
and a real account.

Archive: tolerate the ZIP and YTD shapes an official export actually
produces, instead of only the synthetic fixture shape.

Session: open ordinary Google Chrome with the dedicated profile for the
manual login, then reuse that profile through Playwright only to detect
the account. The browser factory falls back to the `chrome` channel when
the bundled Chromium is absent. The password is still never requested,
captured or stored.

Post page: poll for target, menu, dialog and confirmation evidence
instead of reading the DOM once, and recognize the current X markup
(`confirmationSheetDialog`, `caret`) plus the newer login and challenge
URL shapes.

Confirmation: list the exact items of the batch before asking for
APAGAR, selected from the eligible set rather than the whole plan
snapshot, so the owner authorizes what will actually run.

Execution: select the next item before the pacing delay, and default to
a 5 second interval between completed interactions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The Phase 15 interrupt gate produced no evidence: the executor printed
nothing between the confirmation and the final summary, the silence
looked like a hang, and the second Ctrl+C that followed exits
immediately by design without persisting anything. That left the run
RUNNING, the batch RUNNING and an orphan `.executor.lock`, and the next
resume would have asked for APAGAR before failing with
EXECUTOR_LOCK_HELD.

Progress: add a language-neutral execution feed reported after the
durable boundary, so an operator can see the boundary a manual interrupt
is meant to land on, plus the pacing interval between items. It carries
no interaction content and can never fail a run.

Lock: `diagnoseStaleLock` was dead code. `run` and `resume` now diagnose
before recovery and before the destructive confirmation, so a live
executor is never reconciled underneath and the owner never types the
confirmation phrase into a command that cannot run. `status` reports the
same diagnosis read-only. A stale file is removed only by the explicit
`--release-stale-lock`, which re-diagnoses in the same call and refuses
every state but STALE; removing it authorizes nothing, and APAGAR is
still required.

Recovery: reconcile an unclean stop in one transaction. Batches left
RUNNING are closed as INTERRUPTED, the run becomes INTERRUPTED and the
checkpoint reason is MANUAL_INTERRUPT. That reason is reconstructed at
recovery, not observed at the signal, because the immediate exit
persists nothing. A clean pause is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Persist the interrupt boundary before exit and require exact X page evidence before undoing reactions. This prevents an unsafe resume state and ambiguous real-account mutations.
Keep each batch behind its own account and item review while making progress and results easier to follow. Record the owner-run POST checks without personal data.
Shared CI runners can take over Vitest's 10-second default to launch Chromium. Give only browser setup hooks 30 seconds, matching their teardown hooks.
The POST and REPLY browser integration cases can exceed Vitest's five-second default on shared Windows runners. Keep the longer timeout scoped to those two cases.
Shared runners intermittently exceed the default five-second test limit when many Chromium suites start together. Limit workers to four and allow 30 seconds per test without changing production behavior.
Pull requests already validate feature branches. Run push CI only for main so two identical matrices do not compete for browser startup resources.
@markintux
markintux merged commit 08ff40b into main Sep 24, 2026
3 checks passed
@markintux
markintux deleted the validation/phase-15-final-gates branch September 24, 2026 20:10
Sign up for free to 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