Skip to content

REQ 103

sergio velderrain edited this page Nov 10, 2026 · 3 revisions

REQ-103: Register no runner in a lane guest

Requirement

A lane guest shall run its workload with no GitHub Actions runner configured or registered in it, driven only by the engine's lane executor from outside the guest.

Rationale

This is option 3 of decision D-2 (VITechnologies/projectbuddy#165). It keeps the workload declared as data (REQ-090), lets the dispatching job's token reach the guest only if declared (REQ-093), and lets the executor switch the guest network between phases (VITechnologies/projectbuddy#182). A persistent runner attached to a public repository can run fork pull-request code; a guest with no runner offers no such target (challenge ledger row CH-04 in VITechnologies/projectbuddy#159).

Fit Criterion

The lane box receipt records a readiness scan, run in the guest before the packaged snapshot is taken and identified by the guest's boot ID, that found no runner configuration (a .runner or a .credentials file, as config.sh writes them) anywhere in the image's file system and no runner service unit (actions.runner.*). The packager refuses a readiness receipt that reports a runner or an incomplete scan. The check runs before the snapshot because a runner enabled in the image would start at each clone's first boot, before any clone check. The lane clone check repeats the service-unit check before the workload starts. No lane code path requests a runner registration or removal token. Rejected: a guest with a .runner or a .credentials file, or with an actions.runner.* unit, fails the readiness scan, and the packager refuses to package it, so it gets no box receipt; a clone whose guest shows an actions.runner.* unit is refused before the workload starts and torn down; an offline test with a stubbed GitHub API layer fails if any lane command reaches a registration-token or remove-token endpoint.

Verification

Planned, TEST-105; not yet performed live. Offline fixture tests show that a .runner file, a .credentials file, or an actions.runner.* unit fails the readiness scan, and that the packager refuses such a readiness receipt. Under a refuse clone profile, an actions.runner.* unit fails the clone check before anything runs in the guest. The lane plan, teardown, and teardown verifier run as real processes with no GitHub request, and a mutant that requests a token is caught. Tearing down a refused clone waits for the lane executor.

Source

Software-Requirements-Specification

Priority

High

TestID

TEST-105

TestArtifact

scripts/tests/test_lane_box.py readiness and packaging cases, scripts/tests/test_vagrant_clone.py runner-unit cases, scripts/tests/test_lane_plan.py TEST-105 cases, and scripts/tests/test_lane_channel.py runner-unit cases

CodeRef

scripts/lane_box/readiness.py, scripts/lane_box/receipt.py, scripts/vagrant_clone/core.py and scripts/vagrant_clone/live.py (runner units), scripts/lane/plan.py (the check-runner-units step), and scripts/lane/channel.py (check_runner_units, the same unit check run over the lane's SSH session)

Status

Planned; offline fixture tests pass, no live proof yet

Clone this wiki locally