Copyright (c) 2026 MindMesh Academy. All rights reserved. This content is proprietary and may not be reproduced or distributed without permission.
2.4. Reflection Checkpoint
Key Takeaways
- Triggers are three decisions at once: which event (plus activity types and branch/path filters), how much authority (
permissions:— declaring any scope revokes the rest), and how many concurrent runs (concurrency:with or withoutcancel-in-progress). workflow_dispatchinputs supportstring/boolean/choice/environment;workflow_callinputs support onlystring/number/boolean, and secrets must be mapped explicitly or withsecrets: inherit. A reusable workflow is called by a job, never a step.- Jobs run in parallel until
needs:orders them; failure skips downstream jobs unless you override withalways()/failure()/cancelled()andneeds.<job>.result. fail-fastdefaults to true;includeadds variables or whole combinations whileexcluderemoves them; matrices cap at 256 jobs.- Anchors and aliases are parser-level and single-file only. Contexts are the run's data model, and
${{ }}is substituted before the shell runs — the root of both static-vs-runtime evaluation and script injection. - Persistence is deliberate:
$GITHUB_ENV/$GITHUB_OUTPUTbetween steps, joboutputs(strings, secret-redacted) between jobs, artifacts for files (immutable in v4, 90-day default retention), and caches purely as an evictable optimization.
Connecting Forward
Phase 3 lifts every one of these decisions from a single repository to an entire organization: who is allowed to use which actions, which runners the work lands on and who may reach them, and how secrets and variables are scoped, layered, and rotated across org, repository, and environment.
Self-Check Questions
- A workflow sets
permissions: {packages: write}to publish a container, and its previously workinggit pushstep now fails with 403. Explain the mechanism and give the fix in one line. - Distinguish, precisely, when you would reach for a YAML anchor, a composite action, and a reusable workflow — using "how far must this reuse travel?" as your organizing question.
- A matrix job writes
steps.meta.outputs.shaand sets it as a job output; a downstream job readsneeds.build.outputs.shaand gets an unpredictable value. What is happening, and what's the correct pattern?
Written byAlvin Varughese
Founder•18 professional certifications