Skip to Content
kusaw docsv1.0.0
Step protocol

Step protocol v2

Field tables are generated from the JSON Schemas the factory validates against.

Step protocol v2

Field tables are generated from the JSON Schemas the factory validates against.

Handshake

The one stdout line a step prints when KUSAW_HANDSHAKE=1.

NameTypeRequiredDescriptionSince
continue_hintstringnoOne-line hint telling a person how to end this interactive step.2
descriptionstringnoOne-line summary of what the step does.2
egressarray of stringnoHosts the step says it needs (GF-132). Grants nothing; missing hosts are listed as a validate warning and are never auto-allowed.2
featuresarray of stringnoOptional protocol features this step implements. Known values: atlas_scan, atlas_chunk, atlas_embed, atlas_map, milestone_check, atlas_tools, model_variants.2
interactivebooleanyesTrue when the step needs a person at the terminal.2
namestringyesStep name as the factory should display it.2
needs_envarray of objectnoOptional list of environment variables the program expects. Grants nothing; undeclared secrets fail with secret_not_declared.2
needs_env[].namestringyesEnvironment variable name.2
needs_env[].secretbooleanyesTrue when the value is a secret. Grants nothing.2
needs_pathsobjectnoOptional paths the program expects to see. Grants nothing; a listed path that is not visible in the attempt's sandbox fails with dependency_missing.2
needs_paths.readarray of stringnoPaths the program expects to read.2
needs_paths.writearray of stringnoPaths the program expects to write.2
notesenum live, startnoWhen this step can take steer notes: live (appended while running) or start (next step start). Omitted means start.2
outputs_schemaobjectnoJSON Schema for result.outputs (inline object or a path relative to the step). The factory validates outputs against it. An invalid schema is E4 at handshake (GF-100).2
protocol_versionsarray of integeryesProtocol versions this step speaks.2
typeconst handshakeyesMessage type. Always handshake.2
versionstringyesStep implementation version.2

Request

The JSON document written to a step's stdin, or to KUSAW_REQUEST for an interactive step.

NameTypeRequiredDescriptionSince
artifacts_dirstringyesDirectory the step should write artifacts into.2
change_set_idstringnoStable id for this run's change set.2
completion_grace_secondsintegernoSeconds the factory waits after a result for this process to exit before stopping it.2
configobjectyesFree-form settings from this step's config key.2
connectorsobjectnoPer-attempt factory-connectors proxy (GF-115). Omitted when the factory has no connectors or this step may not call them.2
connectors.mcp_configstringnoAbsolute path of the attempt mcp.json that includes factory-connectors.2
connectors.socketstringnoAbsolute path of the attempt unix socket.2
connectors.toolsarray of objectnoTools listed on factory-connectors for this step.2
connectors.tools[].descriptionstringnoTool description.2
connectors.tools[].input_schemaobjectnoJSON Schema for arguments.2
connectors.tools[].namestringyesProxy tool name connector__tool.2
contextobjectyesTask, earlier steps, and recovery fields the step can see.2
context.atlasobjectnoAtlas context for atlas_scan, atlas_chunk, atlas_embed, and atlas_map, and the agent-tools view (repos, tools) on ordinary steps.2
context.atlas.commitstringnoCommit SHA the Atlas reflects.2
context.atlas.dimsintegernoatlas.embedding.dims on an atlas_embed request.2
context.atlas.filesarray of stringnoRelative paths inside root.2
context.atlas.modelstringnoatlas.embedding.model on an atlas_embed request.2
context.atlas.out_dirstringnoDirectory a custom atlas_map writer should write page files into.2
context.atlas.overview_cap_tokensintegernoToken cap for the overview page on an atlas_map request.2
context.atlas.pages_dirstringnoDirectory that already holds accepted pages the writer may read (module pages for the overview).2
context.atlas.pages_duearray of objectnoPages a custom atlas_map writer should produce.2
context.atlas.pages_due[].kindstringnooverview, module, apis, or conventions.2
context.atlas.pages_due[].modulestringnoModule name on a module page.2
context.atlas.pages_due[].slugstringnoPage slug (overview, apis, conventions, or a module slug).2
context.atlas.pages_due[].sourcesarray of stringnoSnapshot-relative paths this page covers.2
context.atlas.providerstringnoatlas.embedding.provider on an atlas_embed request.2
context.atlas.repostringnoRepo label being scanned, chunked, or embedded.2
context.atlas.reposarray of objectnoRun repos as Atlas tools see them. A missing Atlas has commit null and no overview_path.2
context.atlas.repos[].behindbooleannoTrue when the Atlas commit is behind local main.2
context.atlas.repos[].commitstring or nullnoAtlas commit SHA, or null when the repo has no Atlas.2
context.atlas.repos[].labelstringyesRepo label.2
context.atlas.repos[].overview_pathstringnoAttempt-local copy of the overview page.2
context.atlas.rootstringnoAbsolute path of the raw folder (scan) or snapshot/ (chunk and atlas_map).2
context.atlas.textsarray of objectnoChunks to embed on an atlas_embed request, in batches of 64.2
context.atlas.texts[].idstringyesChunk hash or query id.2
context.atlas.texts[].textstringyesRedacted text to embed.2
context.atlas.toolsobjectnoHow a custom step reaches read_map and search_code.2
context.atlas.tools.mcp_configstringnoPath of the attempt MCP config that lists factory-atlas.2
context.atlas.tools.socketstringnoPath of the attempt-local unix socket.2
context.benchobjectnoBenchmark replay this request belongs to. Omitted for ordinary runs. Custom steps and scorers receive it on replays (GF-124).2
context.bench.kindconst reviewnoPresent on review-step benchmark replays (GF-125). Omitted for ordinary (run) replays.2
context.bench.originenum fresh, private, public, unknownyesUser-stated origin of the task: fresh, private, public, or unknown.2
context.bench.repeat_nointegeryes1-based repeat index of this replay.2
context.bench.taskstringyesBenchmark task name.2
context.bench.variantstringyesVariant name for this replay, including baseline.2
context.budgetobjectnoThe step's provider's tightest usage window (GF-127). Omitted when no budget is configured.2
context.budget.maxnumberyesWindow maximum.2
context.budget.providerstringyesProvider name, or total for the calendar budget.2
context.budget.resume_atstringnoRFC 3339 time when the window will have room again. Empty when under the limit.2
context.budget.usednumberyesUsage already counted in this window.2
context.candidateobjectnoThe best-of-N candidate this attempt belongs to (GF-129). Omitted on the parent pipeline and on the select step.2
context.candidate.countintegeryesHow many candidates the stage is running.2
context.candidate.labelstringnoAttempt label when the stage used attempts.2
context.candidate.modeenum pick, comparenopick chooses a winner; compare records every attempt without picking. Default is pick.2
context.candidate.modelstring or nullnoAttempt model, or null when the attempt left it as configured.2
context.candidate.numberintegeryes1-based candidate number.2
context.candidate.providerstring or nullnoAttempt provider, or null when the attempt left it as configured.2
context.candidate.stagestringyesCandidates stage name.2
context.candidate.variantobjectnoOverlay applied to this candidate. Empty object when none.2
context.candidatesarray of objectnoFinished candidates as the select step sees them (GF-129). Omitted outside mode select.2
context.candidates[].branchstringyesWorking branch factory/---c or -- when labelled.2
context.candidates[].cost_usdnumber or nullnoSpend attributed to this candidate, or null when none was reported.2
context.candidates[].diffobjectyesChanged files and line counts versus the fork point.2
context.candidates[].diff.addedintegeryesLines added.2
context.candidates[].diff.filesintegeryesChanged file count.2
context.candidates[].diff.removedintegeryesLines removed.2
context.candidates[].elapsed_msintegeryesWall time of this candidate's attempts, in milliseconds.2
context.candidates[].grade_cleanobjectnoClean-checkout grade per repo when regrade is true. Empty when not implemented.2
context.candidates[].labelstringnoAttempt label when the stage used attempts.2
context.candidates[].model_reportedstringnoModel the provider reported, or unknown when none.2
context.candidates[].model_requestedstringnoModel setting asked for on this attempt.2
context.candidates[].numberintegeryes1-based candidate number.2
context.candidates[].outcomestringyesok, fail, reject, or error.2
context.candidates[].providerstringnoProvider named on this attempt.2
context.candidates[].scorecardscorecardRownoThis attempt's scorecard row (GF-146).2
context.candidates[].scoresarray of objectnoListed scorers' results.2
context.candidates[].scores[].namestringyesScorer name.2
context.candidates[].scores[].passedbooleanyesTrue when the scorer score met its threshold.2
context.candidates[].scores[].scorenumbernoNumeric score when the scorer returned one.2
context.candidates[].scores[].statusstringnoScorer status: scored, error, skipped, or not_applicable.2
context.candidates[].variantobjectnoOverlay applied to this candidate.2
context.candidates[].verifyobjectyesRepo label to pass or fail.2
context.candidates[].warningsarray of objectnoWarnings for this attempt, such as model_mismatch.2
context.candidates[].warnings[].codestringyesWarning code, such as model_mismatch.2
context.candidates[].warnings[].reportedstringnoModel the provider reported when code is model_mismatch.2
context.candidates[].warnings[].requestedstringnoModel asked for when code is model_mismatch.2
context.candidates[].worktreestringnoCandidate worktree root, still present for the select step.2
context.classifyobjectnoThe routing item and workflows for mode classify (GF-114). Omitted outside mode classify.2
context.classify.itemobjectyesThe task or idea the classifier should assign.2
context.classify.item.bodystringyesItem body.2
context.classify.item.labelsarray of stringnoItem labels.2
context.classify.item.reposarray of stringnoRepo labels.2
context.classify.item.sourcestringyesRouting source, such as add or triage:.2
context.classify.item.titlestringyesItem title.2
context.classify.item.typestringnoItem type from front matter or a connector.2
context.classify.workflowsarray of objectyesWorkflows the classifier may pick.2
context.classify.workflows[].descriptionstringyesWorkflow description.2
context.classify.workflows[].namestringyesWorkflow name.2
context.connectorsarray of objectnoContext files written from connector tools (GF-115). Omitted when the factory has no connectors.2
context.connectors[].documentsarray of objectnoDocuments written into this context file (GF-118). Omitted for non-docs context entries.2
context.connectors[].documents[].bytesintegeryesSize of the converted text in bytes, after the per-document cap.2
context.connectors[].documents[].cutbooleanyesTrue when the document was cut to the per-document cap.2
context.connectors[].documents[].idstringyesDocument id.2
context.connectors[].documents[].titlestringyesDocument title.2
context.connectors[].documents[].urlstringyesDocument URL.2
context.connectors[].filestringyesAbsolute path of the fenced markdown file.2
context.connectors[].is_errorbooleannoTrue when required is false and the call failed.2
context.connectors[].namestringyesConnector name plus context key, as connector.key.2
context.connectors[].sha256stringyesSHA-256 of the file bytes.2
context.events_pathstring or nullnofinally only: events.jsonl for this run2
context.evidencearray of objectnoEvidence files accepted for this run so far (GF-130).2
context.evidence[].captionstringyesCaption, at most 200 characters.2
context.evidence[].idstringyesEvidence id.2
context.evidence[].mediastringyesSniffed media type.2
context.evidence[].stepstringyesStep that produced the evidence.2
context.failed_reposarray of objectnoRepos that failed before this step.2
context.failed_repos[].labelstringnoFailed repo label.2
context.failed_repos[].log_pathstringnoPath of the attempt log.2
context.failed_repos[].messagestringnoShort human-readable summary.2
context.failed_repos[].reason_codestringnoTyped reason for the failure.2
context.failed_repos[].stepstringnoStep id that failed.2
context.ideastring or nullnointake only2
context.logsobjectnoThe log-store fingerprint this run's task came from (GF-117). Omitted when the task is not from a log-store item.2
context.logs.connectorstringyesLog-store connector name.2
context.logs.countintegeryesEvents seen for this fingerprint.2
context.logs.fingerprintstringyesError fingerprint (ext: or a factory hash).2
context.logs.first_seenstringyesFirst seen timestamp.2
context.logs.groupstringyesStore grouping id, if the mapping has one.2
context.logs.last_seenstringyesLast seen timestamp.2
context.logs.urlstringyesStore link for this fingerprint, if the mapping has one.2
context.notesarray of objectnoUndelivered steer notes for this step (GF-133).2
context.notes[].created_atstringyesWhen the note was stored.2
context.notes[].idstringyesNote id.2
context.notes[].textstringyesNote body.2
context.orderobject or nullnoWork order this run belongs to. Omitted for ordinary runs.2
context.order.assertionsarray of objectnoAssertions this check should judge (due at the milestone, after the check's selector).2
context.order.assertions[].idstringyesAssertion id.2
context.order.assertions[].tagsarray of stringnoTags from the contract.2
context.order.assertions[].textstringyesAssertion text from contract.yaml.2
context.order.base_refsobjectnoPer-repo base commit the combined change started from.2
context.order.claimsarray of objectyesContract assertions this run should honour.2
context.order.claims[].idstringyesAssertion id.2
context.order.claims[].textstringyesAssertion text from contract.yaml.2
context.order.contract_pathstringyesPath of the Work order contract.yaml.2
context.order.featurestringnoFeature id when this run is for one feature.2
context.order.featuresarray of objectnoWork order features in this milestone and earlier, with delivered commits.2
context.order.features[].claimsarray of stringyesAssertion ids this feature claims.2
context.order.features[].commitsarray of stringyesDelivered commit SHAs for this feature.2
context.order.features[].idstringyesFeature id.2
context.order.features[].titlestringyesFeature title.2
context.order.folderstringnoWork order folder. Set during order.intake (GF-157).2
context.order.goalstringnoGoal sentence the Work order started from. Set during order.intake (GF-157).2
context.order.idstringyesWork order id.2
context.order.milestonestringnoMilestone id this run belongs to.2
context.order.milestone_refsobjectnoPer-repo commit at the milestone branch tip.2
context.order.notes_pathstringyesRead-only copy of notes.md in this attempt's artifacts dir.2
context.order.phasestringyesEmpty for feature, check, and fix runs. GF-164 sets readiness.2
context.order.previous_diffstringnoConflict diff for a GF-159 fix run.2
context.order.reposarray of stringnoRepo labels this Work order touches. Set during order.intake (GF-157).2
context.order.rolestringyesfeature, check, or fix. GF-164 may send readiness as phase instead.2
context.order.roundinteger or nullnoCheck or fix round, or null for a feature run.2
context.outcomeobject or nullnofinally only: {status, reason}2
context.portsobjectnoPort block leased to this worktree set (GF-131). Omitted when the factory has no ports block.2
context.ports.baseintegeryesFirst port of the leased block.2
context.ports.countintegeryesNumber of ports in the block.2
context.ports.namesobjectyesNamed ports from ports.names, keyed by name.2
context.regradeobjectnoPresent when GF-120 regraded this run. Omitted otherwise.2
context.requeue_notestring or nullnoNote from the person who requeued this run.2
context.scorecardobjectnoThe candidates-stage scorecard as the select step sees it (GF-146). Omitted outside mode select.2
context.scorecard.rowsarray of scorecardRowyesOne scorecard row per attempt.2
context.scorecard.stagestringyesCandidates stage name.2
context.scorecard.warningstringnoScorecard warning, such as cost incomplete.2
context.scorecard.weightsobjectyesConfigured speed and cost weights.2
context.scorecard.weights.costnumberyesCost weight from 0 to 1.2
context.scorecard.weights.speednumberyesSpeed weight from 0 to 1.2
context.servicesarray of objectnoDeclared services for this worktree (GF-131). Empty when none are running.2
context.services[].logstringnoPath of the bounded service log.2
context.services[].namestringyesService name.2
context.services[].portsobjectnoNamed ports from the worktree lease.2
context.services[].ready_urlstringnoHTTP ready URL when the ready check is http.2
context.services[].repostringyesRepo label.2
context.services[].statestringyesstarting, ready, exited, stopped, or failed.2
context.source_linkstring or nullnointake only2
context.stepsobjectyesEarlier step results keyed by step id.2
context.subtaskobjectnoThe fan-out subtask this attempt belongs to (GF-126). Omitted on the parent pipeline.2
context.subtask.depends_onarray of stringyesSubtask ids that must finish first.2
context.subtask.idstringyesSubtask id.2
context.subtask.ownsarray of stringyesGit pathspec globs this subtask owns.2
context.subtask.parent_specstringnoThe parent task spec this subtask was split from.2
context.subtask.parent_taskstringyesParent task id.2
context.subtask.specstringyesThe subtask spec.2
context.subtask.titlestringyesSubtask title.2
context.subtasksarray of objectnoPlan subtasks of this run, for SUMMARY.md and later stages.2
context.subtasks[].idstringyesSubtask id.2
context.subtasks[].ownsarray of stringyesOwned pathspecs.2
context.subtasks[].reasonstringnoFailure or skip reason.2
context.subtasks[].statusstringyespending, running, ok, gathered, failed, or skipped.2
context.subtasks[].titlestringyesSubtask title.2
context.taskobject or nullyesThe task this pipeline step is working on. Null during early intake.2
context.task.depends_onarray of stringnoParent task ids this task stacks on.2
context.task.idstringnoTask id.2
context.task.reposarray of stringnoRepo labels this task touches.2
context.task.specstringnoThe task spec body. On a fan-out child this is the subtask spec.2
context.task.spec_pathstringnoPath of the spec file.2
context.task.titlestringnoTask title from the spec.2
context.trackerobjectnoThe tracker item this run's task came from (GF-116). Omitted when the task is not from a tracker connector.2
context.tracker.connectorstringyesConnector name.2
context.tracker.idstringyesTracker item id.2
context.tracker.statusstringyesCurrent tracker status value.2
context.tracker.status_meaningstringyesFactory meaning: todo, in_progress, in_review, done, cancelled, or other.2
context.tracker.urlstringyesTracker item URL, if the mapping has one.2
context.triageobjectnoTriage batch this request belongs to (GF-112). Omitted outside mode triage.2
context.triage.batch_idstringyesTriage batch id.2
context.triage.groupsarray or nullnoGroups from an earlier triage step, or null before grouping.2
context.triage.groups[].idstringyesGroup id (-g).2
context.triage.groups[].itemsarray of stringyesItem ids in this group.2
context.triage.groups[].root_causestringyesOne line naming the shared cause.2
context.triage.itemsarray of objectyesItems in the batch.2
context.triage.items[].idstringyesItem id (-).2
context.triage.items[].pathstringyesPath of the copied item in the batch folder.2
context.triage.items[].titlestringyesItem title.2
context.triage.reposarray of stringyesRepo labels the batch was started with.2
context.verification_commandsobjectnoVerification commands keyed by repo label.2
context.workflowobjectnoThe workflow this run was routed to (GF-114). Omitted when the factory has no named workflows.2
context.workflow.confidencenumbernoClassify confidence when routed_by is classify.2
context.workflow.namestringyesWorkflow name.2
context.workflow.routed_bystringyesexplicit, rule, classify, default, or user.2
effectsobjectnoKinds this step may return and how they are applied (GF-92). Omitted when the step allows none.2
effects.allowedarray of objectyesKinds the step may return, with each kind's args schema and scope.2
effects.allowed[].kindstringyesEffect kind name.2
effects.allowed[].schemaobjectnoJSON Schema for args.2
effects.allowed[].scopeenum outside, localyesoutside waits for a human gate; local applies after the step.2
effects.applied_so_farintegeryesEffects already accepted in this run.2
effects.modeenum apply, dry_run, offyesHow the factory treats a valid plan.2
human_notesarray of objectnoHuman notes for this run, with stable ids, for any step (GF-110). Gate reject notes, the requeue note, and the GF-101 resume note.2
human_notes[].idstringyesStable id the step must answer in fix-mode review.2
human_notes[].sourcestringyesWhere the note came from: gate, requeue, or resume.2
human_notes[].textstringyesNote body. Not fenced as untrusted data.2
limitsobjectyesTime, budget, and output caps still available for this attempt.2
limits.budget_left_usdnumber or nullyesDollars left in the run budget, or null when unbounded.2
limits.final_text_bytesintegernoCap on assistant final text kept in memory (1 MiB).2
limits.log_cap_bytesintegernoPer-stream cap for stdout.jsonl and stderr.log (50 MiB).2
limits.max_line_bytesintegernoMaximum stdout line the adapter accepts (1 MiB).2
limits.outputs_max_bytesintegernoMaximum serialized size of result.outputs (64 KiB).2
limits.time_left_msintegeryesmin(step timeout, run time left)2
loopobject or nullyesSet when the attempt is inside a loop. Null otherwise.2
loop.iterationintegeryesCurrent iteration, starting at 1.2
loop.max_iterationsintegeryesMaximum iterations allowed.2
loop.namestringyesLoop name from kusaw.yaml.2
loop.previous_feedbackobjectyeskeyed by step id (or gate name, or 'requeue'). effects is the compact list of validation problems from a retry / effects_invalid attempt (GF-92).2
loop.previous_feedback.effectsarray of objectnoProblems from the previous effects plan.2
loop.previous_feedback.effects[].indexintegerno0-based index in the previous plan.2
loop.previous_feedback.effects[].kindstringnoEffect kind.2
loop.previous_feedback.effects[].messagestringnoWhy it failed validation.2
modeenum pipeline, intake, finally, atlas_scan, atlas_chunk, atlas_embed, atlas_map, check, score, match, triage, select, classifyyesWhy the step is running. check is a Work order milestone check or a readiness probe. atlas_map is a replaceable Atlas map writer. score is a custom scorer (GF-122). match is a custom review-benchmark matcher (GF-125). triage is a kusaw triage batch (GF-112). select is a best-of-N winner picker (GF-129). classify is a routing classify command (GF-114).2
promptobjectnoRendered prompt_file for this custom step attempt.2
prompt.args_usedarray of stringyesPlaceholder names that had values.2
prompt.filestringyesAbsolute path of the rendered prompt.md for this attempt.2
prompt.warningsarray of stringyesUnused-argument warnings (E3).2
prompt_fenceobjectnoShared untrusted-data fence so a custom step can wrap outside text without the binary.2
prompt_fence.open_tagconst untrusted_datayesOpening tag name of the untrusted-data fence.2
prompt_fence.preamblestringyesThe one line that tells the agent fenced content is data, never instructions.2
protocol_versionconst 2yesProtocol version of this request. Must be 2.2
reposarray of objectyesRepos in running or verified. Failed and delivered repos are left out.2
repos[].base_refstringyesBase commit this branch started from.2
repos[].branchstringyesBranch the step should work on.2
repos[].capabilitiesobjectnoApproved instructions, skills, and MCP servers for this repo (GF-80). Omitted when the repo has none.2
repos[].capabilities.instructionsarray of objectnoApproved instruction files copied into the attempt.2
repos[].capabilities.instructions[].filestringyesAbsolute path of the read-only copy.2
repos[].capabilities.instructions[].pathstringyesRepo-relative path of the instructions file.2
repos[].capabilities.instructions[].sha256stringyesSHA-256 of the committed file.2
repos[].capabilities.mcpobjectnoApproved MCP servers for this repo, or omitted when none are usable.2
repos[].capabilities.mcp.configstringnoAbsolute path of the generated mcp.json for this repo.2
repos[].capabilities.mcp.envarray of stringnoEnv names set on the step process. Values are never written to files.2
repos[].capabilities.mcp.serversarray of stringnoLabel-prefixed MCP server names in that config.2
repos[].capabilities.notesobject or nullnoFactory-side notes copy, or null when notes is unset.2
repos[].capabilities.notes.filestringnoAbsolute path of the read-only notes copy.2
repos[].capabilities.notes.sha256stringnoSHA-256 of the notes file.2
repos[].capabilities.skillsarray of objectnoApproved skills copied into the attempt, named -.2
repos[].capabilities.skills[].dirstringyesAbsolute path of the read-only skill copy.2
repos[].capabilities.skills[].idstringyesLabel-prefixed name given to the provider.2
repos[].capabilities.skills[].namestringyesSkill name as declared in the repo.2
repos[].capabilities.skills[].sha256stringyesSHA-256 of the skill contents.2
repos[].command_envobject or nullnoHow this repo's factory commands run, or null when command_env is unset.2
repos[].command_env.shellstringnosh, bash, or an absolute path to a POSIX shell.2
repos[].command_env.shell_initarray of stringnoLines run in the same shell as the command, in order.2
repos[].command_env.wraparray of stringnoArgv prefix every command runs under.2
repos[].copiedarray of objectnoFolders copied from the source checkout into this worktree before setup (GF-106). Omitted when none were copied.2
repos[].copied[].methodenum clone, reflink, copyyesHow the factory copied this path: APFS clone, Linux reflink, or a plain copy.2
repos[].copied[].pathstringyesRepo-relative path that was copied.2
repos[].git_controlobjectnoGit control-file protection for this repo (GF-89).2
repos[].git_control.baseline_keysarray of stringyesRepo-local program key names trusted for this run (names only).2
repos[].git_control.protectedconst trueyesThe factory snapshots and restores git control files around the attempt.2
repos[].glossary_pathstring or nullnoAbsolute path of the glossary file in the worktree, or null when the repo has none.2
repos[].labelstringyesRepo label from kusaw.yaml.2
repos[].salvage_refstringnorefs/factory/salvage// when worktree_state is reused_saved. Omitted otherwise.2
repos[].setuparray of objectnoSetup commands that ran for this repo, in order, with host then sandbox (GF-105). Omitted when none ran.2
repos[].setup[].groupenum host, sandboxyesWhere the command was configured to run.2
repos[].setup[].indexintegeryes1-based index matching setup-.log across both groups.2
repos[].setup[].inside_sandboxbooleanyesTrue when the command ran inside the OS sandbox.2
repos[].setup[].log_pathstringyesAbsolute path of this command's setup log.2
repos[].setup[].statusenum ok, failed, timeoutyesWhether the command succeeded.2
repos[].signingobjectnoResolved signing requirement for this repo (GF-87). Omitted when signing is not required.2
repos[].signing.requiredbooleannoTrue when this repo's deliveries are signed.2
repos[].stacked_onobject or nullnoParent delivery this repo started from. Omitted when the repo starts at the base branch.2
repos[].stacked_on.branchstringnoParent branch the commit was on.2
repos[].stacked_on.commitstringyesParent delivered commit.2
repos[].stacked_on.labelstringnoParent repo label.2
repos[].stacked_on.run_idstringyesParent run that delivered this commit.2
repos[].stacked_on.task_idstringyesParent task id.2
repos[].standardsstringyesPath of the standards file for this repo, or empty.2
repos[].statusenum running, verifiedyesWhether this repo is still in progress or already verified.2
repos[].worktreestringyesAbsolute worktree path for this repo.2
repos[].worktree_stateenum new, reused_clean, reused_saved, recreatednoHow this worktree was prepared for the attempt (GF-97). new on first start; reused_clean when HEAD matched the checkpoint with no changes; reused_saved when uncommitted changes were written to salvage_ref before reset; recreated when the folder was missing and rebuilt from the branch.2
resumeobjectnoPresent when the factory resumes a previous provider session for this attempt (GF-101). The step may ignore it and start fresh; report what it did in result.session.resumed_from.2
resume.forkbooleanyesTrue when the provider should fork so the old session is unchanged.2
resume.notestringnoOptional operator note prepended to the continue prompt.2
resume.providerstringyesProvider of the session to continue.2
resume.session_idstringyesProvider session id to resume.2
run_idstring or nullyesnull during intake and triage2
sandboxobjectnoOS sandbox for this attempt (GF-88). Informational; omitted when the attempt is not sandboxed.2
sandbox.backendenum seatbelt, bwrap, nullyesseatbelt, bwrap, or null when off.2
sandbox.egressobjectnoPresent when network is allowlist. Informational; the factory enforces the allowlist.2
sandbox.egress.allowarray of stringyesHost names this attempt may reach.2
sandbox.egress.injectedarray of stringyesinject entry names served through the proxy. Values are omitted.2
sandbox.egress.proxystringyesHTTP proxy URL the sandboxed process should use.2
sandbox.modeenum required, offyesEffective sandbox mode for this attempt.2
sandbox.networkenum open, allowlistyesNetwork policy. open is the GF-88 default; allowlist routes outbound traffic through the factory egress proxy.2
sandbox.tmpstringnoPrivate temp folder for this attempt.2
sandbox.writablearray of stringnoHost paths the process may write.2
stepobjectyesThe step attempt being started.2
step.attemptintegeryesAttempt number, starting at 1.2
step.idstringyesStep instance id for this run.2
step.namestringyesstep definition key in kusaw.yaml2
step.stagestring or nullnoenclosing loop or parallel name2
structured_outputobjectnoAdvice for how this step should produce structured output (GF-100). mode is two_step (produce then extract) or single_fallback (one call with an contract). The factory does not force custom programs to extract.2
structured_output.max_output_retriesintegeryesExtra extract calls after the first extract try. 0 means one extract try.2
structured_output.modeenum two_step, single_fallbackyesHow the step should collect JSON: produce-then-extract, or one call.2
task_idstring or nullyesnull during intake until write-spec sets it2
worktreestring or nullyesabsolute path of the worktree set root; null during intake2

artifact

A file a step published.

NameTypeRequiredDescriptionSince
artifact.captionstringnoCaption when kind is evidence, at most 200 characters.2
artifact.kindstringyesArtifact kind, such as log or diff.2
artifact.mediastringnoSniffed or declared media type when kind is evidence (GF-130).2
artifact.pagestringnoURL or path the evidence shows.2
artifact.pathstringyesPath relative to KUSAW_ARTIFACTS_DIR.2
artifact.repostringnoRepo label the evidence belongs to.2
artifact.titlestringnoOptional display title.2

feedbackItem

One finding from a step or gate.

NameTypeRequiredDescriptionSince
feedbackItem.assertionstringnoAssertion id this finding belongs to, on a milestone check.2
feedbackItem.filestringnoPath the finding refers to.2
feedbackItem.lineintegernoLine number in that file.2
feedbackItem.messagestringyesWhat the finding is.2
feedbackItem.repostring or nullnoRepo label the finding applies to. Missing or empty means every active repo.2
feedbackItem.rulestringnoRule id when the finding comes from a linter or reviewer.2
feedbackItem.severityenum blocker, major, minor, infoyesHow serious the finding is.2
feedbackItem.sourcestringnoWhich step or gate produced the finding.2

scorecardRow

One attempt on the candidates-stage scorecard (GF-146).

NameTypeRequiredDescriptionSince
scorecardRow.chosenbooleannoTrue when this attempt was selected.2
scorecardRow.chosen_bystringnobuiltin, or the custom select step id.2
scorecardRow.cost_knownbooleanyesFalse when GF-59 reported no cost.2
scorecardRow.cost_scorenumberyesLowest cost divided by this attempt's cost.2
scorecardRow.cost_usdnumber or nullnoNormalized cost in USD, or null when unknown.2
scorecardRow.elapsed_msintegeryesWall time excluding budget suspend, in milliseconds.2
scorecardRow.gatebooleanyesTrue when the accuracy gate passed.2
scorecardRow.gate_reasonsarray of stringnoFailing gate reasons, such as verify or scorer:.2
scorecardRow.labelstringyesAttempt label, or c when unlabelled.2
scorecardRow.numberintegeryes1-based candidate number.2
scorecardRow.rankintegeryes1-based rank among gate passers, or 0 when the gate failed.2
scorecardRow.speed_scorenumberyesFastest time divided by this attempt's time.2
scorecardRow.totalnumberyesWeighted total among gate passers.2

stepSummary

One earlier step's result, as seen by a later step.

NameTypeRequiredDescriptionSince
stepSummary.artifactsarray of artifactnoFiles that step published.2
stepSummary.iterationinteger or nullnoLoop iteration when that step ran, or null.2
stepSummary.messagestringnoShort human-readable summary.2
stepSummary.outputsobjectnoStructured outputs from that step.2
stepSummary.reason_codestringnoTyped reason for the outcome.2
stepSummary.statusenum ok, fail, retry, reject, skipped, killedyesOutcome of that step.2

Event types

One stdout line from a running step. Exactly one event shape matches.

agent_action

A short summary of what the agent did.

NameTypeRequiredDescriptionSince
agent_action.summarystringyesWhat the agent did.2
agent_action.typeconst agent_actionyesEvent type. Always agent_action.2

artifact

An artifact the step published.

NameTypeRequiredDescriptionSince
artifact.captionstringnoCaption when kind is evidence, at most 200 characters.2
artifact.kindstringyesArtifact kind, such as log or diff.2
artifact.mediastringnoSniffed or declared media type when kind is evidence (GF-130).2
artifact.pagestringnoURL or path the evidence shows.2
artifact.pathstringyesPath relative to KUSAW_ARTIFACTS_DIR.2
artifact.repostringnoRepo label the evidence belongs to.2
artifact.titlestringnoOptional display title.2
artifact.typeconst artifactyesEvent type. Always artifact.2

note_ack

A custom step acknowledged a steer note.

NameTypeRequiredDescriptionSince
note_ack.idstringyesThe note id.2
note_ack.typeconst note_ackyesEvent type. Always note_ack.2

progress

Progress update.

NameTypeRequiredDescriptionSince
progress.messagestringyesWhat the step is doing now.2
progress.percentnumbernoOptional completion from 0 to 100.2
progress.turnbooleannoTrue when this marks a model turn.2
progress.typeconst progressyesEvent type. Always progress.2

tool_call

A tool call the step made.

NameTypeRequiredDescriptionSince
tool_call.allowedbooleanyesWhether the factory allowed the call.2
tool_call.args_summarystringnoShort summary of the arguments.2
tool_call.toolstringyesTool name.2
tool_call.typeconst tool_callyesEvent type. Always tool_call.2

usage

Cumulative usage for this attempt.

NameTypeRequiredDescriptionSince
usage.context_limitinteger or nullnoModel context window only when the provider reported it. Null otherwise.2
usage.context_tokensinteger or nullnoInput size of the last model call, including cache reads and writes. Null when unknown.2
usage.cost_sourceenum reported, computed, nullnoWhether the cost was reported by the model or computed from prices.2
usage.cost_usdnumber or nullnoDollar cost so far.2
usage.modelstring or nullnoModel id when known.2
usage.providerstring or nullnoProvider name when this usage is billed to a named provider.2
usage.tokens_cachedinteger or nullnoCached input tokens so far.2
usage.tokens_inputinteger or nullnoInput tokens used so far.2
usage.tokens_outputinteger or nullnoOutput tokens used so far.2
usage.typeconst usageyesEvent type. Always usage.2

Result

The step's final stdout line, or the interactive result file.

NameTypeRequiredDescriptionSince
artifactsarray of artifactnoFiles the step published under KUSAW_ARTIFACTS_DIR.2
causeenum unclear_spec, missing_context, weak_test, wrong_permission, model_error, othernoCoarse cause when the step failed or rejected.2
costobject or nullnoOptional token and dollar cost for this attempt.2
cost.sourceenum reported, computed, nullnoWhether the cost was reported by the model or computed from prices.2
cost.tokens_cachedinteger or nullnoCached input tokens.2
cost.tokens_inputinteger or nullnoInput tokens used.2
cost.tokens_outputinteger or nullnoOutput tokens used.2
cost.usdnumber or nullnoReported or computed dollar cost.2
effectsarray of objectnoOptional plan of typed effects the factory validates and applies (GF-92). At most 100 items; the factory enforces the cap after decode.2
effects[].argsobjectnoArguments matching the kind's schema.2
effects[].kindstringyesEffect kind.2
feedbackarray of feedbackItemnoFindings for later steps or a human gate.2
messagestringyesShort human-readable summary.2
outputsobjectnoStructured outputs for later steps. At most 64 KiB serialized. order_note is a string the factory appends to the Work order notes when the attempt ends ok.2
outputs.assertionsarray of objectnoPer-assertion answers from a milestone check. status is pass, fail, or unknown.2
outputs.assertions[].evidencearray of stringnoEvidence file names the step declared.2
outputs.assertions[].filesarray of stringnoRepo-relative paths this answer refers to.2
outputs.assertions[].idstringyesAssertion id.2
outputs.assertions[].messagestringnoReason, pointing at files when the check failed or was unknown.2
outputs.assertions[].statusenum pass, fail, unknownyesHow this check judged the assertion.2
outputs.chunksarray of objectnoLine ranges from an atlas_chunk command. The factory reads text from snapshot/.2
outputs.chunks[].end_lineintegerno1-based end line.2
outputs.chunks[].kindstringnofunction, method, class, type, window, or map.2
outputs.chunks[].pathstringnoPath relative to snapshot/.2
outputs.chunks[].start_lineintegerno1-based start line.2
outputs.chunks[].symbolstringnoSymbol name, empty for windows.2
outputs.errorsarray of objectnoAtlas per-file scan errors.2
outputs.errors[].pathstringnoPath that failed to scan.2
outputs.errors[].reasonstringnoWhy the file was skipped.2
outputs.findingsarray of objectnoAtlas scan findings. Only rule_id and location fields are kept.2
outputs.findings[].end_columnintegerno1-based end byte column.2
outputs.findings[].end_lineintegerno1-based end line.2
outputs.findings[].pathstringnoPath relative to the scanned root.2
outputs.findings[].rule_idstringnoScanner rule id. Never a secret value.2
outputs.findings[].start_columnintegerno1-based start byte column.2
outputs.findings[].start_lineintegerno1-based start line.2
outputs.order_notestringnoNote the factory appends to the Work order notes when the attempt ends ok.2
outputs.pagesarray of objectnoPages from an atlas_map command. file is relative to context.atlas.out_dir.2
outputs.pages[].filestringnoPath relative to out_dir of the written Markdown file.2
outputs.pages[].slugstringnoPage slug matching pages_due.2
outputs.scannerobjectnoAtlas scanner identity. Missing version yields a warning.2
outputs.scanner.namestringnoScanner name.2
outputs.scanner.versionstringnoScanner version.2
outputs.vectorsarray of objectnoEmbeddings from an atlas_embed command.2
outputs.vectors[].idstringnoChunk hash or query id from the request.2
outputs.vectors[].vectorarray of numbernoEmbedding of length atlas.embedding.dims.2
phasestringnoOptional sub-phase the step was in when it failed (GF-95). Up to 40 characters matching ^[a-z][a-z0-9_]*$. A value that does not match is ignored with a warning, not a protocol_error.2
protocol_versionconst 2yesProtocol version of this result. Must be 2.2
provenanceobjectnoOptional custom-step provenance (GF-128). The factory type-checks strings and at most 32 tools; a wrong type is ignored, not a failure.2
provenance.modelobjectnoModel the command called. Must be a string; other types are ignored.2
provenance.prompt_sha256objectnoSHA-256 hex of the prompt bytes the command sent.2
provenance.providerobjectnoProvider name the command called, if it reports one.2
provenance.toolsobjectnoMap of tool name to version string. At most 32 entries.2
reason_codestringyesTyped reason for the outcome.2
recoveryarray of objectnoOptional copy-paste recovery commands from a custom step (GF-98). The factory keeps at most 5 valid items (title up to 80 characters, command up to 500); extras are dropped with a warning, not a protocol_error.2
recovery[].commandstringnoCommand to copy and run.2
recovery[].titlestringnoShort label for the command.2
resets_atstringnoOptional RFC 3339 time when a usage_limit window resets (GF-127).2
retry_after_msintegernoOptional wait in milliseconds the factory uses instead of the default backoff when status is retry. Values below 1,000 are ignored and the normal backoff is used. The allowed range is 1,000 to 900,000.2
sessionobjectnoOptional provider session the step wants the factory to record (GF-101).2
session.dirstringyesWorking directory of the session.2
session.idstringyesProvider session id.2
session.providerstringyesProvider that owns this session.2
session.resumed_fromstringnoSession id this attempt continued. Empty or omitted when the step ignored resume and started fresh.2
statusenum ok, fail, retry, rejectyesStep outcome.2
typeconst resultyesMessage type. Always result.2

Score outputs

outputs object a custom scorer must return. score is 0 to 1, or null when the criterion does not apply.

NameTypeRequiredDescriptionSince
itemsarray of objectnoLocations the judge cited. The score is not recomputed from items.2
items[].filestringnoPath the finding refers to.2
items[].lineintegernoLine number in that file.2
items[].messagestringnoWhat the finding is.2
items[].repostringnoRepo label.2
rationalestringnoShort reason for the score.2
scorenumber or nullyesJudge score from 0 to 1, or null when not applicable.2

Environment variables

Variables the step adapter sets. A new variable appears here when it is added to the adapter list.

NameWhenDescription
KUSAW_PROTOCOLhandshake and attemptStep protocol version the adapter speaks.
KUSAW_HANDSHAKEhandshake and attemptSet to 1 during handshake so the step prints one handshake line and exits.
KUSAW_RUN_IDhandshake and attemptRun id for this attempt. Empty during handshake and intake.
KUSAW_TASK_IDhandshake and attemptTask id for this attempt. Empty during handshake and intake until write-spec sets it.
KUSAW_STEP_IDhandshake and attemptStep id for this attempt. Empty during handshake.
KUSAW_WORKTREEhandshake and attemptWorktree path for this attempt. Empty during handshake and intake.
KUSAW_ARTIFACTS_DIRhandshake and attemptDirectory the step should write artifacts into. Empty during handshake.
KUSAW_ATTEMPThandshake and attemptAttempt number, starting at 1. Empty during handshake.
KUSAW_ITERATIONhandshake and attemptLoop iteration when the attempt is inside a loop. Empty during handshake.
KUSAW_CONFIG_SNAPSHOThandshake and attemptPath of the run's read-only config snapshot. Empty during handshake.
KUSAW_REPOSevery attemptComma-separated active repo labels.
KUSAW_REPOoptionalActive repo label for a per-repo invocation.
KUSAW_BINoptionalAbsolute path of the kusaw binary.
KUSAW_REPO_COMMAND_ENVoptionalJSON object {shell, shell_init, wrap} or null for the attempt's repo. Set when there is one active repo or the step is per_repo.
KUSAW_REPO_CAPABILITIESoptionalAbsolute path of a JSON file with one repo's capabilities object. Set when there is one active repo or the step is per_repo.
KUSAW_CLAUDE_COMMANDoptionalClaude Code executable for built-in steps that call it.
KUSAW_CLAUDE_EXTRA_ARGSoptionalJSON array of extra Claude Code arguments.
KUSAW_AGENT_PROVIDERoptionalResolved provider for this step: claude-code or cursor.
KUSAW_CURSOR_COMMANDoptionalCursor CLI executable for built-in steps that call it.
KUSAW_CURSOR_EXTRA_ARGSoptionalJSON array of extra Cursor CLI arguments.
KUSAW_REQUESTinteractivePath of request.json for an interactive step. The step reads this instead of stdin.
KUSAW_RESULTinteractivePath of result.json for an interactive step. The step writes its result here instead of stdout.
KUSAW_EVENTSinteractivePath of events.jsonl for an interactive step. The step appends event lines here.
KUSAW_BASE_REF_<LABEL>optionalParent commit this repo is stacked on, or empty when the repo starts at the base branch.
KUSAW_ORDER_IDoptionalWork order id when this run has an order_runs row.
KUSAW_ORDER_NOTESoptionalRead-only copy of the Work order notes.md for this attempt.
KUSAW_ATLAS_SOCKEToptionalPath of the attempt-local Atlas unix socket.
KUSAW_ATLAS_TOKENoptionalPer-attempt token for Atlas tools.
KUSAW_ATLAS_OVERVIEWoptionalPath of the overview file when the run has one repo.
KUSAW_TRIAGE_IDoptionalTriage batch id when this attempt belongs to kusaw triage. Empty during handshake and ordinary runs.
KUSAW_SUBTASKoptionalSubtask id when this attempt is inside a fan-out. Empty during handshake and the parent pipeline.
KUSAW_CANDIDATEoptionalCandidate id (c) when this attempt is inside a candidates stage. Empty during handshake and the parent pipeline.
KUSAW_ATTEMPT_LABELoptionalAttempt label when this step is inside a candidates stage. Empty during handshake, the parent pipeline, and when the attempt has no label.
KUSAW_ATTEMPT_PROVIDERoptionalAttempt provider when this step is inside a candidates stage. Empty when the attempt left provider as configured.
KUSAW_ATTEMPT_MODELoptionalAttempt model when this step is inside a candidates stage. Empty when the attempt left model as configured.
KUSAW_WORKFLOWoptionalWorkflow this run was routed to. Empty during handshake, intake, and when the factory has no named workflows.
KUSAW_CONNECTOR_SOCKEToptionalPath of the attempt-local factory-connectors unix socket.
KUSAW_CONNECTOR_TOKENoptionalPer-attempt token for factory-connectors.
KUSAW_TRACKER_ITEMoptionalTracker item as : when this run's task came from a tracker connector.
KUSAW_LOG_FINGERPRINToptionalLog fingerprint when this run's task came from a log-store connector.
KUSAW_PROMPT_FILEoptionalAbsolute path of the rendered prompt.md when this custom step has prompt_file.
KUSAW_NOTES_FILEoptionalJSONL file of steer notes for this attempt (one {id, text, created_at} per line).
KUSAW_STEER_LIVEoptionalSet to 1 when this Claude Code attempt keeps stdin open for live notes.
KUSAW_SANDBOXoptionalseatbelt, bwrap, or empty. Always set; reserved names win.

Built-in step outputs

Classify workflow (GF-114)

The routing classify answer: one workflow name, a confidence from 0 to 1, and a rationale.

NameTypeRequiredDescriptionSince
confidencenumberyesThe classifier's own estimate, not a calibrated probability.2
rationalestringyesWhy this workflow was chosen.2
workflowstringyesName of one configured workflow.2

Improvement draft output (GF-100)

JSON improvement drafting extracts for one proposal.

NameTypeRequiredDescriptionSince
changeobjectyesThe proposed value or file body.2
rationalestringyesWhy this change should be applied.2
targetstringyesThe config key or file the proposal edits.2
target_kindenum config_key, instructions_file, skill_fileyesWhat the proposal changes: a config key, an instructions file, or a skill file.2
titlestringyesShort title for the proposal.2

Plan (GF-126)

Owned, dependency-ordered subtasks returned by a planner step. plan may be null when the work should not be split.

NameTypeRequiredDescriptionSince
planobjectnoThe split plan, or null when fan-out should run the sub-pipeline once in the parent worktree.2
reasonstringnoWhy plan is null, or a short note about the split.2

Retro output (GF-100)

JSON array of improvement proposals the retro step extracts.

NameTypeRequiredDescriptionSince
[].evidencearray of stringyesRun ids or notes that support the proposal.2
[].kindenum deterministic_check, coding_standard, factory_config, spec_templateyesWhich kind of factory change this proposal is.2
[].rationalestringyesWhy this change should be applied.2
[].suggested_changestringyesThe change to make.2
[].titlestringyesShort title for the proposal.2

Review findings (GF-125)

Findings a review step reports. Built-in review writes the same fields to artifacts/review-.json. Custom review steps return them as outputs.findings.

NameTypeRequiredDescriptionSince
findingsarray of objectyesClaimed issues and comments from the reviewer.2
findings[].filestring or nullnoRepo-relative path, or null when there is no location.2
findings[].lineinteger or nullno1-based line, or null when there is no location.2
findings[].messagestringyesWhat is wrong.2
findings[].rulestringyesRule id.2
findings[].severityenum blocker, major, minor, infoyesHow serious the issue is. info is a comment, not a claimed bug, unless --count-info.2

Review fix-mode output (GF-110)

JSON the review step extracts after it edits the worktree. findings are issues it did not fix. Every human_notes id must appear once in notes.

NameTypeRequiredDescriptionSince
changesarray of objectyesFiles this step changed, with a short summary of each change.2
changes[].filestringyesRepo-relative path.2
changes[].summarystringyesWhat changed in this file.2
findingsarray of objectyesIssues the reviewer did not fix.2
findings[].filestring or nullnoRepo-relative path, or null when there is no location.2
findings[].lineinteger or nullno1-based line, or null when there is no location.2
findings[].messagestringyesWhat is still wrong.2
findings[].rulestringyesRule id.2
findings[].severityenum blocker, major, minor, infoyesHow serious the remaining issue is.2
notesarray of objectyesOne answer per human note.2
notes[].actionenum addressed, declined, deferredyesHow the reviewer handled the note.2
notes[].idstringyesid from request.human_notes.2
notes[].replystringyesReply stored as a run.note effect.2

Review match pairs (GF-125)

Pairs a custom matcher returns for one review-benchmark try. mode is match. bug is a planted-bug id. finding is the 0-based index into the findings array from the request.

NameTypeRequiredDescriptionSince
pairsarray of objectyesOne-to-one matches of planted bugs to findings.2
pairs[].bugstringyesPlanted-bug id from the request.2
pairs[].findingintegeryes0-based index of the matched finding.2

Review output (GF-100)

JSON the review step extracts after it reads the diff.

NameTypeRequiredDescriptionSince
findingsarray of objectyesFindings the reviewer reported. Each item is one issue.2

Candidate selection (GF-129)

The winner picked by a select step after a candidates stage. choice is a candidate number, or null when none qualify.

NameTypeRequiredDescriptionSince
choiceinteger or nullno1-based candidate number to gather, or null to fail the stage.2
rationalestringnoWhy this candidate was chosen, or why none were.2

Triage assessments (GF-112)

Per-item assessments returned by triage-assess. Role cannot be needs-triage.

NameTypeRequiredDescriptionSince
assessmentsarray of objectyesOne assessment per item in the group.2
assessments[].claimsarray of objectnoClaims from the item and whether they hold.2
assessments[].claims[].claimstringyesThe claim taken from the item.2
assessments[].claims[].evidencestringnoWhy the assessment judged the claim that way.2
assessments[].claims[].holdsenum true, false, unclearyesWhether the claim holds.2
assessments[].difficultyenum small, medium, largeyesHow large the change is.2
assessments[].idstringyesItem id.2
assessments[].questionsarray of stringnoQuestions to ask when role is needs-info.2
assessments[].relevant_filesarray of stringnoRepo-relative paths that matter for the item.2
assessments[].rolestringyesneeds-info, ready-for-agent, ready-for-human, or wontfix.2
assessments[].verdictstringyesShort verdict, at most 500 characters.2

Triage groups (GF-112)

Root-cause groups returned by triage-group. Every item id appears in exactly one group. A group of one is fine.

NameTypeRequiredDescriptionSince
groupsarray of objectyesGroups of items that share a root cause.2
groups[].itemsarray of stringyesItem ids in this group.2
groups[].root_causestringyesOne line naming the shared cause.2

On this page