Challenge 2: Identify run vs uses — Possible Solution ==================================================================== (a) actions/checkout@v4 -> uses: This is a reference to a specific, versioned, reusable ACTION from the marketplace (per this chapter's own table listing actions/checkout as the action that "pulls the repo's code onto the runner") — it's not a shell command being executed directly, it's invoking prebuilt, community-maintained functionality by name and version. (b) npm run build -> run: This is a direct SHELL COMMAND — exactly matching the chapter's definition of run: steps as executing "a shell command directly." npm run build isn't a marketplace action reference at all; it's literally the command a developer would type in their own terminal, just running on the CI runner instead. (c) actions/setup-python@v5 -> uses: Like (a), this is a reference to a specific, versioned marketplace action — the chapter's own table lists setup-python alongside setup-node and setup-go as actions that "install a specific language runtime version." The @v5 version pin is itself a strong signal this is a uses: reference, since run: shell commands don't have this kind of action-version syntax at all. WHY THIS WORKS AS AN ANALYSIS -------------------------------- The reliable test across all three: does this look like "org/action- name@version" (a reference to prebuilt, reusable, versioned functionality)? If so, it's uses:. Does it look like a command someone would type directly into a terminal? If so, it's run:. (a) and (c) both clearly match the org/action-name@version shape; (b) is unmistakably a plain shell command with no such reference syntax at all.