# Out of scope (/docs/out-of-scope)



## Why document non-goals? [#why-document-non-goals]

Four waves of community research (community discussions, `actions/runner` issues,
Reddit/SO, competitor authoring, and `github/customer-feedback` enterprise intake)
surfaced a recurring set of **high-demand GitHub Actions asks that a compile-time
transpiler structurally cannot solve**. Actio is a [build-time compiler with no
runtime](/docs/architecture): it can't touch the platform or see values that only
exist while a run is executing.

This page is a reference so we (and contributors) stop re-litigating these, can
answer "why doesn't Actio just…", and have honest talking points. Each item below is
grouped by the **structural root cause**, with a representative high-demand issue
linked.

<Callout title="Rule of thumb">
  If the answer depends on a value that exists **only at runtime**, or on **how GitHub
  stores/scopes/renders** something, Actio can't synthesize it. If it's authoring
  ergonomics over a **compile-time-known** value, it's in scope.
</Callout>

## 1. Runtime graph mutation [#1-runtime-graph-mutation]

The job graph is fixed when the workflow is parsed. You can't add/remove/reorder jobs
or edges based on values computed during the run.

<Accordions type="single">
  <Accordion title="High-demand asks (3)">
    * [github/customer-feedback#8205](https://github.com/github/customer-feedback/issues/8205) — dynamic `needs:` values
    * [github/customer-feedback#3758](https://github.com/github/customer-feedback/issues/3758) — fully dynamic workflows/jobs (runtime subset)
    * [community #73156](https://github.com/orgs/community/discussions/73156) — restart an individual failed job *while the workflow is still running*
  </Accordion>
</Accordions>

**Why not:*&#x2A; these mutate the DAG from runtime state. Actio only knows the DAG at
compile time. &#x2A;(Compile-time-known fan-out IS in scope — see edge cases.)*

## 2. Platform security / secrets / identity [#2-platform-security--secrets--identity]

Secret storage, scoping, environments, branch protection, and marketplace trust live
in the GitHub platform, not in YAML.

<Accordions type="single">
  <Accordion title="High-demand asks (3)">
    * [community #15379](https://github.com/orgs/community/discussions/15379) — org-wide environments & environment secrets
    * [community #13836](https://github.com/orgs/community/discussions/13836) — bypass/relax branch protection from a workflow
    * Marketplace-trust half of the pin ask (the *authoring* half ships separately, see [#96](https://github.com/austenstone/actio/issues/96))
  </Accordion>
</Accordions>

**Why not:** no amount of generated YAML changes where GitHub keeps secrets or
enforces protection.

## 3. UI / run-experience rendering [#3-ui--run-experience-rendering]

How runs, jobs, and the Actions tab render is platform UI. YAML can't restyle it.

<Accordions type="single">
  <Accordion title="High-demand asks (4)">
    * [github/customer-feedback#5584](https://github.com/github/customer-feedback/issues/5584) — hide non-running (skipped) jobs from the run graph
    * [community #18001](https://github.com/orgs/community/discussions/18001) — hide jobs in the UI when their `if:` is false
    * [community #26256](https://github.com/orgs/community/discussions/26256) — delete/hide old or renamed workflows
    * [community #12025](https://github.com/orgs/community/discussions/12025) — mark reusable workflows as templates / hide from the Actions tab
  </Accordion>
</Accordions>

**Why not:** runtime-`if&#x60; skipping and tab rendering are UI behaviors.
&#x2A;(Compile-time-known skips ARE in scope via [`static-if`](/docs/macros/static-if) —
see edge cases.)*

## 4. Runtime expression / context availability [#4-runtime-expression--context-availability]

Some contexts and fields just aren't populated where users want them, at runtime.

<Accordions type="single">
  <Accordion title="High-demand asks (3)">
    * [actions/runner#480](https://github.com/actions/runner/issues/480) + [#2372](https://github.com/actions/runner/issues/2372) — workflow-level `env` not usable in all fields
    * [community #8945](https://github.com/orgs/community/discussions/8945) — expose `job_id` in the `github` context
    * [actions/runner#1483](https://github.com/actions/runner/issues/1483) — boolean inputs aren't actually booleans at runtime
  </Accordion>
</Accordions>

**Why not:*&#x2A; when the value is runtime-input-driven, Actio can't inline it. &#x2A;(When the
value is compile-time-known, [`{{ params }}`](/docs/macros/params) already inlines it
into `runs-on:`/`with:`/`if:` where `${{ env }}` is rejected — see edge cases.)*

## 5. Concurrency / scheduling semantics [#5-concurrency--scheduling-semantics]

The scheduler decides queueing, cancellation, and conclusions at runtime.

<Accordions type="single">
  <Accordion title="High-demand asks (3)">
    * [community #12835](https://github.com/orgs/community/discussions/12835) — concurrency: queue *all* jobs in a group (don't cancel)
    * [actions/runner#662](https://github.com/actions/runner/issues/662) — command to early-exit a job and set its conclusion
    * [actions/runner#2347](https://github.com/actions/runner/issues/2347) — `allow-failure` for a given job
  </Accordion>
</Accordions>

**Why not:** these are runtime scheduler behaviors. Generated YAML can't change how
the queue/conclusion engine works.

## 6. Native-now — explicit non-goals (don't build) [#6-native-now--explicit-non-goals-dont-build]

GitHub shipped these (or close enough). Building macros for them would be redundant
churn.

* [actions/runner#409](https://github.com/actions/runner/issues/409) — ternary / conditional operator → now native (`${{ ... && ... || ... }}`, and a real conditional landing). Don't add expr-ternary sugar.
* [actions/runner#1182](https://github.com/actions/runner/issues/1182): YAML anchors shipped ([changelog, 2025-09-18](https://github.blog/changelog/2025-09-18-actions-yaml-anchors-and-non-public-workflow-templates/)). Actio now flattens a `- *alias` whose anchor is a step list into the surrounding steps, so native [`_anchors:`](/docs/syntax#_anchors) + `- *alias` cover same-file, no-param step reuse. That makes [`fragments`](/docs/macros/fragments) redundant for that case, so it is **deprecated** (still compiles, warning only). What anchors still can't do: take typed params or cross files. Those stay with [`templates:`](/docs/syntax#templates) + `inject ... with` and cross-file `inject: ./lib#name`. Merge keys remain unshipped upstream ([request #185877](https://github.com/orgs/community/discussions/185877)); Actio accepts the 1.1 merge key (`<<:`) in source and erases it on emit, with an opt-in [`strict`](/docs/configuration#strict-yaml-122-source) lint for pure-1.2.2 source.

## Edge cases — the compile-time subset IS in scope [#edge-cases--the-compile-time-subset-is-in-scope]

The line isn't the topic, it's *when the value is known*. Where a runtime limitation
has a compile-time-known slice, Actio already (or should) cover it:

* **Skipping jobs** → runtime UI hide = platform; **compile-time-known** drop = [`static-if`](/docs/macros/static-if) ✅
* **`env` in disallowed fields** → runtime `${{ env }}` = platform; **compile-time literal** = [`{{ params }}`](/docs/macros/params) interpolation ✅
* **Per-leg matrix `needs`** → runtime `fromJSON` matrix = platform; **compile-time-known** matrix = `expand_matrix:` ([#97](https://github.com/austenstone/actio/issues/97))
* **Typed/validated inputs** → runtime coercion = platform; **compile-time** typing = [`params`](/docs/macros/params) ✅

If a future ask lands on the compile-time side of one of these lines, it's a
candidate — file it. Everything above stays out of scope by design.


## Sitemap

Browse the full documentation: [Markdown sitemap](https://austenstone.github.io/actio/sitemap.md) · [XML sitemap](https://austenstone.github.io/actio/sitemap.xml)