sgit newsroom v0.1.29 · snapshot 2026-09-24

Reading room · what-can-it-do.games.sgit.ai

On this page

Reading room / what-can-it-do.games.sgit.ai · raw text · live ↗

From what-can-it-do.games.sgit.ai, the page as fetched on 2026-09-25 · open the live page ↗Everything on this sheet is the source site's own text; the newsroom's chrome is outside it.

GitHub Actions — hosted runner

Actions runner (a hosted CI job): what it can reach, tool by tool, with the control on the path and the evidence behind each row.

Source: https://what-can-it-do.games.sgit.ai/map/grants/github/actions-runner/ci/index.html↗ · site v0.8.0 · this file is generated from the same content as the page, so the two cannot drift. Every page on this site has a .md twin; internal links below point at them.


Play↗ / The map↗ / The products↗ / GitHub Actions — hosted runner

Actions runner (a hosted CI job)

An ephemeral CI job with no agent, no hooks, and one platform-enforced grant: the workflow's permissions block. MEASURED on 26 August by measure.py inside the runner (the library's second entry), translated into findings on 5 September. Unrestricted egress; the token cannot write.

GitHub · surface ci · variant ci · profile version 2026-08-26 · reaches 8** of 23 capabilities, **3 of which cannot be undone. Edit this profile ↗ · the file ↗.

CapabilityUndoGitHub Actions (hosted runner)
filesystem — files and directories
Read the project it is working on read.file.projectyes●
Change the project it is working on write.file.projectwith-effort●
Read any file the account can reach read.file.hostno●
Change any file the account can reach write.file.hostwith-effort●
Delete files anywhere the account can reach delete.file.hostno●
Read a retained record: shell history, past sessions read.record.historyno·
process — programs and their execution
Run programs as the account execute.process.hostwith-effort●
Run programs inside its own sandbox only execute.process.selfyes·
network — endpoints and hosts
Reach a permitted list of hosts send.endpoint.allowedno·
Reach any host on the internet send.endpoint.worldno●
identity — credentials and who the agent can act as
Read credentials stored where it runs read.credential.hostno·
Act in accounts with the credentials it holds authenticate-as.credential.tenantno·
Change its own permission settings grant.credential.selfyes·
communication — messages to people
Send a message to anyone send.message.worldno·
Read mail or chat it is connected to read.message.tenantno·
code — repositories and what lands in them
Commit to the repository it was pointed at write.repository.projectwith-effort○
Push to a code host (any branch it can reach) write.repository.tenantwith-effort·
Sign commits with the key it holds authenticate-as.credential.signingno·
Publish packages, images or pages under the name it holds create.record.worldno·
money — budgets and spend
Spend money or tokens against an account it holds write.budget.tenantno·
schedule — things that outlive the turn
Create something that outlives the turn where it runs (a cron, a service) create.schedule.hostyes·
Create something that outlives the session, on the platform (a routine, a scheduled trigger, a new session) create.schedule.tenantyes·
browser — what a browser extension or automation can see and do in your browser
Read every page you visit read.record.browsingno·

What host, tenant and world mean here

ReachHere, it means
hostthe runner — destroyed after the job; not your machine
tenantthe repository, with the workflow's token
worldthe internet, unrestricted

What it cannot reach, and why

WhatWhySource
your machinea hosted runnerlibrary entry 2
the repository, for writingthe token is contents:readevidence: ci.permissions-block

The grant, tool by tool

Two tools in one session reach different things, which is why the unit of mapping is the tool and not the product. Each row carries the control on the path and the tier of evidence behind it.

the job's shell — measured, evidence/github__actions-runner__ci__shell__2026-08-26.json

CapabilityControlEvidenceWhat is on the path
Run programs as the account↗ execute.process.host● noneobserved— · runs as uid 1001; passwordless escalation available (n1a) — programs run as this user and can escalate
Read any file the account can reach↗ read.file.host● noneobserved— · the runner's user with passwordless escalation: every file on the ephemeral machine
Change any file the account can reach↗ write.file.host● noneobserved— · the runner's user with passwordless escalation: every file on the ephemeral machine
Delete files anywhere the account can reach↗ delete.file.host● noneobserved— · the runner's user with passwordless escalation: every file on the ephemeral machine
Reach any host on the internet↗ send.endpoint.world● noneobserved— · github.com 200, pypi.org 200, example.com 200 — UNRESTRICTED egress, no proxy
Commit to the repository it was pointed at↗ write.repository.project○ boundaryobservedthe checkout is writable, but the token is contents:read, so nothing written can leave · the checked-out tree at this ref is writable by the job
Read the project it is working on↗ read.file.project● noneobserved— · the checked-out tree at this ref is readable — including anything a contributor committed by mistake
Change the project it is working on↗ write.file.project● noneobserved— · the checked-out tree at this ref is writable by the job

What narrows it

For each capability in the grant: the specific setting or arrangement that narrows it, what it costs, and the tier the control reaches afterwards. Guidance is free and stays free.

CapabilityThe settingWhat it costsTier after
Delete files anywhere the account can reach↗the same container or account; and a backup that the agent cannot reach, because delete at host reach is irreversibleas above, plus a backup outside the grantboundary
Run programs as the account↗keep the confirmation prompt on for commands, and run in a container: execution survives inside it and stops being execution on your machinea click per command · an afternoon for the containersetting (prompt) · boundary (container)
Read any file the account can reach↗run the agent in a container with only the project mounted, or under a separate user accountan afternoon, then ongoing friction (container) · days, and it fights you (account)boundary
Read the project it is working on↗none: this is what it is fornothingnone
Reach any host on the internet↗route outbound traffic through an allow-list — the one control the hosted container already has, demonstrated rather than claimedan hour, if you already have somewhere to put itboundary
Change any file the account can reach↗the same container or account; the tool's own directory restriction is a setting anything running as you can step aroundas aboveboundary
Change the project it is working on↗a review before mergea reviewer's timesetting
Commit to the repository it was pointed at↗none needed for most work; a review before merge is the controla reviewer's timesetting

Against the mandates

What a reasonable person wanted from this setup, and the gap: ▲ excess is what it can do that they did not want; ▼ shortfall is what they wanted that it cannot do.

MandateExcessShortfall
A CI job on a hosted runner↗▲ 0▼ 1

Sources

A derived row is an inference from what this kind of program architecturally is. It is a claim, and the most useful pull request on this page is one that replaces a claim with a probe run — how↗.


Site index for agents↗ · HTML version↗