Skip to content

fix(test-runner): finish guarded execution and environment hygiene - #274

Merged
pacphi merged 21 commits into
developfrom
test/runner-hygiene
Sep 29, 2026
Merged

pacphi merged 21 commits into
developfrom
test/runner-hygiene

Conversation

@pacphi

@pacphi pacphi commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Scope

V5 of the approved remediation program, targeting develop. The aggregate develop → main PR remains for human review.

  • Guard focused test runs, record run ownership, retain interrupted/unknown sibling roots, and report cleanup failures honestly.
  • Let participating tests hold a run directory until their owned processes are confirmed stopped; retain uncertain roots.
  • Prove interruption, cancellation, and Windows smoke-child cleanup behavior with bounded process fixtures.
  • Restrict Chrome's environment and give it private state/temp paths.
  • Preserve developer tool-selector propagation, refine exact concurrent-writer exceptions, and test the actual About renderer.
  • Archive the completed runner plan/research after handing over the reviewed, read-only backlog inventory.

Evidence

Independent task reviews, one whole-branch review, and the scoped final correction review passed. Full local gate at e0fcc2eb:

  • Unit: 5,947 passed, 0 failed, 6 native-Windows-only skips.
  • Coverage: 94.33% lines, 83.27% branches, 93.47% functions.
  • UI: 495 dashboard checks and 15 Node tests passed using installed Chrome.
  • Typecheck, lint, complexity ceiling, Markdown, build/pack validation and offline links passed.
  • Normal-home real-state tripwire reported no changes; completed suite roots were removed and existing unknown siblings retained.

Final documentation commit c9baf6a4 changes only the two completed plan/research records and archive index. The relocation was independently reviewed; 17 documentation tests, Markdown and internal links passed. The immutable private backlog snapshot was independently reconciled: 34,034 entries total; manual-review sections A 33,978 / B 4 / C 3, with 49 entries retained by the stated exclusions. These are historical counts, not deletion authorization.

Actions validated the final head 36d78caf2fca6a61b7fd924499da9541ae85060c in three consecutive complete 13-job runs, including native Windows and Linux Chrome. This PR does not claim universal descendant discovery: sibling reclamation remains list-only on every platform, and holds protect participating callers.

Operational boundaries

The temporary backlog inventory is a private, point-in-time manual review artifact containing literal machine paths. No backlog removal was performed. Releases, global installation and the final main merge remain deferred under the approved plan.

Unit commits

  • b2d7a3ad docs(plan): map runner hygiene tasks and evidence gates
  • 0027ad26 docs(research): how test temp folders leak and how a run root is proven abandoned
  • 55f444b6 docs(research): complete test creator lifecycle census
  • 17833652 docs(research): account for parent cleanup in credential census
  • 3cb5a1e2 test(about): render the Ruflo install-edit line on the About card
  • 705bd5ff test(tripwire): list the live Ruflo session's .claude-flow folder and proven-config files as concurrent writers
  • dd663f6b fix(test-runner): guard owner roots and keep sibling cleanup list-only
  • 3365429e fix(test-runner): fail hygiene on own-root cleanup errors
  • d3b09a85 feat(test-runner): guard focused runs and prove interrupted retention
  • 0cc5c11d test(test-runner): observe orphan exit before retention check
  • 9b5b3a43 test(runner): preserve tool selector propagation
  • a50223fa fix(ui): isolate Chrome launch environment
  • 5d322f8e test(status): await owned spawn guard child before cleanup
  • 6f716f85 test(runner): verify owned fork exits before sandbox cleanup
  • 1fe3e61e test(runner): retain own root for unresolved child holds
  • e0fcc2eb test(runner): await owned process cleanup on cancellation
  • c9baf6a4 docs(archive): record completed runner hygiene work

CI compatibility corrections

The first matrix run found a Node 22 event-loop difference in the intentional timeout fixture and a Windows-specific self-termination result. Test-only commits 5afaa4bb and dea09999 retain the exact 500 ms timeout assertion and exercise native parent-owned signal termination without fabricating a result. Node 22.22.3 and Node 26.4.0 focused gates each passed 55/55; independent Node 22 verification passed 29/29 with a strict tripwire. Production code is unchanged. The final revision subsequently passed the complete native CI matrix three consecutive times.

  • 5afaa4bb test(runner): keep cancellation timeout fixture alive on Node 22
  • dea09999 test(runner): use owned native termination for signal retention

Final Windows cleanup correction and CI

A later repetition exposed native Windows EBUSY after the fixture had already confirmed process exit. Commit 36d78caf adds bounded test-fixture removal retries (four attempts, 100/200/300 ms waits), preserves an original assertion failure alongside cleanup failure, and tests transient and exhausted removal behavior. The kernel cause was not established. Production code is unchanged. Node 22 and Node 26 focused runs passed 57/57 each; independent fault-injection and strict-tripwire checks passed.

  • 36d78caf test(runner): retry fixture removal after confirmed child exit

All results below bind the same final source revision. Earlier failed attempts remain part of the evidence; they were not counted as successful runs.

CI attempt Result Windows Node 22 Windows Node 24 Windows Node 26
1 13/13 successful 217 s 222 s 175 s
2 13/13 successful 209 s 246 s 210 s
3 13/13 successful 278 s 264 s 208 s

This meets the three-consecutive-run timing criterion at the current revision. It does not rewrite the historical V1 record or guarantee every future Windows run will take less than five minutes.

Final private inventory handoff

After the last code changes and CI, a fresh source-bound inventory at 36d78caf recorded 34,039 entries: A 33,978 / B 4 / C 3, plus 54 retained exclusions. An independent reviewer reconciled every section, literal path, current test attribution and 456 source hashes. Snapshot digest: d34711f58ea88bfc749ded636c819d586fcba16100f9ee4fd8b790fb6d505805. Original evidence remains preserved separately. A scratch JSON-parser difference is disclosed; none of the four suite roots had an owner record, so it affected no classification. The final list is private and remains a point-in-time review aid, not permission or proof to delete any folder.

@pacphi
pacphi merged commit af825c9 into develop Sep 29, 2026
39 checks passed
pacphi added a commit that referenced this pull request Sep 29, 2026
* chore: establish develop remediation integration (#272)

* docs(plan): confirm develop remediation execution

* ci: validate develop branch pushes

* fix(paths): ignore relative XDG locations consistently (#273)

* docs(plan): map V4 follow ups v2 branch

* fix(paths): ignore a relative XDG_* value, as the XDG Base Directory spec requires

* docs(plan): specify V4 follow-up mappings and decisions

* fix(footprint): align deep runtime log root with state base

* fix(test-runner): finish guarded execution and environment hygiene (#274)

* docs(plan): map runner hygiene tasks and evidence gates

* docs(research): how test temp folders leak and how a run root is proven abandoned

* docs(research): complete test creator lifecycle census

* docs(research): account for parent cleanup in credential census

* test(about): render the Ruflo install-edit line on the About card

* test(tripwire): list the live Ruflo session's .claude-flow folder and proven-config files as concurrent writers

* fix(test-runner): guard owner roots and keep sibling cleanup list-only

* fix(test-runner): fail hygiene on own-root cleanup errors

* feat(test-runner): guard focused runs and prove interrupted retention

* test(test-runner): observe orphan exit before retention check

* test(runner): preserve tool selector propagation

* fix(ui): isolate Chrome launch environment

* test(status): await owned spawn guard child before cleanup

* test(runner): verify owned fork exits before sandbox cleanup

* test(runner): retain own root for unresolved child holds

* test(runner): await owned process cleanup on cancellation

* docs(archive): record completed runner hygiene work

* test(runner): keep cancellation fixture alive on Node 22

* test(runner): use owned native termination for signal retention

* test(runner): retry fixture removal after confirmed child exit

* feat(dashboard): deliver explicit refresh and live-session corrections (#276)

* docs(plan): map dashboard refresh delivery

* feat(dashboard): one server refresh operation behind POST /api/refresh

* docs(plan): complete dashboard refresh carry-ins

* docs: repair dashboard usage citation

* feat(dashboard): one Refresh control with the CLI three strengths; Reload re-reads the view

* fix(dashboard): show Unknown for unassessed Claude Code configuration

* fix(dashboard): meet icon contrast in the host header

* fix(dashboard): honor changed Maintenance URL state

* test(dashboard): prove refresh request and write boundaries

* docs(dashboard): record refresh client gate status

* test(dashboard): restore Maintenance write safety journeys

* fix(dashboard): reread active System views on Reload

* fix(dashboard): retain write guard until refresh status reconciles

* fix(dashboard): reconcile superseded refresh operations

* fix(dashboard): start scans with POST requests

* docs: align dashboard docs with the one Refresh control

* docs: correct refresh labels and machine stage order

* docs(adr): reconcile dashboard refresh supersessions

* test(dashboard): cover ruflo component cwd forwarding

* fix(live): resume displaced native transcript readers

* docs(live): state re-entry and structured-source limits

* docs(dashboard): reconcile final V3 evidence

* fix(activity): show paused scan record time

* fix(activity): reject impossible scan dates

* docs(archive): record dashboard refresh implementation

* fix(dashboard): honor current project-tree refresh selection

* test(maintenance): align evidence method with Refresh vocabulary

* test: trace native learning dependencies on macOS (#277)

* docs(trace): plan upstream native resolution evidence

* feat(trace): record resolved Transformers and ORT package roots

* test(nightly): retain macOS learning resolution traces

* test(trace): preload hook with portable file URL

* docs(archive): record native learning trace evidence

* fix(watch): complete bounded polling and watcher follow-ups (#278)

* fix(upstream-watch): skip retries for deterministic fetch failures

* fix(upstream-watch): bound dispatch pull request observation

* test(upstream-watch): cover ledger git and spawn failures

* test(upstream-watch): reject invalid ledger branch before git

* perf(upstream-watch): measure notice fit with prefix lengths

* test(upstream-watch): cover singular notice and latest firing

* fix(upstream-watch): report invalid record registry once

* test(upstream-watch): pin invalid registry precedence over future since

* refactor(upstream-watch): share ledger event vocabulary

* fix(upstream-watch): fail ledger on invalid registry

* docs(upstream-watch): remove stale Codex reprobe instruction

* fix(upstream-watch): format exhausted firing sessions as a list

* fix(watch): require a commit before sending a notice

* fix(watch): explain blind workflow summaries

* docs(watch): archive completed follow-up plan

* fix: remediate CLI, memory and upstream integration follow-ups (#275)

* fix(cli): keep command usage failures machine-readable

* fix(cli): validate usage and adapter revocation arguments

* fix(host): keep dry-run JSON previews structured

* fix(host): avoid status evidence writes in dry runs

* fix(versions): throttle offline self retries by channel

* fix(versions): scope self cache freshness to checked tags

* test(maintain): guard injected refresh construction

* fix(setup): isolate memory probe native mirror

* test(evidence): prove repair commands re-record fresh facts

* test(evidence): exercise setup machine host lifecycle wiring

* test(aqe): verify live-lock fallback on installed artifact

* test(aqe): guard live-lock probe cancellation

* fix(memory): explain unsuitable locations and strict temp nesting

* fix(memory): bind coexistence status to routing evidence

* test(status): align offline self cache with checked tags

* fix(memory): preserve cli proof across route checks

* fix(memory): discover stray stores in ordinary dot directories

* fix(status): report AQE home store separately

* fix(status): replace broken AQE Codex setup hint

* fix(memory): keep dependency markers and metadata errors out of complete scans

* fix(status): give one ruflo component restart instruction

* fix(daemon): preserve YAML configuration precedence

* fix(sync): preview version-triggered daemon convergence

* fix(daemon): respect explicit config and active restart source

* fix(discovery): restore paused coverage from durable summary

* fix(exec): abort owned process trees

* fix(exec): bound uncertain Windows cleanup and byte caps

* test(setup): isolate host rerecord project fixture

* fix(test): hold C1 run root until owned children close

* fix(test): accept Windows bootstrap env casing

* test(ci): seed both requested self-drift tags

* test(ci): probe pinned upstream conformance in isolated homes

* docs(host-support): align upstream risks with verified releases

* docs(upstream): register aqe init settings churn report

* docs(host-support): clarify Ruflo source caveat

* test(exec): retain a ready descendant after Windows parent exit

* test(exec): launch a script through the native PowerShell fixture

* test(ruflo): diagnose native Windows MCP transport boundaries

* test(ruflo): isolate diagnostic launches and retain uncertain cleanup

* test(ci): capture native Windows MCP transport diagnostics

* fix(aqe): retire FsyncFailed live-lock exception

* test(exec): hardcode the PowerShell fixture entry point

* fix(exec): launch recognized npm Windows shims through their public bins

* fix(identity): preserve exact persisted file IDs

* test(ruflo): await natural closure for EOF diagnostics

* test(exec): preserve native extensions in PowerShell ownership fixture

* test(exec): keep reported parent out of cleanup authority

* fix(live-checks): report skipped deja-vu and clean proof temp dirs

* test(identity): correct Windows persisted identity fixtures

* test(ci): retire completed native integration proof job

* fix(test-runner): compare exact file identities before cleanup

* docs(adr): scope self-version retry evidence to checked channels

* docs(v4): record bounded C6 checks and accepted work

* docs(remediation): archive verified V4 follow-ups plan

* fix(usage): complete session attribution and accounting remediation (#282)

* docs(usage): plan usage accuracy capture units

* feat(usage): add shared session surface vocabulary

* fix(usage): preserve fixed initiators and bound raw evidence

* docs(usage): map capture units to source and tests

* fix(usage): classify local managed Claude statusline settings

* fix(usage): keep ambiguous managed statusline values unknown

* fix(usage): classify statusline shell wrappers as custom

* fix(usage): reject option-shaped statusline targets

* feat(usage): persist session surface classification in cache

* fix(usage): retain bounded unfamiliar origin metadata

* fix(usage): classify Codex child threads and unpriced reviews

* fix(usage): preserve rejected source and imported origin

* fix(footprint): count Claude sessions by declared identity

* fix(footprint): keep recovered project evidence out of session counts

* fix(runtime): distinguish desktop apps from hosted CLI sessions

* fix(runtime): recognize Codex service after global options

* fix(runtime): preserve quoted Codex config boundaries

* fix(system): preserve project census count basis in management API

* fix(system): label desktop applications in runtime views

* fix(usage): bind Claude provider detail to session model evidence

* fix(usage): tighten Claude provider evidence validation

* fix(usage): exclude imported Codex turns individually

* fix(usage): reject incomplete mixed-turn ownership

* fix(usage): count Codex component usage without responses

* fix(usage): attribute OpenCode totals by response provider

* fix(usage): retain provider bucket session metrics

* feat(usage): capture Codex effort timing and compaction

* feat(usage): preserve session surface presentation evidence across project DTOs

* feat(dashboard): render session surfaces and import census disclosures

* fix(usage): bound Codex compactions and gate unprovable replay

* fix(dashboard): preserve legacy surface filters and refresh selections

* feat(usage): reconcile Claude cost-state checkpoints

* fix(usage): qualify Claude cost-state comparison scope

* test(ui): include session surfaces in default suite

* fix(usage): mark OpenCode reported zero as unpriced when untrusted

* fix(usage): deduplicate copied Claude messages across files

* fix(usage): scope Claude dedup to display windows

* fix(usage): elect one Claude message owner across windows

* fix(usage): bind Claude ownership to source eligibility

* fix(usage): gate OpenCode cache reuse on parse semantics

* fix(usage): invalidate local buckets when timezone changes

* fix(usage): count unknown Claude transcript records

* fix(usage): classify valid Claude JSON record shapes

* fix(usage): require unambiguous OpenCode database selection

* feat(usage): detect unsupported OpenCode storage presence

* fix(usage): reject incomplete OpenCode source discovery

* fix(usage): disclose unsupported OpenCode storage coverage

* fix(usage): capture OpenCode compactions and reconcile counters

* fix(usage): refresh OpenCode evidence and retain uncertain bounds

* fix(usage): exclude OpenCode children from prompt fingerprints

* docs(usage): accept bounded session and accounting contracts

* docs(adr): record accepted session surface contracts

* docs(usage): correct window provider and delegation metrics

* fix(usage): preserve legacy filters and integration contracts

* test(dashboard): align served provider helper assertion

* docs(usage): archive completed V6 plans and evidence

* test(maintenance): use a native census project fixture

* test(usage): model unavailable runtime timezone portably

* test(hooks): isolate CLI probes and assert no drift launches

* test(host): frame lifecycle logs as test diagnostics

* fix(upstream-watch): reconcile main pacing with develop safeguards (#283)

* fix(upstream-watch): retry and pace routine dispatch (#280)

* fix(upstream-watch): retry and pace routine dispatch

The first scheduled dispatch fired 7 released fixes back to back and all
got HTTP 503 without a session, failing the run. The error also dropped
the response body and request id.

- retry 5xx trigger answers up to 3 attempts with backoff (4xx not retried)
- include request-id and the response error message in the failure
- fire at most 3 fixes per run, 15s apart; stop at the first failed call
- defer the rest to the next run without recording an error

* feat(upstream-watch): report fixes deferred to the next run

Surface the dispatcher's deferred list in watch.json, the console output
and the workflow summary so a backlog is visible, not silent. Pause between
firings uses the script's injectable sleep.

* fix(upstream-watch): bound trigger retries and redact error metadata

* fix(upstream-watch): preserve deferred backlog in previews and blind results

* docs(upstream-watch): explain bounded dispatch and deferred evidence

* fix(upstream-watch): stop retries on response body transport failures

* docs(upstream-watch): archive reviewed main reconciliation

* chore(closeout): reconcile remediation v2 evidence and enforce comment hygiene (#284)

* docs(plan): define final remediation closeout units

* test(comments): guard durable references and remove transient labels

* docs(closeout): record v2 scope and qualified execution evidence

* fix(tests): distinguish test declarations from ordinary member calls

* fix(tests): exclude table data from test context inference

* docs(closeout): reconcile integration status and upstream evidence

* test(quality): isolate parser guard from unit matrix

* ci(quality): require parser guard after dependency installation

* docs(closeout): archive validated V7 execution plan
@pacphi
pacphi deleted the test/runner-hygiene branch September 29, 2026 22:11
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