--url <url> and --app-id <id>. Their defaults are in Credential resolution. Each exits 0 on success and 1 with the reason on stderr otherwise. In CI, set the credential variables instead of running login. See In CI.
outerlayer emit (a named check)
Record one named check’s outcome on a work item.
The name starts with a lowercase letter, then lowercase letters, digits,
., - or _, up to 64 characters. A fail needs --link or a body. A pass needs neither. The command prints the recorded check’s id.
outerlayer init writes two checks. A session, CI or a person records code-review. The runner records acceptance-criteria after a build ends ok. See Policy and validators.
Inside a recorded session, the check is stored as the session’s. A session cannot record over a person’s fail. A session not launched with OUTERLAYER_WORK is refused. A person’s own pass or fail on one criterion’s proof goes on that criterion’s thread instead: see outerlayer work comment in Work commands.
Exit codes: 0 recorded, 1 refused or invalid.
See also: Record a check.
outerlayer emit artifact
Upload a proof artifact with a caption.--test:
--testneeds--forand an.xmlfile. Without either, the command exits 1.- A name several tests share binds all of them, with a warning.
<name>=<path>:<line>gives the test’s location when the runner’s file does not carry it, as in--test "renders the banner=src/login.test.ts:42".- The command exits 1 on a name the file does not hold, or on a location that is absolute or leaves the repository.
.xml file whose root is <testsuites> or <testsuite> is a test artifact. With --for, the command reads the XML first and exits 1 on a malformed file before sending anything. Without --for, the CLI sends an .xml file without checking it. The command prints the artifact’s id, for a later --replaces.
Inside a recorded session, the artifact is queued and uploads on the next outerlayer sync, which prints its dashboard link. A session not launched with OUTERLAYER_WORK is refused. Outside a session, it uploads at once, anchored to --pr, CI’s pull request, or the current git checkout. The command prints the link on the line after the id. --json carries it as url. With nothing to attach it to, it is refused.
A --replaces target already uploaded is hidden everywhere. One target still in the local queue is cancelled, so it never uploads. If you name several ids and one is still queued, the command is refused: run outerlayer sync first, then retry.
Exit codes: 0 recorded or queued, 1 refused or invalid.
See also: Attach evidence.
outerlayer emit finding
Record one problem you hit in the factory.--subject, --kind, --severity, --verdict, --fixed and --source are refused by name. Use --category instead.
When the finding matches a problem by key, it joins that problem with no further step, and the output names the problem. Otherwise nothing is stored. The command prints the three closest problems in the factory with their reports. It also prints the three rules for what counts as the same problem, and how to run it again. It then exits with code 3. A problem that is not in this factory, or --problem without --link-reason, is refused and nothing is stored.
The time a finding cost is read from two events of the session’s transcript on this machine and its subagents’ transcripts. The start is --started-at, else the first tool output that contains --error. The end is --ended-at, else the newest event. When the session has events and no start is found, nothing is stored. The command prints the recent events, each with an id such as e118 or a5c9fb78:e42 and its local time. It then exits with code 1. An id that is not in the transcripts is refused before anything is sent. The server stores both events and the minutes between their times. Only Claude Code sessions have a transcript the command can read.
Exit codes: 0 recorded, 1 refused or invalid, 3 not stored: choose among the printed problems and run it again.
See also: Findings.
outerlayer emit findings
Record a batch of findings from a JSON file."schemaVersion": 3, optional headSha and contextSourceSha, and 1 to 500 findings with the same fields and rules as emit finding. A finding may carry problems with linkReason, or new: true. Its startedAt and endedAt may be event ids as emit finding lists them, and default the same way. A finding with no start found stops the whole batch, unless it carries "untimed": true. - reads standard input. The whole batch is checked before anything is sent. A schemaVersion 1 or 2 file is refused: set schemaVersion: 3.
The findings that match a key are stored. The ones that need a choice are listed with their candidates and not stored, so nothing is half-stored. Add problems with linkReason, or new: true, to those findings and run the command again. Findings already stored keep their problems.
Exit codes: 0 recorded, 1 refused or invalid, 3 at least one finding was not stored and needs a choice.
See also: Findings.
outerlayer emit step
Report that you started a step of the work. The work item’s Activity tab shows each step as it is reported.- With
--item, it uses that item. - Without it, inside a recorded session, it uses the item that session was launched for with
OUTERLAYER_WORK. - With neither, it exits 1, names
--itemandOUTERLAYER_WORK, and sends nothing. - Inside a recorded session that was not launched on a work item, it is refused, as the other emit commands are.
~/.outerlayer/spool/steps.jsonl. The queued step keeps the time you ran the command, and the command exits 0. A failed report never stops the agent. outerlayer sync sends each queued step once, and the step then shows at the time it started. A queued step older than 14 days is dropped. If the gateway refuses the step with a 4xx, the command prints the gateway’s reason, exits 1 and queues nothing.
Exit codes: 0 reported or queued, 1 refused or invalid.
See also: Review and merge.
outerlayer emit criteria
Record a work item’s acceptance criteria as one list. The Criteria tab, its count and the item’s status read this list. Nothing reads criteria out of the issue..md. - reads JSON from standard input.
An acceptance file is read as follows:
- Each numbered list item that opens with an id in backticks, such as
`AC-412-01`, is one criterion. - Its text is the rest of the item.
- A
(proof: <kind>)written outside backticks names its proof. - A bulleted item that names an id is a note about that criterion, so it is skipped.
"drafted": true. The build sets it on a list it drafted from the issue’s description, because the issue held no criteria. Only a list an agent session or a factory key records keeps the mark. A list a person records is never marked drafted, even when its file says so. The item’s Criteria tab says when its current list was drafted.
The list holds 1 to 200 criteria. The command checks the file before it sends anything, and names the id or value it refuses.
Every list you record is kept, with who recorded it and when. The newest is the item’s current list.
Only a person can replace a recorded list. Anyone with the permission, an agent session included, can record an item’s first list. After that, a replacement from an agent session is refused with 409, and the command exits 1. So is a replacement from a factory key that belongs to no person, such as a CI or host key. Run the command outside the session, with your own login. A drafted list is no exception: until a person replaces it, a later build’s record is refused, even after you add criteria to the issue. To let agent sessions replace a list too, set criteria.replace: anyone in .outerlayer/policy.yaml. See Policy and validators.
Recording a list asks for a new evaluation of the item’s linked pull requests. An item with no linked pull request gets none, but its Criteria tab shows the list at once. An item with no recorded list shows no criteria.
Exit codes: 0 recorded, 1 refused or invalid.
See also: Review and merge, Attach evidence.