Skip to content

fix(task): require trust for remote metadata - #11113

Closed
risu729 wants to merge 2 commits into
jdx:mainfrom
risu729:codex-20260719-024652-270e93
Closed

risu729 wants to merge 2 commits into
jdx:mainfrom
risu729:codex-20260719-024652-270e93

Conversation

@risu729

@risu729 risu729 commented Jul 18, 2026 •

Copy link
Copy Markdown
Contributor

Work order

  1. fix(task): preserve Git task snapshots #12000 — preserve Git task snapshots and establish the Git artifact lifecycle layer
  2. fix(task): require trust for remote metadata #11113 — enforce remote-task trust, metadata provenance, and Git checkout containment on that foundation
  3. fix(task): harden remote task cache lifecycle #11203 — harden the remaining HTTP/cache lifecycle behavior

Prerequisite #11222 is merged. This branch is rebased directly onto #12000's head commit; GitHub still displays main as the base because the stack branches live in a fork.

Summary

  • require trust in the defining config before passive commands fetch remote tasks, including safe-mode discovery and remote Git task includes
  • require trust before decoded remote templates, side-effectful env directives (file, source, modules, and Python venvs), or remote tool metadata can execute, resolve, activate, or install anything
  • preserve defining-config provenance through explicitly included and nested remote task files
  • resolve aliases and visibility supplied by remote #MISE headers consistently across run, bare dispatch, info, dependency, dynamic, and listing paths
  • keep remote env paths relative to the fetched script while attributing trust to the local config that selected it
  • reject traversal, Windows absolute/backslash paths, and symlink escapes from remote Git checkouts for both task files and Git includes
  • rely on fix(task): preserve Git task snapshots #12000 for task-owned no-cache snapshots so the body executed is the same body whose metadata selected it

Root cause

#11111 began parsing remote task headers during discovery. That made remote templates, tools, environment directives, aliases, and visibility active metadata, but the remote task path did not consistently retain or enforce the trust of the local config that selected it. Passive discovery could also perform HTTP or Git work before trust, including in safe mode.

Remote Git paths also needed a shared containment check after checkout canonicalization; parser-only traversal checks do not prevent an intermediate symlink from escaping the artifact root.

Broader cache publication, locking, cleanup policy, retention, and cache-key hardening remain intentionally separate in #11203.

Validation

  • mise run lint-fix
  • cargo check --locked
  • focused unit tests for task fetching, remote source parsing, Git path containment, and env directives
  • mise run test:e2e e2e/tasks/test_task_remote_metadata_trust
  • mise run test:e2e e2e/tasks/test_task_remote_git_includes

Follow-up to #11111.

AI-assisted — Tool: Codex; model: unavailable/unavailable; version: unavailable.

@coderabbitai

coderabbitai Bot commented Jul 18, 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

Remote task resolution now enforces defining-config trust, preserves metadata provenance, gates remote tool installation, and isolates uncached HTTP and Git artifacts. CLI paths, fixtures, and end-to-end tests cover trusted, untrusted, mutable, and nested remote task flows.

Changes

Remote task trust

Layer / File(s) Summary
Trust-aware remote task fetching
src/task/mod.rs, src/task/task_fetcher.rs, src/config/env_directive/mod.rs, src/task/task_context_builder.rs, src/task/deps.rs, src/cli/...
Remote tasks retain defining configuration sources, validate trust before fetching and rendering, and reuse prefetched metadata for help and display commands.
Isolated remote artifacts
src/task/task_file_providers/*, src/config/mod.rs
Cached downloads reuse locked destinations, while uncached HTTP and Git downloads receive unique temporary artifacts whose cleanup is propagated to loaded tasks.
Trusted remote tool installation
src/task/task_tool_installer.rs
Automatic tool installation validates remote metadata provenance and configuration trust before collecting tools.
End-to-end remote coverage
e2e/helpers/scripts/*, e2e/tasks/*
Fixtures and tests cover trust failures, trusted execution, deferred templates, tools, mutable responses, nested includes, and artifact cleanup.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant TaskCommand
  participant TaskFetcher
  participant TrustCheck
  participant RemoteSource
  participant ToolInstaller

  TaskCommand->>TaskFetcher: Resolve remote task metadata
  TaskFetcher->>TrustCheck: Validate defining config
  TrustCheck-->>TaskFetcher: Trust result
  TaskFetcher->>RemoteSource: Fetch and parse remote metadata
  RemoteSource-->>TaskFetcher: Task body and tool metadata
  TaskFetcher-->>TaskCommand: Return resolved task
  TaskCommand->>ToolInstaller: Process remote tool requirements
  ToolInstaller->>TrustCheck: Validate metadata provenance
Loading

Possibly related PRs

  • jdx/mise#11111: Both changes modify remote task fetching and #MISE header metadata parsing.

Poem

I’m a rabbit guarding the task-file gate,
Trust the config before you fetch its fate.
Unique paths keep revisions apart,
Tools wait till trust warms the heart.
Hop, hop—clean metadata flows!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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: requiring trust before handling remote task metadata.

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 18, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR enforces trust for every side-effectful operation a remote task can trigger: Tera template rendering, file/source/venv/module env directives, and tool-metadata resolution. It also gives no-cache fetches per-task RAII snapshots so the body that established metadata (aliases, tool requirements, visibility) is identical to the body that executes.

  • Trust enforcement: trust_check_remote_fetch correctly gates remote network/Git work even in safe mode (where the base trust_check returns Ok unconditionally), closing a passive-discovery SSRF bypass. remote_config_source threads the defining config's provenance through fetch, rendering, and env-resolution so trust is evaluated against the declaring config rather than the cached path.
  • Per-fetch snapshots: TaskFileArtifact with Arc<TaskFileArtifactCleanup> gives each no-cache task its own temporary clone/download; the RAII guard ensures cleanup when the last Task clone holding it is dropped. The static task cache is bypassed in no-cache mode to prevent guards from being captured indefinitely.
  • Alias/dependency retry: A new TaskNotFoundError type lets resolve_depends and task-list lookup retry against trusted remote metadata only on a miss, avoiding a full remote fetch for every ordinary name hit.

Confidence Score: 5/5

All trust-enforcement paths are correctly gated; the RAII snapshot mechanism is sound; the retry logic for remote aliases is well-scoped. No blocking issues were found.

The core security invariants — safe-mode SSRF prevention, passive-discovery trust gating, per-fetch snapshot isolation — are each verified by dedicated e2e or unit tests. The logic in trust_check_remote_fetch correctly accounts for safe mode's unconditional trust_check bypass. The three observations are minor design questions that do not affect correctness or security of the current code paths.

Files Needing Attention: No files require special attention beyond the three minor observations noted in the comments.

Important Files Changed

Filename Overview
src/config/config_file/mod.rs Adds trust_check_remote_fetch which correctly guards remote fetches even in safe mode (where trust_check returns Ok unconditionally), preventing an SSRF-capable bypass.
src/config/env_directive/mod.rs Adds requires_remote_trust() to classify side-effectful directives; adds trust_source to EnvResults so remote task headers use the defining config's trust rather than the cached path; venv trust check migrated to use trust_check_source.
src/config/mod.rs Tracks defining-config provenance through cascaded task config and preserves it via preserve_remote_task_trust_source; bypasses the task cache in no-cache mode to prevent cleanup guards leaking into the static cache.
src/task/task_fetcher.rs Adds trust_before_fetch gate, per-fetch snapshot support via TaskFileArtifact, deferred-template detection before rendering, and fetch_task_map helper for alias retry patterns.
src/task/task_file_providers/mod.rs Introduces TaskFileArtifact with RAII cleanup via Arc<TaskFileArtifactCleanup>; providers override get_local_artifact to return unique temporary snapshots for no-cache mode.
src/task/task_file_providers/remote_task_git.rs Refactors to fetch_to_destination helper; get_local_artifact creates unique temp directories via unique_destination for no-cache mode, with RAII cleanup on drop.
src/task/task_file_providers/remote_task_http.rs Adds get_unique_artifact for no-cache downloads using NamedTempFile::keep; cleanup guard removes the file on drop.
src/task/mod.rs Adds remote_config_source, remote_metadata_has_tools, remote_artifact_cleanups fields; tool_args() enforces trust before exposing tool metadata; match_tasks_with_context now throws TaskNotFoundError for typed retry.
src/task/task_list.rs Adds prefetched-task path and remote-alias retry for task lookups; resolve_depends retries on TaskNotFoundError to resolve dependencies expressed as remote aliases.
src/cli/mod.rs Bare dispatch retries with trusted remote metadata on alias miss; carries prefetched snapshots into Run so execution reuses the same body that established the alias.
src/cli/run.rs Reuses prefetched task snapshots for both help display and execution; adds require_trust_before_fetch() to help-path fetch; avoids re-fetching when tasks were already resolved.
src/cli/tasks/deps.rs Resolves remote aliases before building dependency trees; skips fetching locally-hidden tasks to avoid unnecessary network work; uses Deps::new_for_display to require trust before fetch.
src/cli/tasks/ls.rs Moves sorting and secondary visibility filtering after fetch so remote hide=true metadata is applied before the task list is rendered.
e2e/tasks/test_task_remote_metadata_trust New comprehensive e2e test covering trust enforcement for templates, env directives, tool metadata, aliases, visibility, no-cache snapshot isolation, and safe-mode SSRF prevention.
e2e/helpers/scripts/http_test_server.py New test HTTP server serving dynamic endpoints for trust e2e tests; uses class-level revision counters to simulate mutable remote sources. Counter state is shared across all handler instances but the server is single-threaded, so no race.

Reviews (15): Last reviewed commit: "fix(task): address remote metadata revie..." | Re-trigger Greptile

@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.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/task/task_file_providers/remote_task_git.rs (1)

166-166: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

Prevent concurrent non-cached clone corruption.

tmp_destination is derived solely from cache_key. If multiple processes perform non-cached fetches for the same repository concurrently, they will all race to use and delete the exact same tmp_destination directory, corrupting the clone and failing the task.

Since destination is already unique for non-cached fetches (and correctly deterministic for cached ones), deriving tmp_destination from destination's filename guarantees uniqueness across concurrent non-cached requests and prevents the race condition.

🔒️ Proposed fix to isolate concurrent clone paths
-        let tmp_destination = self.storage_path.join(format!("{}.clone-tmp", &cache_key));
+        let tmp_destination = self.storage_path.join(format!(
+            "{}.clone-tmp",
+            destination.file_name().unwrap().to_string_lossy()
+        ));
🤖 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/task_file_providers/remote_task_git.rs` at line 166, Update the
temporary clone path construction near tmp_destination to derive its filename
from the already-unique destination path rather than solely from cache_key.
Preserve deterministic temporary paths for cached fetches while ensuring
concurrent non-cached requests receive distinct clone directories.
🤖 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.

Inline comments:
In `@src/task/task_file_providers/remote_task_http.rs`:
- Around line 76-77: Update the download flow in the method containing
self.download_file so it writes to a temporary path rather than the final
destination, then renames the completed temporary file to destination only after
a successful download. Ensure download failures or interruptions do not leave
destination or stale temporary files that can be treated as valid cache entries.

---

Outside diff comments:
In `@src/task/task_file_providers/remote_task_git.rs`:
- Line 166: Update the temporary clone path construction near tmp_destination to
derive its filename from the already-unique destination path rather than solely
from cache_key. Preserve deterministic temporary paths for cached fetches while
ensuring concurrent non-cached requests receive distinct clone directories.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Pro Plus

Run ID: 505b9bfa-a87b-4a27-8bd3-73dd9759d6ba

📥 Commits

Reviewing files that changed from the base of the PR and between d1710dd and 219fe05.

📒 Files selected for processing (12)
  • e2e/helpers/scripts/git_http_backend_server.py
  • e2e/helpers/scripts/http_test_server.py
  • e2e/tasks/test_task_remote_git_includes
  • e2e/tasks/test_task_remote_metadata_trust
  • src/cli/tasks/info.rs
  • src/cli/tasks/ls.rs
  • src/cli/tasks/validate.rs
  • src/task/mod.rs
  • src/task/task_fetcher.rs
  • src/task/task_file_providers/remote_task_git.rs
  • src/task/task_file_providers/remote_task_http.rs
  • src/task/task_tool_installer.rs
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/task/mod.rs
  • src/task/task_tool_installer.rs
  • src/task/task_fetcher.rs

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/task/task_file_providers/remote_task_http.rs (1)

122-124: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Use atomic download for un-cached paths to prevent cache corruption and concurrent read errors.

When cache mode is disabled, get_local_path still overwrites the shared destination directly (the exact same path used by cached runs). If an un-cached download fails or is interrupted, a partial file is left on disk. A subsequent run with cache enabled will mistakenly treat this partial file as a valid cache hit, reintroducing the cache corruption issue. Furthermore, direct overwriting can cause crashes or access-denied errors for any concurrent readers.

Use download_file_atomically here to safely replace the file and automatically clean up on failure.

🛠️ Proposed fix
         let _lock = LockFile::new(&destination).lock()?;
-        self.download_file(file, &destination).await?;
+        self.download_file_atomically(file, &destination).await?;
         Ok(destination)
🤖 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/task_file_providers/remote_task_http.rs` around lines 122 - 124,
Replace the direct self.download_file call in get_local_path with
download_file_atomically, preserving the existing destination and lock flow.
Ensure failed or interrupted uncached downloads clean up temporary data and
readers never observe a partially written file.
🧹 Nitpick comments (2)
src/task/task_file_providers/remote_task_http.rs (2)

159-160: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Rename the test to reflect its actual assertions.

This test was updated to call get_local_artifact and verify unique artifact generation, but the test name still refers to get_local_path. Consider renaming it to match the tested behavior.

📝 Proposed fix
     #[tokio::test]
-    async fn test_http_remote_task_get_local_path_without_cache() {
+    async fn test_http_remote_task_get_local_artifact_without_cache() {
🤖 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/task_file_providers/remote_task_http.rs` around lines 159 - 160,
Rename the test function test_http_remote_task_get_local_path_without_cache to
reflect that it calls get_local_artifact and verifies unique artifact
generation, while leaving its assertions and behavior unchanged.

86-87: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Remove the remove_file call. download_file already stages through a temp file and persists to the target path, so deleting the reserved path first only adds a TOCTOU window.

🤖 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/task_file_providers/remote_task_http.rs` around lines 86 - 87,
Remove the file::remove_file call after temp_file.keep() in the download_file
flow, while retaining the destination extraction and subsequent processing. Rely
on download_file’s existing temp-file staging and persistence without deleting
the reserved target path.
🤖 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.

Outside diff comments:
In `@src/task/task_file_providers/remote_task_http.rs`:
- Around line 122-124: Replace the direct self.download_file call in
get_local_path with download_file_atomically, preserving the existing
destination and lock flow. Ensure failed or interrupted uncached downloads clean
up temporary data and readers never observe a partially written file.

---

Nitpick comments:
In `@src/task/task_file_providers/remote_task_http.rs`:
- Around line 159-160: Rename the test function
test_http_remote_task_get_local_path_without_cache to reflect that it calls
get_local_artifact and verifies unique artifact generation, while leaving its
assertions and behavior unchanged.
- Around line 86-87: Remove the file::remove_file call after temp_file.keep() in
the download_file flow, while retaining the destination extraction and
subsequent processing. Rely on download_file’s existing temp-file staging and
persistence without deleting the reserved target path.

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Pro Plus

Run ID: d9f82fda-540c-4cc6-894f-58fa141860fa

📥 Commits

Reviewing files that changed from the base of the PR and between b292d8e and 6bcbcf1.

📒 Files selected for processing (1)
  • src/task/task_file_providers/remote_task_http.rs

@github-actions

Copy link
Copy Markdown
Contributor

This PR currently has failing checks. If this continues for 7 days, it will be closed automatically.

This is warning day 1 of 7.

Please update the PR when you have a chance. Feel free to reopen or create a new PR if it is closed and you'd like to continue working on it.

This comment was generated by an automated workflow.

@github-actions

Copy link
Copy Markdown
Contributor

This PR currently has failing checks. If this continues for 7 days, it will be closed automatically.

This is warning day 2 of 7.

Please update the PR when you have a chance. Feel free to reopen or create a new PR if it is closed and you'd like to continue working on it.

This comment was generated by an automated workflow.

@github-actions

Copy link
Copy Markdown
Contributor

This PR currently has failing checks. If this continues for 7 days, it will be closed automatically.

This is warning day 3 of 7.

Please update the PR when you have a chance. Feel free to reopen or create a new PR if it is closed and you'd like to continue working on it.

This comment was generated by an automated workflow.

@github-actions

Copy link
Copy Markdown
Contributor

This PR currently has merge conflicts. If this continues for 7 days, it will be closed automatically.

This is warning day 1 of 7.

Please update the PR when you have a chance. Feel free to reopen or create a new PR if it is closed and you'd like to continue working on it.

This comment was generated by an automated workflow.

@github-actions

Copy link
Copy Markdown
Contributor

This PR currently has merge conflicts. If this continues for 7 days, it will be closed automatically.

This is warning day 2 of 7.

Please update the PR when you have a chance. Feel free to reopen or create a new PR if it is closed and you'd like to continue working on it.

This comment was generated by an automated workflow.

@risu729
risu729 force-pushed the codex-20260719-024652-270e93 branch from b47964d to 7078147 Compare July 28, 2026 02:03
@github-actions

Copy link
Copy Markdown
Contributor

This PR currently has merge conflicts. If this continues for 7 days, it will be closed automatically.

This is warning day 1 of 7.

Please update the PR when you have a chance. Feel free to reopen or create a new PR if it is closed and you'd like to continue working on it.

This comment was generated by an automated workflow.

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

This PR currently has merge conflicts. If this continues for 7 days, it will be closed automatically.

This is warning day 6 of 7.

Please update the PR when you have a chance. Feel free to reopen or create a new PR if it is closed and you'd like to continue working on it.

This comment was generated by an automated workflow.

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

This PR has had merge conflicts for more than 7 days, so it is being closed automatically.

Feel free to reopen or create a new PR if you'd like to continue working on this.

This comment was generated by an automated workflow.

jdx pushed a commit that referenced this pull request Oct 14, 2026
…4416)

Listing the tasks of a directory you have not trusted could run a
command from a remote task file. A `mise.toml` that holds only `[tasks]`
loads without trust, so this is enough:

```toml
# mise.toml in a freshly cloned, untrusted repository
[tasks.build]
file = "https://example.com/build.sh"
```

```bash
#!/usr/bin/env bash
#MISE description="{{ exec(command='touch /tmp/PWNED') }}Build"
```

`mise tasks ls`, `mise tasks info build` and `mise tasks validate`
downloaded `build.sh` and rendered its `#MISE` headers, so `exec()` ran
with no trust prompt. The same template written in `mise.toml` itself,
or in a local task file such as `mise-tasks/build.sh`, is already
refused until the config is trusted.

A remote task file now follows the rule for local task includes. When
its `#MISE` headers contain template syntax, the config that names it
must be trusted before they render. In an untrusted directory, mise asks
to trust it, or fails with `Config files in … are not trusted` when it
cannot ask, and nothing renders. Only the headers are checked, because
only they render: braces elsewhere in the script, such as `docker ps
--format '{{.Names}}'`, need no trust. They are read the same way when a
`git::` file is named `*.toml`. A remote file with no template in its
headers still lists without trust, and a trusted config renders as
before. `mise run` keeps trusting the config it runs, as it does for
local tasks. Safe mode still waives trust, since `exec()` and
`read_file()` are disabled there.

#12202 (and #11113 before it) by @risu729 reported this and proposed a
wider rework of remote task metadata, which pr-closer closed. This is a
narrower fix built on main's existing trust check for task includes.
They are credited as co-author.

## Validation

- New `e2e/tasks/test_task_remote_http_trust`, with the remote files
served from a local HTTP server:
- In an untrusted directory, `mise tasks ls`, `mise tasks info` and
`mise tasks validate` each fail with `not trusted`, and the `exec()`
marker file is not created.
- A remote file whose headers have no template still lists without
trust, with `{{.Names}}` in its script body.
  - With the config trusted, a templated remote file renders.
- Unit test `test_header_checks_ignore_the_file_name`: an escaped
template in the header of a file named `evil.toml` needs trust (read as
a TOML document, the header is a comment), and a template in the script
body does not.
- On Linux, in a `rust:1` container, the test passes with this branch's
build. Run against the released 2026.10.8, the same test fails with
`remote task template executed by untrusted 'mise tasks ls'`.
- `cargo clippy --workspace --all-features --all-targets -- -D warnings`
passes.

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

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


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Security**
- Remote task files that require trust are checked before loading.
Untrusted files return a trust error when listed, inspected, or
validated, without creating a trust marker.
- Trust checks apply to remote task files with decoded templates or
secret declarations in their `#MISE` headers.
- **Bug Fixes**
- Remote task files with plain headers remain available without
requiring trust.
- Templated remote task descriptions render when the referencing
configuration is trusted.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Taku Kodama <79110363+risu729@users.noreply.github.com>
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.

1 participant