Skip to content

feat: add v1.2.0 Phase 2 Rainbow Arc progress - #23

Merged
HelloThisWorld merged 5 commits into
mainfrom
codex/feature-v1.2.0-phase2-rainbow-progress
Aug 1, 2026
Merged

feat: add v1.2.0 Phase 2 Rainbow Arc progress#23
HelloThisWorld merged 5 commits into
mainfrom
codex/feature-v1.2.0-phase2-rainbow-progress

Conversation

@HelloThisWorld

@HelloThisWorld HelloThisWorld commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

Implements Phase 2 of the v1.2.0 Visual Progress milestone on top of the Phase 1 foundation:

  • replaces the static overlay with the compositor-driven Rainbow Arc Weld renderer;
  • adds bounded incremental CLI progress recognition with built-in providers;
  • adds the opt-in visualProgress.replaceRecognizedOutput preview setting, default false;
  • extends deterministic/resource/provider/suppression tests, the manual synthetic demo, and developer documentation.

This is a developer preview, not a v1.2.0 release. The application version remains 1.1.3.

Related issues

Stacking and rebase strategy

PR #22 was already merged before Phase 2 began, so this branch was created from the latest main and this draft targets main directly. origin/main was fetched again before push and remained at e04724a. If main advances during review, this branch will be rebased onto main and only genuine Phase 2 conflicts will be resolved. The current range contains only Phase 2 changes.

Detailed changes

Rainbow Arc Weld renderer

  • Dedicated WinTerm-owned renderer and pure render model under src/winterm/VisualProgress.
  • Continuous rounded six-DIP beam with ten-DIP horizontal margin in a transparent bottom overlay that does not consume terminal layout.
  • Cached compositor gradient, clipped fill, white-hot 2.5-DIP welding core, warm center, short trail, localized 12x10-DIP inner glow, and 26x16-DIP outer bloom.
  • Determinate values interpolate for 220 ms; real regressions use an intentional 240-ms phase-reset transition.
  • Indeterminate mode uses a continuous 1.8-second comet/head pass with a fading rainbow tail and no fabricated percentage.
  • Waiting breathes on a 1.6-second cycle. Success advances when appropriate, sweeps, emits one bounded final burst, tints, and fades. Error pulses once and remains. Cancelled fades quickly and releases resources.
  • Theme/focus/visibility/size refreshes cannot resurrect completed success; in-flight terminal batches hide safely and use independent generations so stale callbacks cannot affect newer visuals.
  • Reduced Motion uses static Phase 1 behavior. High Contrast uses a system-compatible solid treatment.
  • Degradation order: full rainbow/glow/sparks, no sparks, static gradient, solid bar, then disable only the affected pane.

Resource and performance boundaries

  • No CPU-driven frame loop, worker, or permanent per-pane timer; continuous motion is compositor-managed.
  • Fixed spark pools: maximum 8 live sparks per pane and 24 live sparks process-wide; background panes emit none.
  • Normal bursts use 1-2 sparks, final bursts 3-6, 1-3 DIP size, 120-260 ms lifetime, and 6-18 DIP travel.
  • No per-frame heap, gradient, or blur allocation; pooled visuals and cached brushes are reused.
  • Recognition/UI work is bounded and coalesced: one pending UI snapshot, 50-ms publication interval, 32K-code-unit callback cap, 2,048-code-unit line cap, 64-code-unit ANSI cap, 8 recent records, 32 Docker layers, and 32 BuildKit steps.
  • Final local Release build completed in 559.1 seconds after generated-project incremental state churn; the final Relevant suite completed in 13.5 seconds. No runtime GPU/visual benchmark is claimed.

Provider architecture and support

The parser observes only new output incrementally, uses bounded fixed storage and state machines, accepts fragmented ANSI/UTF-8/carriage-return input, and fails open on contention, malformed input, overflow, incompatible terminal state, or reset.

  • Docker Pull: layer/stage and real transfer values; overlay only.
  • Docker BuildKit: bounded step state and real fractions; overlay only.
  • pip: wheel/strong pip transfer signatures and real values; eligible transient frames may be replaced.
  • Git: counting, compressing, receiving, resolving, and updating phases; eligible transient frames may be replaced.
  • curl: standard meter after its header; eligible transient frames may be replaced.
  • wget: standard meter after a strong wget/Saving to anchor; eligible transient frames may be replaced.
  • npm, pnpm, yarn: explicit stages/counts; overlay only.
  • nvm: download/extract/install/switch stages; overlay only.
  • Maven: artifact values and build stages; overlay only and no fabricated overall percentage.
  • Gradle: task state and explicit emitted values; overlay only and no fabricated overall percentage.
  • Generic: anchored progress-like fallback; overlay only and never suppressible.

Safe replacement

visualProgress.replaceRecognizedOutput defaults to false, so original output is preserved by default. When enabled, suppression is limited to an immediately recognized whole callback owned by high-confidence pip, Git, curl, or wget; it must be a safe transient determinate carriage-return/erase-line record in a healthy parser, normal screen, known cursor state, and a pane with an enabled renderer.

Ordinary newline logs, unknown/generic output, warnings, audit findings, errors, stack traces, prompts, summaries, malformed/incomplete ANSI, alternate-screen output, Docker/BuildKit, package-manager/build-provider output, late decisions, contended callbacks, and renderer/parser failures are always preserved. Terminal output never waits for recognition.

Privacy

No telemetry, upload, output logging, scrollback scan, or persistence was added. Normalized state contains only structural progress data. Bounded provider buffers clear on prompt/command completion, close/detach, restart, disable/emergency override, and provider error/cancel. Command lines, package/image names, paths, URLs, host/user names, environment variables, credentials, clipboard content, and terminal output are neither logged nor persisted.

Validation performed

Final passing validation on Windows x64 Release:

  • PowerShell parser validation for scripts/winterm/test-visual-progress.ps1 and scripts/winterm/invoke-visual-progress-smoke.ps1: passed.
  • clang-format --dry-run --Werror for all WinTerm-owned Visual Progress headers and WinTermVisualProgressTests.cpp: passed.
  • .\scripts\winterm\test-visual-progress.ps1 -SourceOnly: passed.
  • .\scripts\winterm\test-ci-classification.ps1: passed; code-class behavior.
  • .\scripts\winterm\build.ps1 -Configuration Release -Platform x64 -IncludeTests: passed.
  • .\scripts\winterm\test.ps1 -Suite Relevant -Configuration Release -Platform x64: passed.
    • SettingsModel: 221/221 passed.
    • TerminalApp: 51/51 passed.
    • Control: 30/30 passed.
  • Focused TAEF reruns for whole-callback suppression and provider-error context cleanup: 1/1 passed each before the final full Relevant pass.
  • .\scripts\winterm\verify-version.ps1: passed; application 1.1.3, package 1.1.3.0, module 1.1.3.
  • git diff --check: passed.
  • Final read-only integration, concurrency, resource, renderer-lifecycle, and diff audits: passed.

Corrective history: the native build caught one unused Wget meter-shape local after ownership tightening; the condition was made authoritative and the build passed. The Relevant suite caught assertions that expected no overlay for transfer-shaped unknown text; tests now assert Generic, non-suppressible overlay behavior, and the final suite passed.

GitHub Actions

Authoritative workflow run 30672469710 completed successfully on the pushed head a807f9f4bf35417d4c9858a04cbd9f6676cb0630:

  • Classify exact change set: passed in 22s.
  • Quick source and smoke validation: passed in 28s.
  • x64 Release build and relevant tests: passed in 26m22s; both the Release build/compiled-tests step and relevant compiled-tests step passed.
  • ci-gate: passed in 3s and confirmed every selected validation job.
  • x64 ${{ matrix.configuration }} build and relevant tests: skipped as expected for the exact code-class selection.
  • x64 unpackaged distributions and installer lifecycle tests: skipped as expected for this non-packaging change set.

Tests not run

  • Packaged-app manual visual QA was not run because this automated session cannot make human visual judgments in the packaged desktop app. Manual checks remain for rainbow appearance, sparks, status timing, DPI 100/125/150/200%, dark/light/High Contrast, Reduced Motion, narrow/maximized/zoomed panes, multi-pane independence, background panes, minimize/focus transitions, and device-loss degradation.
  • The optional 10,000-iteration soak was not run because Phase 2 documents it as opt-in and ordinary CI must remain bounded.
  • Real provider commands were not run because they require optional tools and/or external downloads; sanitized one-code-unit, arbitrary-chunk, ANSI/UTF-8, malformed, overflow, terminal-state, suppression, and stress fixtures cover every provider.
  • The repository Full suite was not run locally because the requested code-class strategy is quick validation, one x64 Release build, and Relevant compiled tests; GitHub Actions is authoritative.

Known limitations and Phase 3 exclusions

Recognition intentionally rejects unsupported variants and preserves their output. Docker/BuildKit, npm/pnpm/yarn, nvm, Maven, Gradle, and Generic remain overlay-only. There is no polished Settings UI, command label, ETA/speed text UI, notification/history/persistence, arbitrary parser plugin, final adaptive governor UI, website update, release documentation, version bump, installer/portable validation, or release preparation. Packaged visual/performance/accessibility soak and final tuning remain Phase 3 work.

Checklist

  • The change is focused and does not include unrelated formatting.
  • Tests were added or updated where appropriate.
  • All tests claimed above actually ran and passed.
  • User-facing behavior and limitations are documented in this repository.
  • Version/schema compatibility is preserved; version remains 1.1.3 and the preview setting defaults false.
  • Package identity, winterm.exe, and Microsoft Terminal coexistence remain isolated.
  • No command text, terminal output, clipboard content, credentials, or private paths are logged.
  • New source and script files contain the appropriate MIT license header.
  • I did not include generated build output, secrets, certificates, or local absolute paths.

No tag, GitHub Release, merge, README release update, website change, or workflow modification was performed.

@HelloThisWorld
HelloThisWorld marked this pull request as ready for review August 1, 2026 02:02
@HelloThisWorld
HelloThisWorld merged commit d84d1e1 into main Aug 1, 2026
6 checks passed
@HelloThisWorld
HelloThisWorld deleted the codex/feature-v1.2.0-phase2-rainbow-progress branch August 1, 2026 02:02
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