Skip to content

[rush] Rush Reporter Overhaul #5858

Description

@TheLarkInn

Some Issues w/ Rush Terminal Reporting today:

  • We have no reporter system in place.
  • AI models struggle to work with rush for a variety of reasons
    • Long running processes occupying the foreground
    • Terminal output is super verbose by default - eats up lots of the default context window
    • Error messages don't provide the best context or assistance (for both users and agents)

Plan:

  • Most linting and coverage tools have a --reporter feature which customizes output based on where and how it is being run (ci, local machine, even OS specific). Leverage COPILOT_CLI env variable to auto trigger an AI reporter system --reporter=ai that will provide agent-optimized terminal feedback. Based on eval's we can tweak the format to be JSON, Plaintext, Markdown, etc. and determine the level of verbosity (or not) that works best for agents.
  • Once we have a --reporter system, drastically reduce the default reporter output for all rush <command name> commands to minimal. P0 would be to get rid of the long diagnostic feedback of rush build and replace with 3 things consuming no more than a few lines:
    • Spinner/progress bar to indicate progress
    • One line dynamic activity marquee that reassures users that the command is still running. (What project currently getting built, etc)
    • One line result with standard exit code and output
  • Errors get migrated to have a new hierarchy that both the AI and default reporters can respond/visualize in specific ways

📦 Implementation status (updated 2026-07-15)

The RFC (specs/2026-07-12-rush-reporter-overhaul.md) and the standalone @rushstack/reporter public-beta package (28/28 features) have landed as a 6-PR stack:

PR Phase
#5865 1 · Contracts & baselines (package scaffold, event envelope, producer API, diagnostics, NDJSON protocol, ReporterManager, goldens)
#5866 2 · Bootstrap & compatibility adapters
#5867 3 · Shadow structured emission (session, lifecycle, telemetry, exit codes)
#5868 4 · Opt-in reporters (default/plaintext/json/ai/file/legacy, selection, StreamCollator replacement, problem matchers)
#5869 5 · Heft protocol track
#5870 6 · Performance budgets & daemon-aligned major default flip

⚠️ Not yet enabled in the live CLI. The package is standalone — nothing in rush-lib/apps/rush imports it yet, so rush build still renders through the legacy StreamCollator. The P0 3-line default (spinner + activity marquee + result) described above ships when the rollout steps below are complete.

✅ Remaining work to enable the new reporting system

Wire the package into the toolchain

  • Add @rushstack/reporter as a dependency of rush-lib and apps/rush (RFC §5.1)
  • Generate the frozen bootstrap-envelope encoder + protocol-major constant into the zero-dependency install-run-rush build (RFC §5.1)

Bootstrap prelude — install-run-rush (Phase 2)

  • Add the two-stage prelude: parse early controls and buffer Rush-owned startup events to the handoff file before rush-lib loads (RFC §5.5)
  • Publish the handoff-file path via env var for the frontend to replay

Frontend host — apps/rush (Phase 2)

  • Create the authoritative ReporterManager before version selection; replay then delete the bootstrap handoff (RFC §4.3)
  • Install cross-version compatibility adapters (new-frontend/old-engine, old-frontend/new-engine) keeping legacy rendering visible

Engine integration — rush-lib (Phases 3–4)

  • Expose the RushSession event sink + scoped producers to actions and plugins (RFC §5.3)
  • Emit shadow structured lifecycle + diagnostic events with no output change; validate telemetry + exit-code parity (Phase 3)
  • Replace StreamCollator in OperationExecutionManager with raw semantic operation events, gated on the new reporter path (RFC §5.13)
  • Register CLI controls in ts-command-line: --reporter, --output, --log-level, and the --quiet/--verbose/--debug aliases (RFC §5.6–5.7)
  • Read agentEnvironmentVariables + reporter config from rush.json (RFC §5.8)
  • Wire the telemetry projection subscriber into Rush's telemetry path (RFC §5.17)
  • Derive command exit codes via deriveExitCodeFromEvents (RFC §5.18)

Heft integration (Phase 5)

  • Teach Heft to negotiate the child descriptor and emit NDJSON; retain raw-stream fallback for older Heft (RFC §5.19)
  • Register problem matchers for external/child output recovery (RFC §5.16)

Compatibility & deprecations (Phase 6 — daemon-aligned major)

  • Deprecate, then remove, ILogger.terminal and RushSession.terminalProvider (RFC §5.3)
  • Gate incompatible plugins before apply() with the structured migration diagnostic (RFC §5.3)
  • Bridge legacy AlreadyReportedError sentinels and prohibit new usage (RFC §5.15)
  • Preserve the RUSH_REPORTER=legacy emergency fallback for ≥1 major (RFC §8.2)

Rollout controls & gates (RFC §8.2)

  • Add the experimental repository setting (experiments.json) for pre-major opt-in
  • Pass the deterministic AI-corpus gates before enabling agent auto-selection
  • Flip defaults in the daemon-aligned major: automatic selection on, terminal APIs removed (Phase 6)

Docs & later cleanup (Phase 7)

  • Document migration, verbosity aliases, RUSH_REPORTER, and --reporter/--output
  • (Later major) Remove the legacy renderer after ≥1 major of default use with no blocking canary regressions
  • (Later major) Remove the AlreadyReportedError bridge once ecosystem criteria are met

Metadata

Metadata

Assignees

Labels

needs designThe next step is for someone to propose the details of an approach for solving the problem

Type

No type

Fields

No fields configured for issues without a type.

Projects

Status
Needs triage

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions