Skip to content

feat(task)!: decouple task output style from verbosity - #10885

Merged
jdx merged 3 commits into
jdx:mainfrom
JamBalaya56562:feat/task-output-decouple
Jul 12, 2026
Merged

jdx merged 3 commits into
jdx:mainfrom
JamBalaya56562:feat/task-output-decouple

Conversation

@JamBalaya56562

@JamBalaya56562 JamBalaya56562 commented Jul 9, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Resolves #4308.

task.output currently conflates two concerns in one enum: the output style
(prefix/interleave/keep-order/replacing/timed) and verbosity
(quiet/silent). Because they collapse to a single value, you can't get
"quiet and prefixed" — choosing quiet forces un-prefixed output.

This decouples the two axes:

  • task.output (and --output / MISE_TASK_OUTPUT) now resolves a style only; it never collapses to Quiet.
  • Verbosity flows through the existing quiet/silent knobs (global settings, --quiet/--silent, and the per-task quiet/silent fields), which already gate mise's own metadata prints. So styles and quietness combine freely — e.g. output = "prefix" + quiet = true prints prefixed task lines with none of mise's own chatter.
  • Adds a new per-task output field so an individual task can pick its own style. It overrides the global task.output setting — including a global task.output = "silent" (a task can opt back into visible output).
  • The per-task "Finished in …" timing line now follows each task's effective style/quietness (e.g. output = "interleave" opts out, output = "prefix" opts in), instead of the global default.

⚠️ Behavior change (soft-breaking)

--quiet / quiet = true / MISE_QUIET=1 no longer collapse task output to
un-prefixed interleave — they now preserve the resolved style (prefix when
jobs > 1). Users who relied on --quiet also dropping prefixes should use
--output quiet (or -o interleave). The task.output = "quiet" / "silent"
enum values are unchanged and remain the backward-compatible escape hatch
(quiet → interleave + suppressed mise output).

Changes

  • src/task/task_output_handler.rs — output() resolves style-only; keeps full-silent distinct from partial silent="stdout"/"stderr"; a global task.output = "silent" is treated as a style default (overridable by a per-task output) rather than an unconditional short-circuit; quiet()/silent() extended for the per-task field.
  • src/task/task_output.rs — style_only / style_with_raw helpers (map legacy Quiet → Interleave; style_with_raw never un-silences a Silent value under raw).
  • src/task/task_executor.rs — task_timings() takes the task context and respects per-task output + quiet so the "Finished in …" line no longer leaks under --quiet or mismatches a per-task style.
  • src/task/mod.rs — per-task output: Option<TaskOutput> field (decl/parse/merge/default).
  • settings.toml + schema/mise.json (→ regenerated schema/mise-task.json) — document the split; clarify the legacy quiet/silent values.
  • docs/tasks/{task-configuration,running-tasks}.md — document the new field and decoupling; fixed a stale --interleave reference (that flag doesn't exist → --output interleave).
  • e2e/tasks/test_task_output_style_decoupling — covers prefix+quiet, the legacy quiet value, silent, per-task override (incl. overriding a global silent), raw precedence, --quiet keeping prefixes (and not leaking timing), and per-task timing opt-in/opt-out.

Testing

CI is green: build-ubuntu (compile), unit-macos + nightly (unit tests), and the full e2e-0…e2e-7 sweep all pass. The regression guards (test_task_run_output, test_task_silent_streams) confirm the legacy quiet value and partial-silent behavior are unchanged. Local settings.toml/schema JSON were validated and the docs pass prettier + markdownlint.

Note: local cargo build was not run in my sandbox (memory-constrained — it OOMs), so compilation/e2e were verified on CI rather than locally.


This PR was generated by an AI coding assistant.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added per-task output style overrides (prefix, interleave, keep-order, timed, etc.) independent of quiet/silent.
    • Updated task configuration schemas to support the new output field.
  • Bug Fixes

    • Decoupled output style from verbosity; silent suppresses task output and legacy task.output="quiet" behavior is preserved.
    • “Finished in …” timing now follows each task’s output style/quietness.
  • Documentation

    • Clarified --output interleave and how style combines with --quiet/--silent.
  • Tests

    • Added E2E coverage for style/verbosity combinations and parallel runs.

@coderabbitai

coderabbitai Bot commented Jul 9, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds a per-task output style field, separates output style from quiet/silent verbosity, updates output resolution logic, and refreshes schemas, docs, and end-to-end coverage for the new behavior.

Changes

Task Output Style Decoupling

Layer / File(s) Summary
TaskOutput helpers and Task.output
src/task/task_output.rs, src/task/mod.rs
Adds output-style helpers, a new optional task field, header parsing, overlay merging, default initialization, and parsing test updates.
OutputHandler style and silence resolution
src/task/task_output_handler.rs, src/task/task_executor.rs
Separates full silence detection from style selection, updates quiet and silent checks to use task output settings, and aligns task timing visibility with the task-aware resolution path.
Schemas, docs, and e2e coverage
schema/mise-task.json, schema/mise.json, settings.toml, docs/tasks/running-tasks.md, docs/tasks/task-configuration.md, e2e/tasks/test_task_output_style_decoupling
Adds task output schema properties, revises documentation for style versus verbosity, and adds e2e coverage for the new combinations.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Poem

I’m a rabbit with ears so keen,
I split style from silence, neat and clean. 🐇
Prefix hops one way, quiet hops another,
Interleave and silent no longer smother.
Hop, hop — the task output’s serene!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: separating task output style from verbosity.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 9, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR decouples task output style (prefix/interleave/keep-order/replacing/timed) from verbosity (quiet/silent) and adds a per-task output field that can override the global task.output setting, including escaping a global task.output = \"silent\". It also fixes several output(None) call-sites that previously ignored per-task style.

  • OutputHandler::output() now returns style-only and never returns Quiet; the full_silent short-circuit correctly excludes the global task.output = \"silent\" value so a per-task override can escape it.
  • task_timings() takes Option<&Task> and guards the default path with !quiet(task), preventing timing lines from leaking under --quiet.
  • style_with_raw correctly guards against un-silencing a Silent value when raw = true.

Confidence Score: 3/5

The stream-routing decoupling is sound, but the metadata-suppression path is not fully consistent with the documented per-task override semantics when a global task.output = silent is in effect.

silent_bool() still checks Settings::get().task.output.is_some_and(|o| o.is_silent()), so when global task.output = silent is set and a task overrides with output = prefix, quiet(Some(task)) returns true via silent_bool(). This causes command-echo and timing lines to remain suppressed even though the task opted into prefix style. E2E test (f) only checks that the task stdout appears, so this gap passes CI.

src/task/task_output_handler.rs — specifically silent_bool() at line 333 and how it feeds into quiet() for per-task context when a global task.output = silent is in effect.

Important Files Changed

Filename Overview
src/task/task_output_handler.rs Core of the decoupling: output() correctly excludes global task.output = "silent" from full_silent, but silent_bool() still includes it, causing quiet(Some(task)) to return true for a task with output = "prefix" overriding a global task.output = "silent" — suppressing command echo and timing lines that should be visible in prefix mode.
src/task/task_output.rs Adds style_only and style_with_raw helpers; style_with_raw correctly guards against un-silencing a Silent value, addressing the previously raised concern.
src/task/task_executor.rs task_timings() now takes Option<&Task> and uses per-task output()/quiet(), correctly suppressing timing under --quiet and honoring per-task style overrides.
src/task/mod.rs Adds output: Option<TaskOutput> field with proper serde, parse, merge, and default; includes a test fixture for the #MISE output="prefix" header parser.
src/cli/run.rs Fixes on_task_finished gate to use output(Some(&task)) for per-task keep-order; spawns timed-output ticker when any task resolves to Timed style.
src/task/task_results_display.rs Removes the output(None) != KeepOrder guard from display_keep_order_output; flush_all() is a no-op when buffers are empty, so unconditional call is safe.
e2e/tasks/test_task_output_style_decoupling Good coverage of new axes. Test (f) checks task output but misses command echo and timing for the global-silent+per-task-prefix combination.
schema/mise-task.json Adds the output enum field to the task JSON schema matching TaskOutput values.
docs/tasks/task-configuration.md Documents per-task output field and style/verbosity decoupling correctly.

Reviews (7): Last reviewed commit: "fix(task): honor per-task keep-order/tim..." | Re-trigger Greptile

Comment thread src/task/task_output.rs Resolved
@JamBalaya56562
JamBalaya56562 force-pushed the feat/task-output-decouple branch from b8a5589 to bf74a00 Compare July 9, 2026 06:29

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
src/task/mod.rs (1)

806-808: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider propagating deserialization errors for the output field.

Invalid values like output = "prefxi" are silently swallowed by .ok() and fall back to the global setting with no diagnostic. This matches the existing silent pattern (lines 802–804) but is inconsistent with confirm (lines 781–787) which returns a clear error. Since output is a new field, this is a good opportunity to improve UX.

♻️ Optional refactor: propagate parse errors
 task.output = p
     .get_raw("output")
-    .and_then(|v| TaskOutput::deserialize(v.clone()).ok());
+    .map(|v| {
+        TaskOutput::deserialize(v.clone())
+            .map_err(|e| eyre!("failed to parse output field in task header: {e}"))
+    })
+    .transpose()?;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/task/mod.rs` around lines 806 - 808, Propagate parsing failures for the
new output field instead of swallowing them in task assignment. In the code that
sets task.output via TaskOutput::deserialize, handle the error path explicitly
and return a clear diagnostic like the confirm field logic does, so invalid
values do not silently fall back to the global setting. Update the task parsing
flow in the task mod implementation to keep the existing silent behavior only
where intended and make output validation fail fast with a useful error.
e2e/tasks/test_task_output_style_decoupling (1)

56-65: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider adding test coverage for --output quiet and global task.output = "silent".

The test suite covers the key decoupling scenarios well. Two gaps worth considering:

  1. --output quiet CLI flag — the recommended replacement for old --quiet behavior (line 24 of running-tasks.md). No test verifies it produces un-prefixed output with suppressed mise messages.
  2. Global task.output = "silent" + raw task — this is the edge case where style_with_raw(Silent, true) may return Interleave instead of Silent (see comment on task_output.rs). A test here would catch the regression.
🧪 Suggested additional test cases
# (f) --output quiet produces un-prefixed output with suppressed mise messages
cat <<EOF >mise.toml
[tasks.hello]
run = 'echo "hello world"'
EOF
assert_not_contains "mise run --output quiet hello 2>&1" "[hello] hello world"
assert_contains "mise run --output quiet hello 2>&1" "hello world"
assert_not_contains "mise run --output quiet hello 2>&1" '$ echo'

# (g) global task.output = "silent" + raw task -> still silent
cat <<EOF >mise.toml
[settings]
task.output = "silent"
[tasks.rawed]
run = 'echo "should not appear"'
raw = true
EOF
assert_empty "mise run rawed 2>&1"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@e2e/tasks/test_task_output_style_decoupling` around lines 56 - 65, Add
coverage for the missing task output decoupling cases in the task output tests:
extend the existing task output style test around the relevant shell assertions
to verify `mise run --output quiet` emits un-prefixed task output while
suppressing mise command echoes, and add a separate case for `task.output =
"silent"` with a raw task to ensure the output stays fully silent. Use the
existing task-run test helpers and the `task.output` / `raw` task setup so the
new cases exercise the same behavior paths as the current `style_with_raw` and
`output quiet` handling.
settings.toml (1)

2497-2517: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Doc update reads well and accurately reflects the style/verbosity decoupling.

Minor: the replacing entry has a typo — "printed-this" should be "printed - this" or "printed. This".

✏️ Typo fix
-  { value = "replacing", description = "replace stdout each time a line is printed-this uses similar logic as `mise install`" },
+  { value = "replacing", description = "replace stdout each time a line is printed - this uses similar logic as `mise install`" },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@settings.toml` around lines 2497 - 2517, Fix the typo in the task output docs
enum entry for task.output so the `replacing` description reads naturally;
update the description in the `task.output` enum to change “printed-this” to a
proper sentence break such as “printed - this” or “printed. This”, keeping the
rest of the wording unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@e2e/tasks/test_task_output_style_decoupling`:
- Around line 56-65: Add coverage for the missing task output decoupling cases
in the task output tests: extend the existing task output style test around the
relevant shell assertions to verify `mise run --output quiet` emits un-prefixed
task output while suppressing mise command echoes, and add a separate case for
`task.output = "silent"` with a raw task to ensure the output stays fully
silent. Use the existing task-run test helpers and the `task.output` / `raw`
task setup so the new cases exercise the same behavior paths as the current
`style_with_raw` and `output quiet` handling.

In `@settings.toml`:
- Around line 2497-2517: Fix the typo in the task output docs enum entry for
task.output so the `replacing` description reads naturally; update the
description in the `task.output` enum to change “printed-this” to a proper
sentence break such as “printed - this” or “printed. This”, keeping the rest of
the wording unchanged.

In `@src/task/mod.rs`:
- Around line 806-808: Propagate parsing failures for the new output field
instead of swallowing them in task assignment. In the code that sets task.output
via TaskOutput::deserialize, handle the error path explicitly and return a clear
diagnostic like the confirm field logic does, so invalid values do not silently
fall back to the global setting. Update the task parsing flow in the task mod
implementation to keep the existing silent behavior only where intended and make
output validation fail fast with a useful error.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Central YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a54a9a9c-ffa6-4789-8329-39569c9f4ed7

📥 Commits

Reviewing files that changed from the base of the PR and between 81f2044 and b8a5589.

📒 Files selected for processing (10)
  • docs/tasks/running-tasks.md
  • docs/tasks/task-configuration.md
  • e2e/tasks/test_task_output_style_decoupling
  • schema/mise-task.json
  • schema/mise.json
  • settings.toml
  • src/task/mod.rs
  • src/task/task_executor.rs
  • src/task/task_output.rs
  • src/task/task_output_handler.rs

Comment thread src/task/task_output_handler.rs Resolved
@JamBalaya56562
JamBalaya56562 force-pushed the feat/task-output-decouple branch from bf74a00 to 5535ada Compare July 9, 2026 06:43
Comment thread src/task/task_executor.rs Resolved
@JamBalaya56562
JamBalaya56562 force-pushed the feat/task-output-decouple branch from 5535ada to 2e1ed9a Compare July 9, 2026 07:04
`task.output` now controls only the output *style* (prefix/interleave/
keep-order/replacing/timed); verbosity (quiet/silent) is a separate axis, so
the two combine — e.g. `output = "prefix"` + `quiet = true` keeps the
task-name prefixes while suppressing mise's own messages. Also adds a per-task
`output` field so an individual task can pick its own style.

BREAKING CHANGE: `--quiet` / `quiet = true` / `MISE_QUIET=1` no longer collapse
task output to un-prefixed interleave; they now preserve the resolved style
(prefix when jobs > 1). Use `--output quiet` / `-o interleave` for the old
un-prefixed behavior. The `task.output = "quiet"` / `"silent"` enum values are
unchanged.

Resolves jdx#4308

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@JamBalaya56562
JamBalaya56562 force-pushed the feat/task-output-decouple branch from 2e1ed9a to 3c365f6 Compare July 9, 2026 07:17
@jdx

jdx commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Thanks for putting this together. The direction makes sense to me: separating output style from quiet/silent is the right shape, and the docs/tests cover a lot of the intended behavior.

I do think this needs a small follow-up before merge because a couple of run-wide output gates still miss per-task output overrides:

  1. Per-task output = "keep-order" can drop buffered output. init_task() is task-aware, but task completion and final flushing still check output(None) == TaskOutput::KeepOrder instead of the task's effective output mode. With this config, b stays buffered and never prints for me:
[tasks.a]
run = 'sleep 0.2; echo A'
output = "keep-order"

[tasks.b]
run = 'echo B'
output = "keep-order"
mise run a ::: b

Observed output was only task a.

  1. Per-task output = "timed" queues stdout into timed_outputs, but the background printer is only spawned when the run-wide output(None) is Timed. So a task-level timed override can suppress stdout entirely:
[tasks.slow]
run = 'echo first; sleep 1.2; echo second; sleep 1.2'
output = "timed"
mise run slow

Observed output had the command/timing metadata, but none of the timed stdout lines.

I verified the PR builds locally with mise run build. I think the fix is probably to make the keep-order completion/flush and timed-printer setup task-aware, or to reject/document that those two styles are not valid per-task overrides.

This comment was generated by an AI coding assistant.

JamBalaya56562 and others added 2 commits July 10, 2026 08:33
…de gates

Run-wide output gates resolved the mode via output(None) (global only)
instead of each task's effective mode, so a per-task output = "keep-order"
or output = "timed" override dropped that task's output:

- keep-order task completion (src/cli/run.rs) and the final flush safety
  net (src/task/task_results_display.rs) now use the task's effective mode
  / flush unconditionally.
- the timed background printer now spawns when any task resolves to Timed,
  not only when the run-wide default is Timed.

Adds e2e coverage for both per-task overrides.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@JamBalaya56562

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review — both were real bugs. Pushed a fix in cb6665c.

The root cause was exactly what you diagnosed: a few run-wide gates resolved the mode via output(None) (global only) instead of each task's effective mode, so per-task keep-order/timed overrides got dropped. Following your suggestion, I made those gates task-aware rather than rejecting the overrides:

  1. keep-order — task completion (src/cli/run.rs): the on_task_finished gate now uses oh.output(Some(&task)) instead of oh.output(None), so a per-task keep-order task gets flushed/promoted on completion.
  2. keep-order — final flush (src/task/task_results_display.rs): display_keep_order_output has no task context, so it now calls flush_all() unconditionally (it's a no-op when nothing was buffered, and buffers only ever receive already-task-aware keep-order output), draining any still-buffered per-task keep-order tasks.
  3. timed — printer spawn (src/cli/run.rs): the background printer now spawns when any task resolves to Timed (tasks.all().any(|t| self.output(Some(t)) == Timed)), not only when the run-wide default is Timed. This strictly widens the previous condition.

I verified both of your repros now behave correctly:

  • output = "keep-order" on a/b → mise run a ::: b prints both A and B.
  • output = "timed" on slow → mise run slow prints the timed stdout lines.

I also extended e2e/tasks/test_task_output_style_decoupling with two cases (h and i) mirroring your repros to guard against regressions. Docs already list keep-order/timed as valid per-task output values, so no doc change was needed — this fix just makes that accurate.

Note: I couldn't run cargo build locally (memory-constrained sandbox — same OOM situation as the original PR), so I'm relying on CI to confirm compilation and the e2e sweep.

This comment was generated by an AI coding assistant.

@jdx
jdx merged commit 5d48f40 into jdx:main Jul 12, 2026
34 checks passed
@JamBalaya56562
JamBalaya56562 deleted the feat/task-output-decouple branch July 12, 2026 02:13
jdx added a commit that referenced this pull request Sep 27, 2026
… again (#13718)

`mise run --no-timings` is documented to "hide the elapsed time printed
after each task completes", but since v2025.11.2 it has only hidden the
run's total. Each task still printed its own timing line (mise
2026.9.12):

```console
$ mise run --no-timings a ::: b
[a] $ echo a-out
[b] $ echo b-out
[b] b-out
[a] a-out
[b] Finished in 1.6ms
[a] Finished in 1.8ms
```

With this fix, `--no-timings` hides both kinds of timing line again:

```console
$ mise run --no-timings a ::: b
[b] $ echo b-out
[a] $ echo a-out
[a] a-out
[b] b-out
```

`--no-timings` also overrides `MISE_TASK_TIMINGS=1` and the hidden
`--timings` flag, as it did before the regression, and nested `mise run`
calls inside a task get `MISE_TASK_TIMINGS=0` even when both flags are
passed. `MISE_TASK_TIMINGS=0` is unchanged: it hides the per-task lines
and keeps the run's total, which #5175 made deliberate.

## Cause

When the executor was split out of `run.rs` (#6852), the per-task gate
went from `self.timings() && …` to `self.timings || …`. `timings()` is
the method that checks `--no-timings` and `--quiet`; `timings` is the
field that holds the `--timings` flag. `--quiet` was wired back in by
#10885, but `--no-timings` never reached the executor. This PR passes it
through and checks it first.

## Testing

`e2e/tasks/test_task_no_timings` covers the parallel run with and
without `--no-timings`, `--no-timings` against `MISE_TASK_TIMINGS=1` and
`--timings` (directly and through a nested `mise run`), and
`MISE_TASK_TIMINGS=0` keeping the total. Each `--no-timings` assertion
fails without the matching executor change. The existing output-style,
raw-output and keep-order task e2e tests pass. A manual comparison
across `-j 8` and `-j 1`, `a ::: b` and a `depends` task, and each
`MISE_TASK_TIMINGS` value changed only the `--no-timings` cases.

*AI-assisted — Tool: Claude Code; model: anthropic/claude-opus-5-5;
version: 2.1.281.*

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Narrow CLI-to-executor wiring and output gating for task timing lines;
covered by new e2e tests with no security or data-handling impact.
> 
> **Overview**
> **`mise run --no-timings`** again suppresses each task’s **“Finished
in …”** line (not only the run total), matching documented behavior
after the task executor split stopped honoring the flag.
> 
> The CLI **`no_timings`** value is passed into **`TaskExecutorConfig`**
/ **`TaskExecutor`**. **`task_timings()`** returns false when
**`no_timings`** is set, so it overrides **`--timings`**,
**`MISE_TASK_TIMINGS=1`**, and per-task timing defaults—including for
nested **`mise run`** via **`MISE_TASK_TIMINGS=0`** in the child env.
**`MISE_TASK_TIMINGS=0`** behavior (hide per-task lines, keep run total)
is unchanged.
> 
> Adds e2e **`e2e/tasks/test_task_no_timings`** for parallel runs,
flag/env precedence, nested tasks, and **`MISE_TASK_TIMINGS=0`**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
d8f9dd6. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants