diff --git a/.github/graders/daily-file-diet-operational-value.fixtures.json b/.github/graders/daily-file-diet-operational-value.fixtures.json new file mode 100644 index 00000000000..fb98a366d06 --- /dev/null +++ b/.github/graders/daily-file-diet-operational-value.fixtures.json @@ -0,0 +1,168 @@ +[ + { + "name": "attained", + "request": { + "schemaVersion": 1, + "run": { + "id": "1", + "attempt": 1, + "repository": "github/gh-aw", + "workflow": "Daily File Diet", + "ref": "refs/heads/main", + "sha": "e66253707f1ded80c55776708ca514d8f9448140", + "eventName": "schedule" + }, + "event": {}, + "outputs": [ + { + "type": "create_issue", + "title": "Split import field extraction into focused modules", + "body": "### Overview\n\n`pkg/parser/import_field_extractor.go` has 1152 lines.\n\n### Refactoring Strategy\n\nSplit parsing, validation, and rendering responsibilities.\n\n
Test Coverage Plan\n\nAdd focused tests for each module.\n\n
\n\n### Acceptance Criteria\n\n- [ ] Existing behavior is preserved." + } + ], + "config": { + "verification": true, + "subject": { + "path": "pkg/parser/import_field_extractor.go", + "lines": 1152 + } + } + }, + "expected": [ + { + "id": "file-diet-decision-conformance", + "value": 1 + }, + { + "id": "largest-file-under-threshold", + "value": 0 + } + ] + }, + { + "name": "missed", + "request": { + "schemaVersion": 1, + "run": { + "id": "2", + "attempt": 1, + "repository": "github/gh-aw", + "workflow": "Daily File Diet", + "ref": "refs/heads/main", + "sha": "e66253707f1ded80c55776708ca514d8f9448140", + "eventName": "schedule" + }, + "event": {}, + "outputs": [ + { + "type": "noop", + "message": "No refactoring needed." + } + ], + "config": { + "verification": true, + "subject": { + "path": "pkg/parser/import_field_extractor.go", + "lines": 1152 + } + } + }, + "expected": [ + { + "id": "file-diet-decision-conformance", + "value": 0 + }, + { + "id": "largest-file-under-threshold", + "value": 0 + } + ] + }, + { + "name": "noop", + "request": { + "schemaVersion": 1, + "run": { + "id": "3", + "attempt": 1, + "repository": "github/gh-aw", + "workflow": "Daily File Diet", + "ref": "refs/heads/main", + "sha": "e66253707f1ded80c55776708ca514d8f9448140", + "eventName": "schedule" + }, + "event": {}, + "outputs": [ + { + "type": "noop", + "message": "All files are healthy. Largest file: pkg/workflow/compiler.go (799 lines). No refactoring needed today." + } + ], + "config": { + "verification": true, + "subject": { + "path": "pkg/workflow/compiler.go", + "lines": 799 + } + } + }, + "expected": [ + { + "id": "file-diet-decision-conformance", + "value": 1 + }, + { + "id": "largest-file-under-threshold", + "value": 1 + } + ] + }, + { + "name": "unavailable", + "request": { + "schemaVersion": 1, + "run": { + "id": "4", + "attempt": 1, + "repository": "other/repository", + "workflow": "Daily File Diet", + "ref": "refs/heads/main", + "sha": "e66253707f1ded80c55776708ca514d8f9448140", + "eventName": "schedule" + }, + "event": {}, + "outputs": [], + "config": {} + }, + "expected": [ + { + "id": "file-diet-decision-conformance", + "value": null + }, + { + "id": "largest-file-under-threshold", + "value": null + } + ] + }, + { + "name": "malformed", + "request": { + "schemaVersion": "one", + "run": {}, + "event": [], + "outputs": {}, + "config": [] + }, + "expected": [ + { + "id": "file-diet-decision-conformance", + "value": null + }, + { + "id": "largest-file-under-threshold", + "value": null + } + ] + } +] diff --git a/.github/graders/daily-file-diet-operational-value.sh b/.github/graders/daily-file-diet-operational-value.sh index acb8e8d23fa..1060c82f2ea 100755 --- a/.github/graders/daily-file-diet-operational-value.sh +++ b/.github/graders/daily-file-diet-operational-value.sh @@ -1,395 +1,157 @@ #!/usr/bin/env bash +# Ultimate goal: decompose oversized Go files into focused files while +# preserving behavior and improving tests. +# Selected grading-time effect: verify that one repository scan requests the +# action required by the largest non-test pkg/**/*.go file at the run SHA. +# Stronger effects are unavailable here: this workflow does not refactor code, +# and the grader runs before the safe-output job applies a requested issue. +# Metrics: +# - file-diet-decision-conformance (primary): 1 for the correct target-bound +# issue/noop, 0 for an observed missing or contradictory decision, and null +# when the run or repository evidence is unavailable or malformed. +# - largest-file-under-threshold: 1 when the largest file is below 800 lines, +# 0 when it is at least 800 lines, and null when the scan is unavailable. + set -euo pipefail export LC_ALL=C -REPOSITORY=github/gh-aw +REPOSITORY="github/gh-aw" WORKFLOW_NAME="Daily File Diet" -THRESHOLD_LINES=1000 -TARGET_LINES=500 -MATURATION_SECONDS=172800 - -tmp_dir=$(mktemp -d "${TMPDIR:-/tmp}/daily-file-diet-operational-value.XXXXXX") -trap 'rm -rf "$tmp_dir"' EXIT HUP INT TERM - -local_repo_root='' -if command -v git >/dev/null 2>&1; then - local_repo_root=$(git rev-parse --show-toplevel 2>/dev/null || true) -fi - -definition() { - cat <<'JSON' -{ - "schemaVersion": 4, "grader": "operational-value", - "repository": "github/gh-aw", "workflowName": "Daily File Diet", - "sourcePath": ".github/workflows/daily-file-diet.md", - "adoption": {"commit": "1186030a620f4113f655c156bedf70cf2c164f79", "adoptedAt": "2025-11-15T13:36:21Z"}, - "operationalValue": "Decompose the run's largest oversized non-test Go file toward 500 lines.", - "evidence": { - "opportunity": "Largest non-test pkg/**/*.go blob at the run commit; below 1000 is healthy.", - "assignment": "Greatest wc -l, reverse lexical tie-break. Key: go-file: or repository-health:non-test-go-under-1000; duplicates repeat.", - "accepted": "Git evidence of assigned-path reduction toward 500 lines or tree-proven absence; issues and traces are excluded.", - "repositories": ["github/gh-aw"], - "collection": "With contents:read, count newlines in the run commit archive for assignment and in the cutoff commit blob for evidence.", - "maturation": "Two days; five pre-adoption issue/PR pairs (#1636-#3564) took 0.04-0.84 days.", - "zeroRule": "No reduction from the initial oversized file scores 0.", - "missingRule": "Invalid, unavailable, or truncated Git evidence scores null; tree-proven path absence is attainment." - }, - "primaryMetric": {"id": "assigned-go-file-decomposition", "formula": "initialLines < 1000 => 1; else clamp((initialLines-currentLines)/(initialLines-500),0,1). Proven absence sets currentLines=0.", "direction": "higher_is_better"}, - "diagnosticMetrics": [ - {"id": "largest-file-health", "name": "Largest-file health at assignment", "formula": "min(1, 999 / initialLines) when the assignment archive contains eligible files.", "direction": "higher_is_better", "aggregation": "latest"}, - {"id": "compliant-line-mass-share", "name": "Compliant line-mass share at assignment", "formula": "compliantLines / totalLines when the assignment archive contains eligible files and positive line mass.", "direction": "higher_is_better", "aggregation": "latest"} - ], - "baseline": {"mode": "attainment-only", "value": null, "evidenceCutoff": null, "provenance": []}, - "validationExamples": { - "targetAttained": {"valid":true,"initialLines":1907,"currentLines":500,"thresholdLines":1000,"targetLines":500}, - "targetMissed": {"valid":true,"initialLines":1907,"currentLines":1907,"thresholdLines":1000,"targetLines":500}, - "missing": {"valid":false}, - "malformed": {"valid":"yes","initialLines":"1907"} - } -} -JSON -} - -metric() { - local evidence - evidence=$(cat) - if ! printf '%s\n' "$evidence" | jq -e . >/dev/null 2>&1; then - printf 'null\n' - return - fi - - printf '%s\n' "$evidence" | jq ' - if .valid != true or ([.initialLines,.currentLines,.thresholdLines,.targetLines]|all(.[];type=="number")|not) - or .initialLines<0 or .currentLines<0 or .targetLines<0 or .thresholdLines<=.targetLines then null - elif .initialLines<.thresholdLines then 1 - elif .initialLines<=.targetLines then null - else ((.initialLines-.currentLines)/(.initialLines-.targetLines)) as $v - | if $v<0 then 0 elif $v>1 then 1 else $v end - end' -} - -normalize_timestamp() { - jq -nr --arg timestamp "$1" ' - ($timestamp | sub("\\.[0-9]+Z$"; "Z")) as $normalized - | if ($normalized | test("^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$")) - and (try (($normalized | fromdateiso8601 | todateiso8601) == $normalized) catch false) - then $normalized - else error("invalid timestamp") - end - ' 2>/dev/null -} - -timestamp_epoch() { - jq -nr --arg timestamp "$1" '$timestamp | fromdateiso8601' -} - -add_seconds() { - jq -nr --arg timestamp "$1" --argjson seconds "$2" \ - '$timestamp | fromdateiso8601 + $seconds | todateiso8601' -} +THRESHOLD_LINES=800 -github_api() { - gh api "$@" 2>"$tmp_dir/gh-api-error" -} - -blob_line_count() { - local repository=$1 blob_sha=$2 output=$3 - - if ! github_api -H "Accept: application/vnd.github.raw+json" \ - "repos/$repository/git/blobs/$blob_sha" >"$output"; then - return 1 - fi - wc -l <"$output" | tr -d ' ' -} - -load_tree() { - local repository=$1 commit_sha=$2 output=$3 - - if ! github_api "repos/$repository/git/trees/$commit_sha?recursive=1" >"$output"; then - return 1 - fi - jq -e '.truncated == false and (.tree | type == "array")' "$output" >/dev/null -} - -assign_case() { - local repository=$1 commit_sha=$2 - local archive_file="$tmp_dir/assignment-archive.tar.gz" - local extract_dir="$tmp_dir/assignment-archive" - local root_dir path lines - local largest_path='' largest_lines=-1 - local eligible_file_count=0 total_lines=0 compliant_lines=0 - - mkdir -p "$extract_dir" - if [[ -n $local_repo_root ]] \ - && git -C "$local_repo_root" cat-file -e "$commit_sha^{commit}" 2>/dev/null; then - git -C "$local_repo_root" archive "$commit_sha" -- pkg | tar -xf - -C "$extract_dir" || return 1 - root_dir=$extract_dir - else - github_api -H "Accept: application/vnd.github+json" \ - "repos/$repository/tarball/$commit_sha" >"$archive_file" || return 1 - tar -xzf "$archive_file" -C "$extract_dir" || return 1 - root_dir=$(find "$extract_dir" -mindepth 1 -maxdepth 1 -type d -print -quit) - fi - [[ -n $root_dir && -d $root_dir/pkg ]] || return 1 - - while IFS= read -r -d '' path; do - lines=$(wc -l <"$root_dir/$path" | tr -d ' ') || return 1 - eligible_file_count=$((eligible_file_count + 1)) - total_lines=$((total_lines + lines)) - if (( lines < THRESHOLD_LINES )); then - compliant_lines=$((compliant_lines + lines)) - fi - if (( lines > largest_lines )) \ - || { (( lines == largest_lines )) && [[ $path > $largest_path ]]; }; then - largest_path=$path - largest_lines=$lines - fi - done < <(cd "$root_dir" && find pkg -type f -name '*.go' ! -name '*_test.go' -print0) - - [[ -n $largest_path ]] || return 1 +emit_metrics() { + local primary=$1 healthy=$2 jq -cn \ - --arg path "$largest_path" \ - --argjson initialLines "$largest_lines" \ - --argjson thresholdLines "$THRESHOLD_LINES" \ - --argjson targetLines "$TARGET_LINES" \ - --argjson eligibleFileCount "$eligible_file_count" \ - --argjson totalLines "$total_lines" \ - --argjson compliantLines "$compliant_lines" \ - --arg subjectSha "$commit_sha" \ - '{path: $path, initialLines: $initialLines, thresholdLines: $thresholdLines, - targetLines: $targetLines, subjectSha: $subjectSha, - eligibleFileCount: $eligibleFileCount, totalLines: $totalLines, - compliantLines: $compliantLines}' + --argjson primary "$primary" \ + --argjson healthy "$healthy" \ + '[ + {id: "file-diet-decision-conformance", value: $primary}, + {id: "largest-file-under-threshold", value: $healthy} + ]' } -case_diagnostics() { - local case_json=$1 current_lines=$2 - - printf '%s\n' "$case_json" | jq -c \ - --argjson currentLines "$current_lines" \ - --argjson healthyLimit "$((THRESHOLD_LINES - 1))" ' - { - "largest-file-health": - (if (.initialLines | type) == "number" and .initialLines > 0 - then ([1, ($healthyLimit / .initialLines)] | min) else null end), - "compliant-line-mass-share": - (if (.eligibleFileCount | type) == "number" and .eligibleFileCount > 0 - and (.totalLines | type) == "number" and .totalLines > 0 - and (.compliantLines | type) == "number" - then (.compliantLines / .totalLines) else null end), - currentLines: $currentLines - }' -} - -latest_commit_at_cutoff() { - local repository=$1 cutoff=$2 - local repository_json default_branch commits_json local_commit - - if [[ -n $local_repo_root ]] \ - && git -C "$local_repo_root" show-ref --verify --quiet refs/remotes/origin/main; then - local_commit=$(git -C "$local_repo_root" rev-list -1 --before="$cutoff" refs/remotes/origin/main) || return 1 - if [[ -n $local_commit ]]; then - printf '%s\n' "$local_commit" - return - fi - fi - - repository_json=$(github_api "repos/$repository") || return 1 - default_branch=$(printf '%s\n' "$repository_json" | jq -er '.default_branch | select(type == "string" and length > 0)') \ - || return 1 - commits_json=$(github_api -X GET "repos/$repository/commits" \ - -f sha="$default_branch" -f until="$cutoff" -f per_page=1) || return 1 - printf '%s\n' "$commits_json" | jq -er '.[0].sha | select(type == "string" and test("^[0-9a-f]{40}$"))' -} - -emit_null() { - local opportunity_key=$1 case_json=$2 evidence_cutoff=$3 matures_at=$4 reason=$5 - - jq -cn \ - --arg opportunityKey "$opportunity_key" \ - --argjson case "$case_json" \ - --arg evidenceCutoff "$evidence_cutoff" \ - --arg maturesAt "$matures_at" \ - --arg reason "$reason" \ - '{value: null, opportunityKey: $opportunityKey, case: $case, - evidenceCutoff: $evidenceCutoff, maturesAt: $maturesAt, - provenance: [], diagnostics: {missingReason: $reason}}' -} - -grade_run() { - local request run_id repository workflow run_sha created_at evidence_at - local matures_at evidence_cutoff evidence_epoch matures_epoch - local case_json path initial_lines opportunity_key evidence value diagnostics - local cutoff_commit blob_sha current_lines - local tree_file="$tmp_dir/cutoff-tree.json" - local blob_file="$tmp_dir/cutoff-blob" - - request=$(cat) - if ! printf '%s\n' "$request" | jq -e ' +request=$(cat) +if ! printf '%s\n' "$request" | jq -e \ + --arg repository "$REPOSITORY" \ + --arg workflow "$WORKFLOW_NAME" ' .schemaVersion == 1 - and (.run.id | type == "string" and length > 0) - and (.run.repository | type == "string") - and (.run.workflow | type == "string") + and .run.repository == $repository + and .run.workflow == $workflow and (.run.sha | type == "string" and test("^[0-9a-f]{40}$")) - and (.run.createdAt | type == "string") - and (.evidenceAt | type == "string") - and (.case == null or (.case | type == "object")) + and (.event | type == "object") + and (.outputs | type == "array") + and (.config | type == "object") ' >/dev/null 2>&1; then - printf '%s\n' '{"value":null,"opportunityKey":"invalid-request","case":{"invalidRequest":true},"evidenceCutoff":"1970-01-01T00:00:00Z","maturesAt":"1970-01-01T00:00:00Z","provenance":[],"diagnostics":{"missingReason":"invalid request"}}' - return - fi - - run_id=$(printf '%s\n' "$request" | jq -r '.run.id') - repository=$(printf '%s\n' "$request" | jq -r '.run.repository') - workflow=$(printf '%s\n' "$request" | jq -r '.run.workflow') - run_sha=$(printf '%s\n' "$request" | jq -r '.run.sha') - created_at=$(printf '%s\n' "$request" | jq -r '.run.createdAt') - evidence_at=$(printf '%s\n' "$request" | jq -r '.evidenceAt') + emit_metrics null null + exit 0 +fi - if ! created_at=$(normalize_timestamp "$created_at") \ - || ! evidence_at=$(normalize_timestamp "$evidence_at"); then - printf '%s\n' '{"value":null,"opportunityKey":"invalid-timestamp","case":{"invalidTimestamp":true},"evidenceCutoff":"1970-01-01T00:00:00Z","maturesAt":"1970-01-01T00:00:00Z","provenance":[],"diagnostics":{"missingReason":"invalid timestamp"}}' - return - fi +run_sha=$(printf '%s\n' "$request" | jq -r '.run.sha') +subject=$(printf '%s\n' "$request" | jq -c ' + if .config.verification == true then .config.subject else null end +') - matures_at=$(add_seconds "$created_at" "$MATURATION_SECONDS") - evidence_epoch=$(timestamp_epoch "$evidence_at") - matures_epoch=$(timestamp_epoch "$matures_at") - if (( evidence_epoch < matures_epoch )); then - evidence_cutoff=$evidence_at - else - evidence_cutoff=$matures_at +if [[ $subject != null ]]; then + if ! printf '%s\n' "$subject" | jq -e ' + (.path | type == "string" and test("^pkg/.+\\.go$") and (endswith("_test.go") | not)) + and (.lines | type == "number" and . >= 0 and floor == .) + ' >/dev/null 2>&1; then + emit_metrics null null + exit 0 fi + largest_path=$(printf '%s\n' "$subject" | jq -r '.path') + largest_lines=$(printf '%s\n' "$subject" | jq -r '.lines') +else + tmp_dir=$(mktemp -d "${TMPDIR:-/tmp}/daily-file-diet-operational-value.XXXXXX") + trap 'rm -rf "$tmp_dir"' EXIT HUP INT TERM + extract_dir="$tmp_dir/repository" + mkdir -p "$extract_dir" - if [[ $repository != "$REPOSITORY" || $workflow != "$WORKFLOW_NAME" ]]; then - emit_null "run:$run_id" '{"assignmentMissing":true}' "$evidence_cutoff" "$matures_at" \ - "run repository or workflow does not match the frozen contract" - return + repo_root='' + if command -v git >/dev/null 2>&1; then + repo_root=$(git rev-parse --show-toplevel 2>/dev/null || true) fi - case_json=$(printf '%s\n' "$request" | jq -c '.case') - if [[ $case_json == null ]]; then - if ! case_json=$(assign_case "$repository" "$run_sha"); then - emit_null "run:$run_id" '{"assignmentMissing":true}' "$evidence_cutoff" "$matures_at" \ - "assignment-unavailable" - return + snapshot_root='' + if [[ -n $repo_root ]] && git -C "$repo_root" cat-file -e "$run_sha^{commit}" 2>/dev/null; then + if git -C "$repo_root" archive "$run_sha" -- pkg | tar -xf - -C "$extract_dir"; then + snapshot_root=$extract_dir + fi + elif command -v gh >/dev/null 2>&1; then + archive_file="$tmp_dir/repository.tar.gz" + if gh api -H "Accept: application/vnd.github+json" \ + "repos/$REPOSITORY/tarball/$run_sha" >"$archive_file" 2>"$tmp_dir/gh-api-error" \ + && tar -xzf "$archive_file" -C "$extract_dir"; then + snapshot_root=$(find "$extract_dir" -mindepth 1 -maxdepth 1 -type d -print -quit) fi - elif ! printf '%s\n' "$case_json" | jq -e \ - --argjson threshold "$THRESHOLD_LINES" \ - --argjson target "$TARGET_LINES" ' - (.path | type == "string" and test("^pkg/.*\\.go$") and (endswith("_test.go") | not)) - and (.initialLines | type == "number" and . >= 0 and floor == .) - and .thresholdLines == $threshold - and .targetLines == $target - and (.subjectSha | type == "string" and test("^[0-9a-f]{40}$")) - and ((has("eligibleFileCount") | not) or (.eligibleFileCount | type == "number" and . >= 0 and floor == .)) - and ((has("totalLines") | not) or (.totalLines | type == "number" and . >= 0 and floor == .)) - and ((has("compliantLines") | not) or (.compliantLines | type == "number" and . >= 0 and floor == .)) - ' >/dev/null; then - emit_null "run:$run_id" '{"assignmentMissing":true}' "$evidence_cutoff" "$matures_at" \ - "invalid-case" - return fi - path=$(printf '%s\n' "$case_json" | jq -r '.path') - initial_lines=$(printf '%s\n' "$case_json" | jq -r '.initialLines') - if (( initial_lines < THRESHOLD_LINES )); then - opportunity_key="repository-health:non-test-go-under-1000" - evidence=$(jq -cn \ - --argjson initialLines "$initial_lines" \ - --argjson thresholdLines "$THRESHOLD_LINES" \ - --argjson targetLines "$TARGET_LINES" \ - '{valid: true, initialLines: $initialLines, currentLines: $initialLines, thresholdLines: $thresholdLines, targetLines: $targetLines}') - value=$(printf '%s\n' "$evidence" | metric) - diagnostics=$(case_diagnostics "$case_json" "$initial_lines") - jq -cn \ - --argjson value "$value" \ - --arg opportunityKey "$opportunity_key" \ - --argjson case "$case_json" \ - --arg evidenceCutoff "$evidence_cutoff" \ - --arg maturesAt "$matures_at" \ - --arg repository "$repository" \ - --arg sha "$run_sha" \ - --argjson diagnostics "$diagnostics" \ - '{value: $value, opportunityKey: $opportunityKey, case: $case, - evidenceCutoff: $evidenceCutoff, maturesAt: $maturesAt, - provenance: [{repository: $repository, kind: "git-tree", ref: $sha}], - diagnostics: ($diagnostics + {repositoryHealthyAtAssignment: true})}' - return + if [[ -z $snapshot_root || ! -d $snapshot_root/pkg ]]; then + emit_metrics null null + exit 0 fi - opportunity_key="go-file:$path" - if ! cutoff_commit=$(latest_commit_at_cutoff "$repository" "$evidence_cutoff"); then - emit_null "$opportunity_key" "$case_json" "$evidence_cutoff" "$matures_at" \ - "cutoff-commit-unavailable" - return - fi - if [[ -n $local_repo_root ]] \ - && git -C "$local_repo_root" cat-file -e "$cutoff_commit^{commit}" 2>/dev/null; then - if git -C "$local_repo_root" cat-file -e "$cutoff_commit:$path" 2>/dev/null; then - current_lines=$(git -C "$local_repo_root" show "$cutoff_commit:$path" | wc -l | tr -d ' ') || return 1 - else - current_lines=0 - fi - else - if ! load_tree "$repository" "$cutoff_commit" "$tree_file"; then - emit_null "$opportunity_key" "$case_json" "$evidence_cutoff" "$matures_at" \ - "cutoff-tree-unavailable" - return + largest_path='' + largest_lines=-1 + while IFS= read -r -d '' source_file; do + relative_path=${source_file#"$snapshot_root/"} + line_count=$(wc -l <"$source_file" | tr -d ' ') + if (( line_count > largest_lines )) \ + || { (( line_count == largest_lines )) && [[ $relative_path > $largest_path ]]; }; then + largest_path=$relative_path + largest_lines=$line_count fi + done < <(find "$snapshot_root/pkg" -type f -name '*.go' ! -name '*_test.go' -print0) - blob_sha=$(jq -r --arg path "$path" \ - '.tree[] | select(.type == "blob" and .path == $path) | .sha' "$tree_file") - if [[ -z $blob_sha ]]; then - current_lines=0 - elif ! current_lines=$(blob_line_count "$repository" "$blob_sha" "$blob_file"); then - emit_null "$opportunity_key" "$case_json" "$evidence_cutoff" "$matures_at" \ - "blob-unavailable" - return - fi + if [[ -z $largest_path || $largest_lines -lt 0 ]]; then + emit_metrics null null + exit 0 fi +fi - evidence=$(jq -cn \ - --argjson initialLines "$initial_lines" \ - --argjson currentLines "$current_lines" \ - --argjson thresholdLines "$THRESHOLD_LINES" \ - --argjson targetLines "$TARGET_LINES" \ - '{valid: true, initialLines: $initialLines, currentLines: $currentLines, thresholdLines: $thresholdLines, targetLines: $targetLines}') - value=$(printf '%s\n' "$evidence" | metric) - diagnostics=$(case_diagnostics "$case_json" "$current_lines") - jq -cn \ - --argjson value "$value" \ - --arg opportunityKey "$opportunity_key" \ - --argjson case "$case_json" \ - --arg evidenceCutoff "$evidence_cutoff" \ - --arg maturesAt "$matures_at" \ - --arg repository "$repository" \ - --arg cutoffCommit "$cutoff_commit" \ - --arg path "$path" \ - --argjson currentLines "$current_lines" \ - --argjson diagnostics "$diagnostics" \ - '{value: $value, opportunityKey: $opportunityKey, case: $case, - evidenceCutoff: $evidenceCutoff, maturesAt: $maturesAt, - provenance: [{repository: $repository, kind: "git-commit", ref: $cutoffCommit}, - {repository: $repository, kind: "go-source", ref: ($path + "@" + $cutoffCommit)}], - diagnostics: $diagnostics}' -} +if (( largest_lines < THRESHOLD_LINES )); then + healthy=1 +else + healthy=0 +fi + +line_label="$largest_lines lines" +if (( healthy == 1 )); then + output_valid=$(printf '%s\n' "$request" | jq -r \ + --arg path "$largest_path" \ + --arg lineLabel "$line_label" ' + if (.outputs | length) != 1 then false + else .outputs[0] as $output + | ($output.type == "noop") + and ($output.message | type == "string" and length > 0) + and ($output.message | contains($path)) + and ($output.message | contains($lineLabel)) + and ($output.message | ascii_downcase | test("healthy|no refactoring")) + end + ') +else + output_valid=$(printf '%s\n' "$request" | jq -r \ + --arg path "$largest_path" \ + --arg lineLabel "$line_label" ' + if (.outputs | length) != 1 then false + else .outputs[0] as $output + | ($output.type == "create_issue") + and ($output.title | type == "string" and length > 0) + and ($output.body | type == "string" and length > 0) + and ($output.body | contains($path)) + and ($output.body | contains($lineLabel)) + and ($output.body | test("(?i)refactoring strategy")) + and ($output.body | test("(?i)test coverage")) + and ($output.body | test("(?i)acceptance criteria")) + end + ') +fi -case ${1:-} in - --definition) - definition - ;; - --metric) - metric - ;; - --grade-run) - grade_run - ;; - *) - printf 'usage: %s --definition|--metric|--grade-run\n' "$0" >&2 - exit 1 - ;; -esac +if [[ $output_valid == true ]]; then + emit_metrics 1 "$healthy" +else + emit_metrics 0 "$healthy" +fi diff --git a/.github/skills/operational-value-designer/SKILL.md b/.github/skills/operational-value-designer/SKILL.md index 11e46b12050..f0681addbfb 100644 --- a/.github/skills/operational-value-designer/SKILL.md +++ b/.github/skills/operational-value-designer/SKILL.md @@ -1,65 +1,271 @@ --- name: operational-value-designer -description: "Design and verify a deterministic operational-value grader for a GitHub Agentic Workflow. Use for per-run operational value, evidence attribution, maturation, baselines, and operational-value evaluators. Usage: /operational-value-designer OWNER/REPO WORKFLOW-NAME." +description: "Design and verify a deterministic operational-value grader for any GitHub Agentic Workflow. Use when reasoning from workflow goals to measurable downstream outcomes, defining repository evidence, choosing outcome metrics, or creating an operational-value evaluator. Usage: /operational-value-designer OWNER/REPO WORKFLOW-NAME." argument-hint: "OWNER/REPO WORKFLOW-NAME" -allowed-tools: bash jq gh metadata: - version: "1.0.0" + version: "2.0.0" --- -# Operational Value Grader +# Operational Value Designer -Design one deterministic `operational-value` grader that reports absolute operational attainment for each workflow run. Keep exactly one authoritative primary value, and declare any normalized diagnostic metrics separately. +Design the smallest deterministic grader that measures whether one workflow run produced its intended operational outcome. Put domain knowledge in the evaluator, not in generic runtime infrastructure. -Operational value is the degree to which the workflow's intended repository outcome is attained for the opportunity assigned to a run, demonstrated by accepted repository evidence under a frozen contract. It is not execution quality, output volume, safe-output creation, or an agent's assessment. +Operational value is demonstrated progress toward the workflow's intended real-world or repository outcome. It is not agent activity, token usage, output volume, tool usage, or an agent's claim that it succeeded. -## Output +The core task is semantic translation: -Create one executable evaluator at: +```text +workflow title + description + intent + effective instructions + -> real goal and applicable subject + -> observable evidence + -> deterministic per-run metric function +``` + +The evaluator belongs to one workflow and runs whenever that workflow is graded. It must measure that workflow's goal for the current run. It is not a generic safe-output checker: safe outputs are only one possible evidence source and may be irrelevant, insufficient, or merely an intermediate request. + +## Deliverables + +Choose one evaluator form. For a compact evaluator, embed the complete Bash program in the workflow so it travels with the Markdown: + +```yaml +graders: + operational-value: + name: Domain Outcome Conformance + description: Whether the current run produced the required domain outcome + unit: ratio + direction: higher_is_better + script: | + #!/usr/bin/env bash + set -euo pipefail + request=$(cat) + # Compute and print the ordered metric array. +``` + +For a larger evaluator, create one executable file at: ```text .github/graders/WORKFLOW-NAME-operational-value.sh ``` -Configure the workflow: +and configure the workflow: ```yaml graders: operational-value: + name: Domain Outcome Conformance + description: Whether the current run produced the required domain outcome + unit: ratio + direction: higher_is_better run: .github/graders/WORKFLOW-NAME-operational-value.sh ``` -The grader's primary operational value (`value`) is absolute attainment in `[0,1]`. A comparable frozen baseline may be reported separately as `baselineValue`; gh-aw derives `deltaFromBaseline`. Never define the primary operational value as a difference from baseline. +Always set a concise `name`, `description`, `unit`, and `direction` for the primary metric. At the top of the evaluator, comment the workflow intent and the meaning of every emitted metric, including its `1`, `0`, and `null` interpretations. These comments are frozen and archived with the evaluator bytes, preserving review context without adding a definition mode or a second metadata schema. + +Specify exactly one of `script` or `run`. Use this decision rule: + +- Choose `script` for compact, workflow-specific Bash that remains easy to review inside the Markdown and can be covered by the workflow's tests. +- Choose `run` when the Bash is large enough to obscure the workflow, is maintained or reused independently, or benefits from dedicated semantic fixtures and shell tooling. + +The operational-value evaluator limit is **65,536 UTF-8 bytes, inclusive**, for both forms. `run` does not permit a larger evaluator. This differs from ordinary custom inline JavaScript graders, whose limit is **4,096 Unicode characters, inclusive**. + +Both forms are frozen into the compiled workflow, archived with the run, and identified by the same SHA-256 digest. They produce the same GitHub Actions execution payload, so `run` does not reduce the generated workflow size; Base64 transport adds roughly 33% to the evaluator bytes in either case. Choose by readability and testability, not Actions payload size. If an evaluator exceeds 65,536 bytes, simplify its evidence logic rather than switching forms to bypass the limit. + +For a file-backed evaluator, create exact semantic fixtures at: + +```text +.github/graders/WORKFLOW-NAME-operational-value.fixtures.json +``` + +Each fixture contains exactly `name`, `request`, and `expected`. Include `attained`, `missed`, `unavailable`, and `malformed`; also include `noop` and `inapplicable` when those states exist. Expected metrics must be exact, ordered, and deterministic. For inline Bash, encode equivalent cases in the workflow's tests and compile the workflow before adoption. + +Before implementation, summarize the design in a compact table containing the ultimate goal, outcome ladder, selected measurable effect, why stronger downstream effects are unavailable, primary metric and formula, applicability, success evidence, zero condition, null condition, noop interpretation, adoption point, and required API calls. Surface unresolved ambiguity instead of hiding it in code. ## Design Procedure -1. Validate `OWNER/REPO` and resolve `.github/workflows/WORKFLOW-NAME.md`. Do not infer inputs from the workspace or remotes. -2. Recover adoption-time intent from the workflow's first commit and first parent. Use only adoption-time workflow content and pre-adoption evidence to choose opportunities, accepted evidence, formulas, targets, or a baseline. -3. Define how every workflow run binds to one operational case: - - produce a stable `opportunityKey`; - - prevent overlapping ownership where possible; - - preserve repeated keys when duplicate runs target the same opportunity so downstream analysis can cluster or deduplicate them; - - treat reruns with the same GitHub run ID as the same subject. -4. Freeze accepted evidence, evidence repositories, matching rules, zero-versus-missing behavior, and `maturesAt` computation. - - Declare only the workflow permission scopes required to collect that evidence. The evaluator receives `GH_TOKEN` with the agent job's declared permissions; gh-aw does not add evidence permissions automatically. -5. Choose exactly one direct primary metric in `[0,1]`. Higher must always mean greater attainment. Optional diagnostic metrics may provide normalized outcome context, but must remain separate rather than being combined into the primary value. Keep trace graders and activity counts separate. -6. If comparable pre-adoption evidence exists, score it with the same metric and freeze it under `baseline`. Otherwise use `attainment-only` with a null baseline value. -7. Implement the evaluator interface below and run: +### 1. Resolve workflow intent + +Validate `OWNER/REPO` and resolve `.github/workflows/WORKFLOW-NAME.md`. Do not infer the target repository or workflow from the current checkout, remotes, generated lock files, or similarly named files. + +Read the workflow title or `name`, `description`, canonical top-level `intent:`, effective Markdown body, and prompt imports together. Prefer an explicit `intent:` when these sources conflict. Recover: + +- the subject the workflow acts on; +- the ultimate repository or operational condition it is meant to improve; +- the causal path from the workflow's immediate action to that downstream condition; +- explicit success conditions; +- conditions where doing nothing is correct. + +Use `evals`, deterministic steps, custom jobs, and safe outputs only as corroborating evidence. Triggers, tools, permissions, and output types describe mechanics; they do not define value by themselves. Never equate “requested a safe output” with “achieved the workflow's goal” unless the Markdown makes that request itself the intended outcome and its required content can be verified. + +Resolve referenced prompt or policy files that materially define the goal. If an import is unavailable, report the missing authority instead of guessing. Treat generated files, caches, prior reports, and model output as evidence, not as normative truth, unless the workflow explicitly designates them as authoritative. + +Write two sentences before choosing a metric: + +> Ultimately, this workflow creates value when ... +> +> For this run, the strongest attributable effect observable at grading time is ... + +If either sentence cannot be completed from authoritative workflow content and available evidence, stop and report the ambiguity instead of inventing a metric. + +Translate the sentence into a function before writing shell code: + +```text +f(run, event, config, observable evidence) -> [{id, value}, ...] +``` + +For every input, the function must define whether the run was applicable and whether the result is attained, missed, correctly restrained, or unavailable. The implementation should be a direct encoding of this function. + +### 2. Identify the valuable effect + +First define the unit being evaluated: one event, one issue or pull request, one repository scan, one batch of eligible items, or another subject named by the workflow. Do not default to “one emitted output.” A scheduled monitoring run can be applicable even when it finds no unhealthy items because the repository scan itself is the subject; an item-processing run with no eligible items is usually not applicable. + +If the workflow intentionally samples, caps, or rotates through a larger population, state whether the limit defines the intended sample or is only an execution safety cap. A declared sampling rule defines the unit and denominator; a safety cap does not make unprocessed eligible items disappear. Name and interpret a sample metric at that scope; do not extrapolate it to the whole repository. + +For workflows driven by user input, bind the unit to that exact target. An otherwise valid result for a different issue, URL, repository, ref, theme, or requested mode scores `0`. + +Do not begin with the workflow's output type and turn its presence into the metric. First build an outcome ladder from the goal back toward execution: + +```text +ultimate operational condition + <- durable downstream outcome + <- applied repository or service change + <- accepted or verifiable requested action + <- execution activity +``` + +Adapt the ladder to the domain; not every workflow has every rung. For each rung, ask whether the effect is observable at grading time, attributable to this run or its exact subject, and independently verifiable. Select the furthest downstream rung that satisfies all three. Walk backward only when a stronger rung fails one of those tests, and record the specific evidence gap. Easy-to-count outputs and workflow mechanics must not displace a measurable downstream effect. + +Typical measurable effects, strongest first, are: + +1. **Durable outcome already established**: completed release, repository mutation, validated state transition, or another lasting change completed before grading. +2. **Applied intermediate effect**: an accepted issue, merged patch, delivered notification, completed dispatch, or other causal step already proven to have occurred and still attributable to the run. +3. **Verifiable requested action**: a review finding, issue, report, recommendation, patch, dispatch, or noop request whose content and choice satisfy explicit workflow criteria. +4. **Correct restraint**: an explicit noop when an eligible subject exists and evidence proves no action is appropriate. + +Prefer established outcomes over applied intermediate effects, applied effects over requested actions, and requested actions over execution traces. Never reward output merely for existing. A requested issue is valuable only when no stronger downstream effect is currently measurable and it is an independently checkable precursor on the causal path to the ultimate goal. + +Do not confuse the condition being observed with the workflow's value. A security audit, health report, incident monitor, or grader audit can be fully valuable while reporting severe failures. Score whether the workflow correctly detected, represented, and acted on the condition, not whether the condition was healthy. + +No opportunity and correct restraint are different: + +- If no eligible subject or decision existed, the primary metric is `null`. +- If an eligible subject existed and evidence proves that no action was correct, restraint may score `1`. +- Silence, empty output, or an expected historical work rate never proves correct restraint. + +### 3. Define applicable runs and evidence + +State: + +- which runs present a real opportunity for value; +- which evidence proves success; +- which evidence proves a miss; +- when evidence is unavailable and must produce `null`; +- how explicit noop behavior is distinguished from silent failure. - ```bash - .github/skills/operational-value-designer/scripts/verify-operational-value-evaluator.sh .github/graders/WORKFLOW-NAME-operational-value.sh - gh aw compile .github/workflows/WORKFLOW-NAME.md - ``` +Use only evidence attributable to the run or its subject. Avoid repository-wide changes that could have been caused by unrelated work. Do not add historical replay, maturity periods, baselines, provenance schemas, caches, or opportunity identifiers unless the workflow's own metric genuinely requires them. -## Evaluator Interface +The function must be actor-independent: identical accepted evidence must receive the same score whether it was produced by this agent, another engine, a person, or deterministic automation. Agent identity, tool choice, and execution trace are not operands unless the workflow explicitly tests that capability. -The evaluator uses Bash 3.2-compatible Bash plus `jq` and supports: +Prefer evidence in this order: -- `--definition`: print the frozen schema-version 4 contract. -- `--metric`: read one evidence object on stdin and print a deterministic number in `[0,1]` or `null`. -- `--grade-run`: read a run request on stdin and print one operational-value observation. +1. the event payload and run subject; +2. already materialized workflow inputs, outputs, and safe-output requests; +3. repository state at the run SHA; +4. narrowly scoped GitHub API reads needed to fill a specific gap. -`--grade-run` receives: +Do not re-fetch data already captured with sufficient fidelity. For batch workflows, define the eligible set and denominator from one consistent snapshot. Do not use historical expectations, another model's findings, the evaluator's own output, or the workflow's confidence as ground truth. + +Whenever the metric judges a workflow decision, derive the expected decision independently from source evidence and compare it with the observed workflow request. Do not accept the workflow's explanation as proof that its decision was correct. Existing `evals` are evidence only for the exact predicate they evaluate; an eval that checks whether output exists does not prove that output is accurate. + +When evidence sources conflict, apply an explicit precedence justified by the workflow or return `null`; never choose whichever source produces a better score. Validate current-run caches and precomputed files for their expected completion marker, count, or schema before using them. If an expected batch snapshot is missing, stale, truncated, capped, or only partially parsed, return `null` rather than silently shrinking the denominator. Apply intentional eligibility filters before fixing the denominator, then count every eligible item whether processed or missed. + +A declared sampling rule bounds the selected set; items outside that intentional sample are not misses. An execution safety cap does not shrink the eligible denominator: score the complete eligible set when evidence supports it, or return `null` when the cap prevents complete evaluation. Within the selected set, compare the complete expected action set with the complete observed request set. This is mandatory for destructive actions such as closing, deleting, relabeling, or superseding items: an unjustified extra mutation is a miss, not partial credit. + +For time-based eligibility, use one declared UTC reference instant and define every boundary as inclusive or exclusive. Do not round to dates, use the evaluator's wall clock, or tolerate clock skew unless the workflow explicitly declares that behavior. + +Treat thresholds, tolerances, and policy cutoffs as authoritative only when the workflow or a referenced policy declares them. Do not infer a regression threshold from noisy measurements, tune it against the current result, or invent a historical baseline. If a declared benchmark cannot be reproduced under its required environment and inputs, return `null`. + +Treat retries and repeated schedules as independent runs unless deduplication or idempotence is part of the workflow's stated goal. When it is, independently verify that the repeat should act or noop from current evidence; do not add a generic cross-run identity system. + +For experiment variants, apply the same acceptance function to the declared subject and variant. Grade the current run's outcome, not whether its variant beat another run, unless the workflow supplies a complete fixed comparison dataset and deterministic decision rule at the grading boundary. + +If intended value depends on future events or human judgment unavailable during the run, do not invent a maturation window or silently substitute engagement. Preserve the downstream goal in the design, state the missing evidence, then measure the strongest independently checkable precursor available now and name it honestly. Return `null` when no meaningful deterministic per-run outcome can be observed. + +Dependency failure is `null` when it prevents evidence collection for some other goal. It is `0` when the dependency or permission is itself the capability under test, such as an authentication smoke test. + +### 4. Respect the grading boundary + +The evaluator runs once for the current workflow run. It does not wait for future acceptance, replay history, or revise an observation later. Safe-output requests may be graded before the requested GitHub mutation is applied. + +Therefore: + +- never claim that an issue, pull request, comment, label, or release exists merely because the agent requested it; +- grade the requested action and its content when application has not yet occurred; +- for chained dispatches or downstream workflows, grade only the current run's verifiable dispatch request unless a completed downstream effect is already part of current-run evidence; +- use a durable repository effect only when evidence proves it already occurred; +- describe proposed code changes as requested patches until merge or application is already proven; +- do not query future commits, later incidents, subsequent human reactions, or historical trend windows; +- keep delayed adoption, long-term quality, and causal impact outside the per-run metric. + +When the long-term goal cannot be observed yet, name the immediate metric precisely, such as `actionable-refactor-request` rather than `file-decomposed`. + +### 5. Research domain conventions only when needed + +If the workflow does not make a direct metric clear, inspect at most three targeted external sources for established definitions, denominators, and known measurement failures in that domain. Prefer primary standards, official documentation, and peer-reviewed or widely accepted technical references. Stop when one authoritative definition and its main failure mode are understood; broad literature review is not part of this task. + +External research may refine what to measure; it must not: + +- override the workflow's stated intent; +- import an industry benchmark without checking that it fits this workflow; +- turn correlation into attribution; +- make external web data a runtime dependency when repository or GitHub evidence is sufficient; +- justify an activity proxy because it is easy to count. + +Adopt an external definition only when all operands and ground truth are observable at the per-run grading boundary. For example, a standard may identify precision and recall as useful dimensions, but neither is a valid per-run metric without independently known true and false cases. + +When research is used, add a short research note to the design table: source URL, definition considered, what was adopted or rejected, and why. Record a source in evaluator comments only when it materially affects the implemented formula. Runtime grading must remain deterministic from the request, repository state, declared GitHub access, and workflow outputs; it must never browse the web for metric design. + +When live external data is itself the workflow's declared subject, such as a model or service inventory, use the workflow's captured response or the narrow declared authoritative API as evidence. Pin the endpoint and required fields in the design, validate completeness, and return `null` on unavailable, truncated, or incompatible responses; do not substitute search results or design-time research. + +### 6. Choose the smallest useful metric set + +Choose one primary metric that answers the intent sentence directly. Use a precise domain name such as `eligible-issues-triaged`, `security-review-policy-conformance`, or `release-request-valid`, not `operational-value` or `success`. Do not name a metric after a stronger claim than its evidence proves. + +Add a diagnostic only when it explains a distinct failure mode and can change an operational decision. Do not combine unrelated outcomes into a weighted score merely to produce one number. If the workflow has independent goals, select the one declared as primary or report the ambiguity. + +Use the simplest defensible formula: + +- binary `0` or `1` for discrete outcomes; +- a proportion with an explicit numerator and denominator for sets; +- bounded progress toward a declared target for continuous outcomes; +- `null` when applicability or evidence cannot be established. + +For proportions, define every numerator and denominator term and prevent missing items from disappearing from the denominator. A quality metric requires independent acceptance criteria or ground truth; the workflow cannot grade its own judgment by counting its findings. + +Translate qualitative words such as “actionable,” “correct,” “relevant,” “complete,” and “high quality” into deterministic predicates grounded in the workflow Markdown. For example, an actionable incident report might require the triggering environment, a failing step, linked evidence, and a concrete remediation. If semantic correctness cannot be determined without another model or later human judgment, narrow the metric to the strongest deterministic claim available, such as `required-incident-analysis-present`, and state that limitation in the design table. + +For creative or aesthetic goals with no objective acceptance criteria, do not manufacture operational value from length, output existence, or model ratings. Measure only explicit structural or target-binding requirements under a narrowly named metric, or report that no meaningful deterministic grader can be designed. + +Validation supports only the property it checks. A passing formatter proves formatting, a focused test proves the tested behavior, and a successful build proves buildability; none alone proves semantic improvement or absence of regressions. Name the metric after the verified property and include every workflow-required check in the expected decision. + +Higher must always mean more value. Keep a metric ID stable while it continues to describe the same outcome. + +Freeze the metric prospectively to prevent hindsight bias: + +- choose the formula, thresholds, evidence rules, and fixtures before inspecting any scored outcomes; +- commit the workflow and its inline evaluator, or the workflow and referenced evaluator file, together; that commit is the adoption point for the pair; +- treat the evaluator as read-only while the workflow's intent and acceptance criteria are unchanged; +- when those workflow semantics change, update the workflow and evaluator together at the same path and commit; the new pair applies only to future runs; +- allow an evaluator-only defect correction only prospectively, without changing or regrading prior results; +- retain the metric ID when the measured outcome still means the same thing; choose a new descriptive ID only when the outcome itself changes; +- score each run with the evaluator bytes and configuration frozen into that run. Never move adoption backward or tune a function against observed scores. + +The workflow commit and evaluator digest preserve each historical pair, including inline Bash extracted from the committed Markdown. The current evaluator may replace the old one in the same field or path. Do not add versioned filenames, registries, or a second provenance service. + +### 7. Implement the evaluator + +Use Bash 3.2-compatible Bash and `jq`. The evaluator runs once, accepts no mode arguments, reads one request from stdin, and writes one result to stdout. + +Input: ```json { @@ -71,80 +277,70 @@ The evaluator uses Bash 3.2-compatible Bash plus `jq` and supports: "workflow": "Workflow name", "ref": "refs/heads/main", "sha": "...", - "eventName": "schedule", - "createdAt": "2026-08-23T11:58:00Z" + "eventName": "issues" }, - "evidenceAt": "2026-08-23T12:00:00.000Z", - "case": null, - "event": null, + "event": {}, + "outputs": [], "config": {} } ``` -It returns: +`outputs` contains the current run's validated safe-output requests from `agent_output.json`. Treat them as requested actions, not proof that the corresponding GitHub mutations were applied. + +Output: ```json -{ - "value": 0.75, - "opportunityKey": "issue:42", - "case": {"issue": 42}, - "evidenceCutoff": "2026-08-23T12:00:00.000Z", - "maturesAt": "2026-08-30T12:00:00.000Z", - "provenance": [ - {"repository": "OWNER/REPO", "kind": "issue", "ref": "42"} - ], - "diagnostics": {"repository-health": 0.8} -} +[ + {"id": "domain-primary-metric", "value": 0.75}, + {"id": "optional-diagnostic", "value": null} +] ``` -The function must cap `evidenceCutoff` at the earlier of `evidenceAt` and `maturesAt`. A run is never intrinsically pending: the operational value is an as-of observation and may be recomputed until maturity. After maturity, the cap makes the result stable. - -## Regrade a Historical Run +The output must be one non-empty ordered array. The first item is primary. Later items are optional diagnostics. Every object must contain exactly `id` and `value`; IDs must be non-empty and unique; values must be finite numbers in `[0,1]` or `null`. -Recompute a run at an explicit evidence time with the same evaluator used by the original run: +The evaluator must: -```bash -gh aw graders operational-value RUN-ID \ - --evidence-at 2026-08-30T12:00:00.000Z \ - --json -``` +- consume stdin once and write only the metric array to stdout; +- write human-readable diagnostics to stderr; +- return the same result for the same evidence; +- use `null`, not zero, for missing or malformed required evidence; +- request no more GitHub permissions or API calls than its evidence requires; +- avoid network calls when local event, repository, or workflow-output evidence is sufficient. +- consume existing validation artifacts instead of repeating expensive builds, browsers, services, or scans; +- never invoke another model or agent to grade the workflow's model or agent output. -Add `--repo [HOST/]OWNER/REPO` to select the GitHub host for the current repository checkout. The command downloads the original grader artifact, reuses its operational case and complete run subject, and refuses to execute unless the archived evaluator matches both digest records and the evaluator at the recorded commit in the trusted checkout. It prints a new observation and never modifies the original artifact. +### 8. Verify and review -## Build a Historical Report - -Build a report across all completed runs from the contract's adoption time: +Run: ```bash -gh aw graders operational-value report WORKFLOW-NAME +.github/skills/operational-value-designer/scripts/verify-operational-value-contract-change.sh BASE-REF +# File-backed evaluator: +.github/skills/operational-value-designer/scripts/verify-operational-value-evaluator.sh \ + .github/graders/WORKFLOW-NAME-operational-value.sh \ + .github/graders/WORKFLOW-NAME-operational-value.fixtures.json +# Both forms: +gh aw compile .github/workflows/WORKFLOW-NAME.md ``` -This writes JSON, SVG, and Markdown artifacts under `reports/operational-value`. It applies the current evaluator digest to every run for comparability and backfills pre-grader runs by passing their run subject with `case: null` and `event: null`. The evaluator must reconstruct assignment from accepted evidence when the case is null. - -Mature numeric results are cached by repository, workflow, evaluator digest, and Monday-based UTC week. Unavailable, immature, and failed evaluations are retried. Independent weeks are evaluated concurrently; use `--concurrency` to control evaluator executions (the default is 8). Use `--refresh` to bypass cached observations, `--until` to choose the evidence endpoint, and `--output` or `--cache-dir` to relocate generated files. - -Reports preserve all run-level points. Weekly primary means retain the latest observation per repeated `opportunityKey` within each week. Declared diagnostics are plotted independently using their `latest` or `mean` aggregation. Missing evidence remains null, and changes over time or from a baseline do not establish causation. - -## Definition Contract - -`--definition` must contain: - -- `schemaVersion: 4` and `grader: "operational-value"`; -- repository, workflow name, source path, and adoption commit/time; -- operational-value statement; -- evidence opportunity, assignment, accepted evidence, repositories, collection, maturation, zero rule, and missing rule; -- one primary metric with formula and validation examples; -- optional `diagnosticMetrics`, each with a unique ID, name, formula, `higher_is_better` direction, and `latest` or `mean` aggregation; -- baseline mode, value, cutoff, and provenance. - -For `baseline-comparable`, baseline value must be in `[0,1]` and have immutable provenance. For `attainment-only`, baseline value and cutoff must be null. - -## Interpretation Rules - -- `value` answers “what operational value did this run attain for its assigned opportunity?” -- `deltaFromBaseline` answers “how far is this observation above or below the frozen pre-adoption reference?” -- Diagnostics provide separate normalized context and never contribute to `value`. -- Neither establishes that the workflow caused the outcome. -- Compare runs only under the same evaluator digest and evidence horizon. -- Identify a replayed observation by `(runId, evaluatorDigest, evidenceAt)`. -- Do not treat repeated observations of one run, duplicate opportunity keys, or overlapping state windows as independent samples. \ No newline at end of file +Review the design against these checks: + +- The intent sentence describes an outcome, not activity. +- The outcome ladder starts from the ultimate goal rather than the configured output type. +- The primary metric uses the furthest downstream effect that is currently observable, attributable, and independently verifiable. +- Any fallback to a precursor states exactly why a stronger downstream effect cannot be measured at the grading boundary. +- Missing evidence for the selected rung returns `null`; it never causes runtime fallback to a weaker rung. +- The unit of evaluation is explicit and matches the workflow's actual subject. +- The primary metric directly answers that sentence. +- Applicable, successful, missed, correct-restraint, and unavailable cases are distinguishable. +- Evidence is attributable to the run or its subject. +- The metric uses only evidence available at the grading boundary and does not treat requested safe outputs as applied mutations. +- Identical accepted evidence scores identically regardless of actor or engine. +- Zero means observed non-attainment; `null` means no opportunity or unavailable evidence. +- The denominator cannot silently reward skipped or missing work. +- Diagnostics are independently useful and do not duplicate the primary metric. +- The workflow and evaluator were adopted together, and neither the function nor prior results were changed retroactively. +- External research, if used, changed a definition rather than adding prestige or complexity. +- The evaluator makes the minimum necessary API calls. +- The output is only an ordered array of exact `{id,value}` objects. +- Exact fixtures prove attained scores above missed, unavailable and malformed evidence return the declared result, and repeated evaluation is deterministic. \ No newline at end of file diff --git a/.github/skills/operational-value-designer/scripts/verify-operational-value-contract-change.sh b/.github/skills/operational-value-designer/scripts/verify-operational-value-contract-change.sh new file mode 100755 index 00000000000..194a9e113a0 --- /dev/null +++ b/.github/skills/operational-value-designer/scripts/verify-operational-value-contract-change.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -euo pipefail + +fail() { + printf 'error: %s\n' "$*" >&2 + exit 1 +} + +allow_correction=false +if [[ ${1:-} == --correction ]]; then + allow_correction=true + shift +fi + +(( $# <= 1 )) || fail "usage: verify-operational-value-contract-change.sh [--correction] [base-ref]" + +base_ref=${1:-origin/${GITHUB_BASE_REF:-main}} +repo_root=$(git rev-parse --show-toplevel 2>/dev/null) || fail "not inside a Git repository" +git -C "$repo_root" cat-file -e "$base_ref^{commit}" 2>/dev/null \ + || fail "base ref is not a commit: $base_ref" + +changed_evaluators=$(git -C "$repo_root" diff --name-only --diff-filter=AMD "$base_ref" -- \ + '.github/graders/*-operational-value.sh') + +while IFS= read -r evaluator; do + [[ -n $evaluator ]] || continue + workflow_name=${evaluator##*/} + workflow_name=${workflow_name%-operational-value.sh} + workflow_path=.github/workflows/$workflow_name.md + + if git -C "$repo_root" diff --quiet "$base_ref" -- "$workflow_path"; then + if [[ $allow_correction == true ]]; then + printf 'prospective evaluator-only correction: %s\n' "$evaluator" >&2 + continue + fi + fail "$evaluator changed without $workflow_path; change the contract pair together or use --correction for a prospective evaluator-only defect fix" + fi +done <<< "$changed_evaluators" + +printf 'verified operational-value contract changes against %s\n' "$base_ref" \ No newline at end of file diff --git a/.github/skills/operational-value-designer/scripts/verify-operational-value-evaluator.sh b/.github/skills/operational-value-designer/scripts/verify-operational-value-evaluator.sh index 2c676951ef2..cb58d114eca 100755 --- a/.github/skills/operational-value-designer/scripts/verify-operational-value-evaluator.sh +++ b/.github/skills/operational-value-designer/scripts/verify-operational-value-evaluator.sh @@ -7,130 +7,132 @@ fail() { exit 1 } -[[ $# -eq 1 ]] || fail "usage: verify-operational-value-evaluator.sh " +(( $# == 1 || $# == 2 )) || fail "usage: verify-operational-value-evaluator.sh [fixtures.json]" evaluator=$1 +fixtures=${2:-} [[ -f $evaluator ]] || fail "operational-value evaluator not found: $evaluator" [[ -x $evaluator ]] || fail "operational-value evaluator is not executable: $evaluator" command -v jq >/dev/null 2>&1 || fail "jq is required" bash -n "$evaluator" -definition=$("$evaluator" --definition) -printf '%s\n' "$definition" | jq -e ' - .schemaVersion == 4 - and .grader == "operational-value" - and (.repository | type == "string" and test("^[^/]+/[^/]+$")) - and (.workflowName | type == "string" and length > 0) - and (.sourcePath | type == "string" and startswith(".github/workflows/") and endswith(".md")) - and (.adoption.commit | type == "string" and test("^[0-9a-f]{40}$")) - and (.adoption.adoptedAt | type == "string" and test("^[0-9]{4}-[0-9]{2}-[0-9]{2}T")) - and (.operationalValue | type == "string" and length > 0) - and (.evidence.opportunity | type == "string" and length > 0) - and (.evidence.assignment | type == "string" and length > 0) - and (.evidence.accepted | type == "string" and length > 0) - and (.evidence.repositories | type == "array" and length > 0) - and (all(.evidence.repositories[]; type == "string" and test("^[^/]+/[^/]+$"))) - and (.evidence.collection | type == "string" and length > 0) - and (.evidence.maturation | type == "string" and length > 0) - and (.evidence.zeroRule | type == "string" and length > 0) - and (.evidence.missingRule | type == "string" and length > 0) - and (.primaryMetric.id | type == "string" and length > 0) - and (.primaryMetric.formula | type == "string" and length > 0) - and (.primaryMetric.direction == "higher_is_better") - and ((.diagnosticMetrics // []) | type == "array") - and (all((.diagnosticMetrics // [])[]; - (.id | type == "string" and length > 0) - and (.name | type == "string" and length > 0) - and (.formula | type == "string" and length > 0) - and .direction == "higher_is_better" - and (.aggregation == "latest" or .aggregation == "mean"))) - and ([.primaryMetric.id] + [(.diagnosticMetrics // [])[].id] | unique | length) - == (1 + ((.diagnosticMetrics // []) | length)) - and (.validationExamples | has("targetAttained") and has("targetMissed") and has("missing") and has("malformed")) - and (.baseline.mode == "baseline-comparable" or .baseline.mode == "attainment-only") - and (if .baseline.mode == "baseline-comparable" then - (.baseline.value | type == "number" and . >= 0 and . <= 1) - and (.baseline.evidenceCutoff | type == "string" and length > 0) - and (.baseline.provenance | type == "array" and length > 0) - else - .baseline.value == null - and .baseline.evidenceCutoff == null - end) -' >/dev/null || fail "operational-value evaluator definition is invalid" - -for example_name in targetAttained targetMissed missing malformed; do - evidence=$(printf '%s\n' "$definition" | jq -c --arg name "$example_name" '.validationExamples[$name]') - result=$(printf '%s\n' "$evidence" | "$evaluator" --metric) - printf '%s\n' "$result" | jq -e '. == null or (type == "number" and . >= 0 and . <= 1)' >/dev/null \ - || fail "--metric returned an invalid score for $example_name" - case $example_name in - targetAttained) target_attained=$result ;; - targetMissed) target_missed=$result ;; - missing|malformed) - [[ $result == null ]] || fail "--metric must return null for $example_name" - ;; - esac -done - -jq -en --argjson attained "$target_attained" --argjson missed "$target_missed" \ - '$attained != null and $missed != null and $attained > $missed' >/dev/null \ - || fail "targetAttained must score higher than targetMissed" - -repository=$(printf '%s\n' "$definition" | jq -r '.repository') -workflow_name=$(printf '%s\n' "$definition" | jq -r '.workflowName') -adoption_commit=$(printf '%s\n' "$definition" | jq -r '.adoption.commit') -created_at=$(printf '%s\n' "$definition" | jq -r '.adoption.adoptedAt') -evidence_at=2099-01-01T00:00:00Z -request=$(jq -cn \ - --arg repository "$repository" \ - --arg workflow "$workflow_name" \ - --arg sha "$adoption_commit" \ - --arg createdAt "$created_at" \ - --arg evidenceAt "$evidence_at" \ - '{ - schemaVersion: 1, - run: { - id: "1", - attempt: 1, - repository: $repository, - workflow: $workflow, - ref: "refs/heads/main", - sha: $sha, - eventName: "workflow_dispatch", - createdAt: $createdAt - }, - evidenceAt: $evidenceAt, - case: null, - event: {}, - config: {verification: true} - }') -grade_run=$(printf '%s\n' "$request" | "$evaluator" --grade-run) -diagnostic_metrics=$(printf '%s\n' "$definition" | jq -c '.diagnosticMetrics // []') -printf '%s\n' "$grade_run" | jq -e --arg evidenceAt "$evidence_at" --argjson diagnosticMetrics "$diagnostic_metrics" ' - def timestamp: - type == "string" - and test("^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{3})?Z$"); - def epoch: sub("\\.[0-9]{3}Z$"; "Z") | fromdateiso8601; - type == "object" - and (.value == null or (.value | type == "number" and isfinite and . >= 0 and . <= 1)) - and (.opportunityKey | type == "string" and length > 0) - and (.case | type == "object") - and (.evidenceCutoff | timestamp) - and (.maturesAt | timestamp) - and ((.evidenceCutoff | epoch) <= ($evidenceAt | epoch)) - and ((.evidenceCutoff | epoch) <= (.maturesAt | epoch)) - and (.provenance | type == "array") - and (if .value == null then true else (.provenance | length > 0) end) - and (all(.provenance[]; type == "object" - and (.repository | type == "string" and length > 0) - and (.kind | type == "string" and length > 0) - and (.ref | type == "string" and length > 0))) - and ((has("diagnostics") | not) or (.diagnostics | type == "object")) - and (all($diagnosticMetrics[]; - .id as $id - | (.diagnostics[$id] == null - or (.diagnostics[$id] | type == "number" and isfinite and . >= 0 and . <= 1)))) - and ((has("message") | not) or (.message | type == "string")) -' >/dev/null || fail "--grade-run returned an invalid operational-value observation" +max_output_bytes=$((1024 * 1024)) + +validate_output() { + local output_file=$1 + local context=$2 + local output_bytes + local text_bytes + + output_bytes=$(LC_ALL=C wc -c < "$output_file" | tr -d ' ') + (( output_bytes <= max_output_bytes )) || fail "$context output exceeds 1 MiB" + text_bytes=$(LC_ALL=C tr -d '\000' < "$output_file" | LC_ALL=C wc -c | tr -d ' ') + (( text_bytes == output_bytes )) || fail "$context output must not contain NUL bytes" + + jq -se ' + length == 1 + and (.[0] | type == "array" and length > 0) + and (.[0] | all(.[]; + type == "object" + and keys == ["id", "value"] + and (.id | type == "string" and test("[^[:space:]]")) + and (.value == null or (.value | type == "number" and isfinite and . >= 0 and . <= 1)))) + and (.[0] | [.[].id] | unique | length) == (.[0] | length) + ' "$output_file" >/dev/null || fail "$context must print exactly one non-empty array of unique {id,value} metrics" +} + +output_file=$(mktemp "${TMPDIR:-/tmp}/operational-value-output.XXXXXX") +trap 'rm -f "$output_file"' EXIT HUP INT TERM + +request=$(jq -cn '{ + schemaVersion: 1, + run: { + id: "1", + attempt: 1, + repository: "owner/repo", + workflow: "Verification workflow", + ref: "refs/heads/main", + sha: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + eventName: "workflow_dispatch" + }, + event: {}, + outputs: [], + config: {verification: true} +}') + +if ! printf '%s\n' "$request" | "$evaluator" > "$output_file"; then + fail "operational-value evaluator exited unsuccessfully" +fi +validate_output "$output_file" "operational-value evaluator" + +if [[ -n $fixtures ]]; then + [[ -f $fixtures ]] || fail "operational-value fixtures not found: $fixtures" + fixture_count=$(jq -er ' + . as $fixtures + | if (($fixtures | type) == "array" + and ($fixtures | length) >= 4 + and all($fixtures[]; + type == "object" + and keys == ["expected", "name", "request"] + and (.name | type == "string" and length > 0) + and (.request | type == "object") + and (.expected | type == "array")) + and ([$fixtures[].name] | unique | length) == ($fixtures | length) + and (["attained", "missed", "unavailable", "malformed"] - [$fixtures[].name] | length == 0)) + then ($fixtures | length) + else error("invalid fixtures") + end + ' "$fixtures") || fail "operational-value fixtures are invalid" + + fixture_index=0 + attained_value=null + missed_value=null + unavailable_value=false + malformed_value=false + metric_ids= + while (( fixture_index < fixture_count )); do + fixture_name=$(jq -er ".[$fixture_index].name" "$fixtures") + fixture_request=$(jq -c ".[$fixture_index].request" "$fixtures") + fixture_expected=$(jq -cS ".[$fixture_index].expected" "$fixtures") + + printf '%s\n' "$fixture_expected" > "$output_file" + validate_output "$output_file" "fixture $fixture_name expected" + if ! printf '%s\n' "$fixture_request" | "$evaluator" > "$output_file"; then + fail "operational-value evaluator exited unsuccessfully for fixture $fixture_name" + fi + validate_output "$output_file" "fixture $fixture_name" + fixture_actual=$(jq -cS . "$output_file") + [[ $fixture_actual == "$fixture_expected" ]] || fail "fixture $fixture_name output does not match expected metrics" + fixture_metric_ids=$(jq -c '[.[].id]' "$output_file") + if [[ -z $metric_ids ]]; then + metric_ids=$fixture_metric_ids + else + [[ $fixture_metric_ids == "$metric_ids" ]] || fail "fixture $fixture_name changes metric IDs or order" + fi + + if ! printf '%s\n' "$fixture_request" | "$evaluator" > "$output_file"; then + fail "operational-value evaluator exited unsuccessfully when repeating fixture $fixture_name" + fi + repeated_actual=$(jq -cS . "$output_file") + [[ $repeated_actual == "$fixture_actual" ]] || fail "fixture $fixture_name is not deterministic" + + if [[ $fixture_name == attained ]]; then + attained_value=$(jq -c '.[0].value' "$output_file") + elif [[ $fixture_name == missed ]]; then + missed_value=$(jq -c '.[0].value' "$output_file") + elif [[ $fixture_name == unavailable ]]; then + unavailable_value=$(jq -c '.[0].value' "$output_file") + elif [[ $fixture_name == malformed ]]; then + malformed_value=$(jq -c '.[0].value' "$output_file") + fi + fixture_index=$((fixture_index + 1)) + done + + jq -en --argjson attained "$attained_value" --argjson missed "$missed_value" ' + $attained != null and $missed != null and $attained > $missed + ' >/dev/null || fail "attained fixture must score higher than missed fixture" + [[ $unavailable_value == null ]] || fail "unavailable fixture primary metric must be null" + [[ $malformed_value == null ]] || fail "malformed fixture primary metric must be null" +fi printf 'verified %s\n' "$evaluator" \ No newline at end of file diff --git a/.github/skills/operational-value-designer/tests/test.sh b/.github/skills/operational-value-designer/tests/test.sh index 76f6bc3aa42..b18cf800da8 100755 --- a/.github/skills/operational-value-designer/tests/test.sh +++ b/.github/skills/operational-value-designer/tests/test.sh @@ -7,92 +7,216 @@ repo_root=$(CDPATH='' cd -- "$skill_dir/../../.." && pwd) work_dir=$(mktemp -d "$repo_root/.operational-value-designer-test.XXXXXX") trap 'rm -rf "$work_dir"' EXIT HUP INT TERM -path=$("$skill_dir/scripts/operational-value-evaluator-path.sh" daily-file-diet) -[[ $path == .github/graders/daily-file-diet-operational-value.sh ]] +grep -Fq 'Choose `script` for compact, workflow-specific Bash' "$skill_dir/SKILL.md" +grep -Fq 'Choose `run` when the Bash is large enough to obscure the workflow' "$skill_dir/SKILL.md" +grep -Fq '65,536 UTF-8 bytes, inclusive' "$skill_dir/SKILL.md" +grep -Fq '4,096 Unicode characters, inclusive' "$skill_dir/SKILL.md" +grep -Fq '`run` does not reduce the generated workflow size' "$skill_dir/SKILL.md" +grep -Fq 'comment the workflow intent and the meaning of every emitted metric' "$skill_dir/SKILL.md" +grep -Fq 'ultimate operational condition' "$skill_dir/SKILL.md" +grep -Fq 'Select the furthest downstream rung that satisfies all three' "$skill_dir/SKILL.md" +grep -Fq 'observable at grading time, attributable to this run or its exact subject, and independently verifiable' "$skill_dir/SKILL.md" +grep -Fq 'why stronger downstream effects are unavailable' "$skill_dir/SKILL.md" +grep -Fq 'Never reward output merely for existing' "$skill_dir/SKILL.md" +grep -Fq 'Missing evidence for the selected rung returns `null`; it never causes runtime fallback to a weaker rung' "$skill_dir/SKILL.md" + +evaluator_path=$("$skill_dir/scripts/operational-value-evaluator-path.sh" daily-file-diet) +[[ $evaluator_path == .github/graders/daily-file-diet-operational-value.sh ]] if "$skill_dir/scripts/operational-value-evaluator-path.sh" ../escape >/dev/null 2>&1; then printf 'invalid workflow name was accepted\n' >&2 exit 1 fi -evaluator_path="$work_dir/operational-value.sh" -cat > "$evaluator_path" <<'EOF' +valid_evaluator="$work_dir/valid.sh" +cat > "$valid_evaluator" <<'EOF' #!/usr/bin/env bash set -euo pipefail -case ${1:-} in - --definition) - cat <<'JSON' -{ - "schemaVersion": 4, - "grader": "operational-value", - "repository": "owner/repo", - "workflowName": "Example", - "sourcePath": ".github/workflows/example.md", - "adoption": { - "commit": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "adoptedAt": "2026-01-01T00:00:00Z" - }, - "operationalValue": "For eligible issues, attain closure demonstrated by a closed issue.", - "evidence": { - "opportunity": "The issue assigned to the workflow run.", - "assignment": "Bind the triggering issue number to the run ID.", - "accepted": "The issue is closed by the evidence cutoff.", - "repositories": ["owner/repo"], - "collection": "Read immutable issue events through the capped cutoff.", - "maturation": "Seven days after the run was created.", - "zeroRule": "An eligible open issue at the cutoff scores zero.", - "missingRule": "An unavailable issue or event history scores null." - }, - "primaryMetric": { - "id": "issue-closure", - "formula": "1 when closed, otherwise 0", - "direction": "higher_is_better" - }, - "baseline": { - "mode": "baseline-comparable", - "value": 0.4, - "evidenceCutoff": "2025-12-31T00:00:00Z", - "provenance": [{"repository": "owner/repo", "kind": "issue-events", "ref": "baseline"}] - }, - "validationExamples": { - "targetAttained": {"eligible": true, "closed": true}, - "targetMissed": {"eligible": true, "closed": false}, - "missing": {"eligible": false}, - "malformed": {"eligible": "yes"} - } -} -JSON +[[ $# -eq 0 ]] +request=$(cat) +printf '%s\n' "$request" | jq -e ' + .schemaVersion == 1 + and .run.id == "1" + and .run.attempt == 1 + and .run.repository == "owner/repo" + and .run.workflow == "Verification workflow" + and .run.ref == "refs/heads/main" + and .run.sha == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + and .run.eventName == "workflow_dispatch" + and (.event | type == "object") + and (.outputs | type == "array") + and .config.verification == true +' >/dev/null +printf 'verification diagnostic\n' >&2 +case_name=$(printf '%s\n' "$request" | jq -r '.config.case // "attained"') +case "$case_name" in + attained) + printf '%s\n' '[{"id":"correct-triage","value":1},{"id":"label-confidence","value":null}]' ;; - --metric) - jq 'if (.eligible | type) != "boolean" or .eligible == false or (.closed | type) != "boolean" then null elif .closed then 1 else 0 end' + missed) + printf '%s\n' '[{"id":"correct-triage","value":0},{"id":"label-confidence","value":null}]' + ;; + unavailable|malformed) + printf '%s\n' '[{"id":"correct-triage","value":null},{"id":"label-confidence","value":null}]' ;; - --grade-run) - request=$(cat) - printf '%s\n' "$request" | jq -e ' - .schemaVersion == 1 - and .run.id == "1" - and .run.repository == "owner/repo" - and .run.eventName == "workflow_dispatch" - and .case == null - and .config.verification == true - ' >/dev/null - printf '%s\n' "$request" | jq -c '{ - value: 1, - opportunityKey: "verification:1", - case: {verification: true}, - evidenceCutoff: .evidenceAt, - maturesAt: .evidenceAt, - provenance: [{repository: .run.repository, kind: "verification", ref: .run.id}], - diagnostics: {} - }' - ;; *) exit 1 ;; esac EOF -chmod +x "$evaluator_path" +chmod +x "$valid_evaluator" + +"$skill_dir/scripts/verify-operational-value-evaluator.sh" "$valid_evaluator" >/dev/null + +fixtures="$work_dir/fixtures.json" +jq -n ' + def request($case): { + schemaVersion: 1, + run: { + id: "1", + attempt: 1, + repository: "owner/repo", + workflow: "Verification workflow", + ref: "refs/heads/main", + sha: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + eventName: "workflow_dispatch" + }, + event: {}, + outputs: [], + config: {verification: true, case: $case} + }; + [ + {name: "attained", request: request("attained"), expected: [{id: "correct-triage", value: 1}, {id: "label-confidence", value: null}]}, + {name: "missed", request: request("missed"), expected: [{id: "correct-triage", value: 0}, {id: "label-confidence", value: null}]}, + {name: "unavailable", request: request("unavailable"), expected: [{id: "correct-triage", value: null}, {id: "label-confidence", value: null}]}, + {name: "malformed", request: request("malformed"), expected: [{id: "correct-triage", value: null}, {id: "label-confidence", value: null}]} + ] +' > "$fixtures" +"$skill_dir/scripts/verify-operational-value-evaluator.sh" "$valid_evaluator" "$fixtures" >/dev/null + +assert_fixtures_rejected() { + local name=$1 + local invalid_fixtures=$2 + if "$skill_dir/scripts/verify-operational-value-evaluator.sh" "$valid_evaluator" "$invalid_fixtures" >/dev/null 2>&1; then + printf 'invalid evaluator fixtures were accepted: %s\n' "$name" >&2 + exit 1 + fi +} + +missing_fixture="$work_dir/missing-fixture.json" +jq 'map(select(.name != "malformed"))' "$fixtures" > "$missing_fixture" +assert_fixtures_rejected missing-required-case "$missing_fixture" + +mismatched_fixture="$work_dir/mismatched-fixture.json" +jq 'map(if .name == "attained" then .expected[0].value = 0.5 else . end)' "$fixtures" > "$mismatched_fixture" +assert_fixtures_rejected mismatched-output "$mismatched_fixture" + +reversed_fixture="$work_dir/reversed-fixture.json" +jq 'map( + if .name == "attained" then .request.config.case = "missed" | .expected[0].value = 0 + elif .name == "missed" then .request.config.case = "attained" | .expected[0].value = 1 + else . end +)' "$fixtures" > "$reversed_fixture" +assert_fixtures_rejected reversed-semantics "$reversed_fixture" + +contract_repo="$work_dir/contract-repo" +mkdir -p "$contract_repo/.github/graders" "$contract_repo/.github/workflows" +git -C "$contract_repo" init -q +git -C "$contract_repo" config user.email test@example.com +git -C "$contract_repo" config user.name "Operational Value Test" +printf '%s\n' '#!/usr/bin/env bash' > "$contract_repo/.github/graders/example-operational-value.sh" +printf '%s\n' '# Example' > "$contract_repo/.github/workflows/example.md" +git -C "$contract_repo" add . +git -C "$contract_repo" commit -qm baseline +baseline_commit=$(git -C "$contract_repo" rev-parse HEAD) + +printf '%s\n' 'printf changed' >> "$contract_repo/.github/graders/example-operational-value.sh" +if git -C "$contract_repo" -c advice.detachedHead=false \ + --no-pager diff --quiet "$baseline_commit" -- .github/graders/example-operational-value.sh; then + printf 'contract test evaluator did not change\n' >&2 + exit 1 +fi +if (cd "$contract_repo" && "$skill_dir/scripts/verify-operational-value-contract-change.sh" "$baseline_commit") >/dev/null 2>&1; then + printf 'unpaired evaluator change was accepted\n' >&2 + exit 1 +fi +(cd "$contract_repo" && "$skill_dir/scripts/verify-operational-value-contract-change.sh" --correction "$baseline_commit") >/dev/null + +printf '%s\n' 'Updated contract.' >> "$contract_repo/.github/workflows/example.md" +(cd "$contract_repo" && "$skill_dir/scripts/verify-operational-value-contract-change.sh" "$baseline_commit") >/dev/null + +make_evaluator() { + local name=$1 + local evaluator_output=$2 + local generated_evaluator="$work_dir/$name.sh" + cat > "$generated_evaluator" </dev/null 2>&1; then + printf 'invalid evaluator output was accepted: %s\n' "$name" >&2 + exit 1 + fi +} + +assert_rejected empty-array '[]' +assert_rejected top-level-object '{"id":"score","value":1}' +assert_rejected duplicate-ids '[{"id":"same","value":1},{"id":"same","value":0}]' +assert_rejected empty-id '[{"id":" ","value":1}]' +assert_rejected negative-value '[{"id":"score","value":-0.01}]' +assert_rejected out-of-range '[{"id":"score","value":1.01}]' +assert_rejected boolean-value '[{"id":"score","value":true}]' +assert_rejected string-value '[{"id":"score","value":"1"}]' +assert_rejected extra-field '[{"id":"score","value":1,"message":"not allowed"}]' +assert_rejected multiple-documents $'[{"id":"first","value":1}]\n[{"id":"second","value":0}]' +assert_rejected invalid-json 'not json' + +nul_evaluator="$work_dir/nul-output.sh" +cat > "$nul_evaluator" <<'EOF' +#!/usr/bin/env bash +printf '[{"id":"score","value":1}]\0' +EOF +chmod +x "$nul_evaluator" +if "$skill_dir/scripts/verify-operational-value-evaluator.sh" "$nul_evaluator" >/dev/null 2>&1; then + printf 'evaluator output containing a NUL byte was accepted\n' >&2 + exit 1 +fi + +failed_evaluator="$work_dir/failed.sh" +cat > "$failed_evaluator" <<'EOF' +#!/usr/bin/env bash +exit 1 +EOF +chmod +x "$failed_evaluator" +if "$skill_dir/scripts/verify-operational-value-evaluator.sh" "$failed_evaluator" >/dev/null 2>&1; then + printf 'unsuccessful evaluator was accepted\n' >&2 + exit 1 +fi + +oversized_evaluator="$work_dir/oversized.sh" +cat > "$oversized_evaluator" <<'EOF' +#!/usr/bin/env bash +set -euo pipefail +printf '[{"id":"score","value":1}]' +dd if=/dev/zero bs=1048576 count=1 2>/dev/null | tr '\0' ' ' +EOF +chmod +x "$oversized_evaluator" +if "$skill_dir/scripts/verify-operational-value-evaluator.sh" "$oversized_evaluator" >/dev/null 2>&1; then + printf 'oversized evaluator output was accepted\n' >&2 + exit 1 +fi -"$skill_dir/scripts/verify-operational-value-evaluator.sh" "$evaluator_path" >/dev/null printf 'operational-value-designer skill tests passed\n' \ No newline at end of file diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index 2700e2d373a..351c1579a78 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"0eb218d6a3666db61c899a2396fde74450c472296fe3f9b51c6bbfeb940f4996","body_hash":"6826e6aabb8f216f7591c31cbb9a4073240e5850c2e8d51d82a11c4d99fb58b9","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.83"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"0e47ca4079f444e2975d116c73b905632a4e07dd606c3b79fcaa3c5b7e131eb4","body_hash":"6826e6aabb8f216f7591c31cbb9a4073240e5850c2e8d51d82a11c4d99fb58b9","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.83"}} # gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-go","sha":"b7ad1dad31e06c5925ef5d2fc7ad053ef454303e","version":"v7.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.16","digest":"sha256:57a3e27388a6d7d32719088581e52567727fa0bf2f0d477bf565b0c4baa12a3f","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.16@sha256:57a3e27388a6d7d32719088581e52567727fa0bf2f0d477bf565b0c4baa12a3f"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.16","digest":"sha256:cd400948638ffe1b87ec319abf73fa29b6ac9881b015da58bba971c4cc13a400","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.16@sha256:cd400948638ffe1b87ec319abf73fa29b6ac9881b015da58bba971c4cc13a400"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.16","digest":"sha256:452197f2e241b2cda8eb0b5674960aa8ca544a64dc242e24f8263c3df6452919","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.16@sha256:452197f2e241b2cda8eb0b5674960aa8ca544a64dc242e24f8263c3df6452919"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.21","digest":"sha256:f26f665840660581510746ed84f5fc706f4ca8c48833757dfb4d72d86587201e","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.21@sha256:f26f665840660581510746ed84f5fc706f4ca8c48833757dfb4d72d86587201e"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23","pinned_image":"ghcr.io/github/gh-aw-node@sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23"},{"image":"ghcr.io/github/github-mcp-server:v1.12.1","digest":"sha256:0ba840c46a237879c8300e7fddb0b6347f20e029ccb9cbe2ce4a943daa1ff560","pinned_image":"ghcr.io/github/github-mcp-server:v1.12.1@sha256:0ba840c46a237879c8300e7fddb0b6347f20e029ccb9cbe2ce4a943daa1ff560"},{"image":"ghcr.io/oraios/serena:1.7.0","digest":"sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730","pinned_image":"ghcr.io/oraios/serena:1.7.0@sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730"}],"mcp_servers":[{"name":"github","tools":["get_commit","get_file_contents","get_latest_release","get_me","get_pull_request","get_pull_request_comments","get_pull_request_diff","get_pull_request_files","get_pull_request_review_comments","get_pull_request_reviews","get_pull_request_status","get_release_by_tag","get_tag","issue_read","list_branches","list_commits","list_issue_types","list_issues","list_pull_requests","list_releases","list_starred_repositories","list_tags","pull_request_read","search_code","search_issues","search_pull_requests","search_repositories"]},{"name":"safeoutputs","tools":["create_issue","missing_data","missing_tool","noop"]},{"name":"serena","tools":["*"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -1190,15 +1190,7 @@ jobs: const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); setupGlobals(core, github, context, exec, io, getOctokit); const { main } = require(path.join(actionsDir, 'trace_graders.cjs')); - const graderManifestB64 = [ - 'eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6Im9wZXJhdGlvbmFsLXZhbHVlIiwibmFtZSI6Ik9wZXJhdGlvbmFsIFZhbHVlIiwic291cmNlIjoib3BlcmF0aW9uYWwtdmFsdWUiLCJlbmFibGVkIjp0cnVlLCJ1bml0IjoicmF0aW8iLCJkaXJlY3Rpb24iOiJoaWdoZXJfaXNfYmV0dGVyIiwibWF4IjoxLCJtaW4iOjAsImRpZ2VzdCI6ImRlMmQyYTgzMDliYTY1NjdmZmI3YjYyODM5ZTIyNzJiODlmNjYzZjU0OGQwN2U2NjFmZGVkNzBiMGQwMjBhODUiLCJydW4iOiIuZ2l0aHViL2dyYWRlcnMvZGFpbHktZmlsZS1kaWV0LW9wZXJhdGlvbmFsLXZhbHVlLnNoIn1dfQ==', - ].join(''); - const graderExecB64 = [ - 'W3siaWQiOiJvcGVyYXRpb25hbC12YWx1ZSIsInJ1biI6IiMhL3Vzci9iaW4vZW52IGJhc2hcblxuc2V0IC1ldW8gcGlwZWZhaWxcblxuZXhwb3J0IExDX0FMTD1DXG5cblJFUE9TSVRPUlk9Z2l0aHViL2doLWF3XG5XT1JLRkxPV19OQU1FPVwiRGFpbHkgRmlsZSBEaWV0XCJcblRIUkVTSE9MRF9MSU5FUz0xMDAwXG5UQVJHRVRfTElORVM9NTAwXG5NQVRVUkFUSU9OX1NFQ09ORFM9MTcyODAwXG5cbnRtcF9kaXI9JChta3RlbXAgLWQgXCIke1RNUERJUjotL3RtcH0vZGFpbHktZmlsZS1kaWV0LW9wZXJhdGlvbmFsLXZhbHVlLlhYWFhYWFwiKVxudHJhcCAncm0gLXJmIFwiJHRtcF9kaXJcIicgRVhJVCBIVVAgSU5UIFRFUk1cblxubG9jYWxfcmVwb19yb290PScnXG5pZiBjb21tYW5kIC12IGdpdCBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjE7IHRoZW5cbiAgICBsb2NhbF9yZXBvX3Jvb3Q9JChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbCAyXHUwMDNlL2Rldi9udWxsIHx8IHRydWUpXG5maVxuXG5kZWZpbml0aW9uKCkge1xuICAgIGNhdCBcdTAwM2NcdTAwM2MnSlNPTidcbntcbiAgXCJzY2hlbWFWZXJzaW9uXCI6IDQsIFwiZ3JhZGVyXCI6IFwib3BlcmF0aW9uYWwtdmFsdWVcIixcbiAgXCJyZXBvc2l0b3J5XCI6IFwiZ2l0aHViL2doLWF3XCIsIFwid29ya2Zsb3dOYW1lXCI6IFwiRGFpbHkgRmlsZSBEaWV0XCIsXG4gIFwic291cmNlUGF0aFwiOiBcIi5naXRodWIvd29ya2Zsb3dzL2RhaWx5LWZpbGUtZGlldC5tZFwiLFxuICBcImFkb3B0aW9uXCI6IHtcImNvbW1pdFwiOiBcIjExODYwMzBhNjIwZjQxMTNmNjU1YzE1NmJlZGY3MGNmMmMxNjRmNzlcIiwgXCJhZG9wdGVkQXRcIjogXCIyMDI1LTExLTE1VDEzOjM2OjIxWlwifSxcbiAgXCJvcGVyYXRpb25hbFZhbHVlXCI6IFwiRGVjb21wb3NlIHRoZSBydW4ncyBsYXJnZXN0IG92ZXJzaXplZCBub24tdGVzdCBHbyBmaWxlIHRvd2FyZCA1MDAgbGluZXMuXCIsXG4gIFwiZXZpZGVuY2VcIjoge1xuICAgIFwib3Bwb3J0dW5pdHlcIjogXCJMYXJnZXN0IG5vbi10ZXN0IHBrZy8qKi8qLmdvIGJsb2IgYXQgdGhlIHJ1biBjb21taXQ7IGJlbG93IDEwMDAgaXMgaGVhbHRoeS5cIixcbiAgICBcImFzc2lnbm1lbnRcIjogXCJHcmVhdGVzdCB3YyAtbCwgcmV2ZXJzZSBsZXhpY2FsIHRpZS1icmVhay4gS2V5OiBnby1maWxlOlx1MDAzY3BhdGhcdTAwM2Ugb3IgcmVwb3NpdG9yeS1oZWFsdGg6bm9uLXRlc3QtZ28tdW5kZXItMTAwMDsgZHVwbGljYXRlcyByZXBlYXQuXCIsXG4gICAgXCJhY2NlcHRlZFwiOiBcIkdpdCBldmlkZW5jZSBvZiBhc3NpZ25lZC1wYXRoIHJlZHVjdGlvbiB0b3dhcmQgNTAwIGxpbmVzIG9yIHRyZWUtcHJvdmVuIGFic2VuY2U7IGlzc3VlcyBhbmQgdHJhY2VzIGFyZSBleGNsdWRlZC5cIixcbiAgICBcInJlcG9zaXRvcmllc1wiOiBbXCJnaXRodWIvZ2gtYXdcIl0sXG4gICAgXCJjb2xsZWN0aW9uXCI6IFwiV2l0aCBjb250ZW50czpyZWFkLCBjb3VudCBuZXdsaW5lcyBpbiB0aGUgcnVuIGNvbW1pdCBhcmNoaXZlIGZvciBhc3NpZ25tZW50IGFuZCBpbiB0aGUgY3V0b2ZmIGNvbW1pdCBibG9iIGZvciBldmlkZW5jZS5cIixcbiAgICBcIm1hdHVyYXRpb25cIjogXCJUd28gZGF5czsgZml2ZSBwcmUtYWRvcHRpb24gaXNzdWUvUFIgcGFpcnMgKCMxNjM2LSMzNTY0KSB0b29rIDAuMDQtMC44NCBkYXlzLlwiLFxuICAgIFwiemVyb1J1bGVcIjogXCJObyByZWR1Y3Rpb24gZnJvbSB0aGUgaW5pdGlhbCBvdmVyc2l6ZWQgZmlsZSBzY29yZXMgMC5cIixcbiAgICBcIm1pc3NpbmdSdWxlXCI6IFwiSW52YWxpZCwgdW5hdmFpbGFibGUsIG9yIHRydW5jYXRlZCBHaXQgZXZpZGVuY2Ugc2NvcmVzIG51bGw7IHRyZWUtcHJvdmVuIHBhdGggYWJzZW5jZSBpcyBhdHRhaW5tZW50LlwiXG4gIH0sXG4gIFwicHJpbWFyeU1ldHJpY1wiOiB7XCJpZFwiOiBcImFzc2lnbmVkLWdvLWZpbGUtZGVjb21wb3NpdGlvblwiLCBcImZvcm11bGFcIjogXCJpbml0aWFsTGluZXMgXHUwMDNjIDEwMDAgPVx1MDAzZSAxOyBlbHNlIGNsYW1wKChpbml0aWFsTGluZXMtY3VycmVudExpbmVzKS8oaW5pdGlhbExpbmVzLTUwMCksMCwxKS4gUHJvdmVuIGFic2VuY2Ugc2V0cyBjdXJyZW50TGluZXM9MC5cIiwgXCJkaXJlY3Rpb25cIjogXCJoaWdoZXJfaXNfYmV0dGVyXCJ9LFxuICAgIFwiZGlhZ25vc3RpY01ldHJpY3NcIjogW1xuICAgICAgICB7XCJpZFwiOiBcImxhcmdlc3QtZmlsZS1oZWFsdGhcIiwgXCJuYW1lXCI6IFwiTGFyZ2VzdC1maWxlIGhlYWx0aCBhdCBhc3NpZ25tZW50XCIsIFwiZm9ybXVsYVwiOiBcIm1pbigxLCA5OTkgLyBpbml0aWFsTGluZXMpIHdoZW4gdGhlIGFzc2lnbm1lbnQgYXJjaGl2ZSBjb250YWlucyBlbGlnaWJsZSBmaWxlcy5cIiwgXCJkaXJlY3Rpb25cIjogXCJoaWdoZXJfaXNfYmV0dGVyXCIsIFwiYWdncmVnYXRpb25cIjogXCJsYXRlc3RcIn0sXG4gICAgICAgIHtcImlkXCI6IFwiY29tcGxpYW50LWxpbmUtbWFzcy1zaGFyZVwiLCBcIm5hbWVcIjogXCJDb21wbGlhbnQgbGluZS1tYXNzIHNoYXJlIGF0IGFzc2lnbm1lbnRcIiwgXCJmb3JtdWxhXCI6IFwiY29tcGxpYW50TGluZXMgLyB0b3RhbExpbmVzIHdoZW4gdGhlIGFzc2lnbm1lbnQgYXJjaGl2ZSBjb250YWlucyBlbGlnaWJsZSBmaWxlcyBhbmQgcG9zaXRpdmUgbGluZSBtYXNzLlwiLCBcImRpcmVjdGlvblwiOiBcImhpZ2hlcl9pc19iZXR0ZXJcIiwgXCJhZ2dyZWdhdGlvblwiOiBcImxhdGVzdFwifVxuICAgIF0sXG4gIFwiYmFzZWxpbmVcIjoge1wibW9kZVwiOiBcImF0dGFpbm1lbnQtb25seVwiLCBcInZhbHVlXCI6IG51bGwsIFwiZXZpZGVuY2VDdXRvZmZcIjogbnVsbCwgXCJwcm92ZW5hbmNlXCI6IFtdfSxcbiAgXCJ2YWxpZGF0aW9uRXhhbXBsZXNcIjoge1xuICAgIFwidGFyZ2V0QXR0YWluZWRcIjoge1widmFsaWRcIjp0cnVlLFwiaW5pdGlhbExpbmVzXCI6MTkwNyxcImN1cnJlbnRMaW5lc1wiOjUwMCxcInRocmVzaG9sZExpbmVzXCI6MTAwMCxcInRhcmdldExpbmVzXCI6NTAwfSxcbiAgICBcInRhcmdldE1pc3NlZFwiOiB7XCJ2YWxpZFwiOnRydWUsXCJpbml0aWFsTGluZXNcIjoxOTA3LFwiY3VycmVudExpbmVzXCI6MTkwNyxcInRocmVzaG9sZExpbmVzXCI6MTAwMCxcInRhcmdldExpbmVzXCI6NTAwfSxcbiAgICBcIm1pc3NpbmdcIjoge1widmFsaWRcIjpmYWxzZX0sXG4gICAgXCJtYWxmb3JtZWRcIjoge1widmFsaWRcIjpcInllc1wiLFwiaW5pdGlhbExpbmVzXCI6XCIxOTA3XCJ9XG4gIH1cbn1cbkpTT05cbn1cblxubWV0cmljKCkge1xuICAgIGxvY2FsIGV2aWRlbmNlXG4gICAgZXZpZGVuY2U9JChjYXQpXG4gICAgaWYgISBwcmludGYgJyVzXFxuJyBcIiRldmlkZW5jZVwiIHwganEgLWUgLiBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjE7IHRoZW5cbiAgICAgICAgcHJpbnRmICdudWxsXFxuJ1xuICAgICAgICByZXR1cm5cbiAgICBmaVxuXG4gICAgcHJpbnRmICclc1xcbicgXCIkZXZpZGVuY2VcIiB8IGpxICdcbiAgICAgIGlmIC52YWxpZCAhPSB0cnVlIG9yIChbLmluaXRpYWxMaW5lcywuY3VycmVudExpbmVzLC50aHJlc2hvbGRMaW5lcywudGFyZ2V0TGluZXNdfGFsbCguW107dHlwZT09XCJudW1iZXJcIil8bm90KVxuICAgICAgICBvciAuaW5pdGlhbExpbmVzXHUwMDNjMCBvciAuY3VycmVudExpbmVzXHUwMDNjMCBvciAudGFyZ2V0TGluZXNcdTAwM2MwIG9yIC50aHJlc2hvbGRMaW5lc1x1MDAzYz0udGFyZ2V0TGluZXMgdGhlbiBudWxsXG4gICAgICBlbGlmIC5pbml0aWFsTGluZXNcdTAwM2MudGhyZXNob2xkTGluZXMgdGhlbiAxXG4gICAgICBlbGlmIC5pbml0aWFsTGluZXNcdTAwM2M9LnRhcmdldExpbmVzIHRoZW4gbnVsbFxuICAgICAgZWxzZSAoKC5pbml0aWFsTGluZXMtLmN1cnJlbnRMaW5lcykvKC5pbml0aWFsTGluZXMtLnRhcmdldExpbmVzKSkgYXMgJHZcbiAgICAgICAgfCBpZiAkdlx1MDAzYzAgdGhlbiAwIGVsaWYgJHZcdTAwM2UxIHRoZW4gMSBlbHNlICR2IGVuZFxuICAgICAgZW5kJ1xufVxuXG5ub3JtYWxpemVfdGltZXN0YW1wKCkge1xuICAgIGpxIC1uciAtLWFyZyB0aW1lc3RhbXAgXCIkMVwiICdcbiAgICAgICAgKCR0aW1lc3RhbXAgfCBzdWIoXCJcXFxcLlswLTldK1okXCI7IFwiWlwiKSkgYXMgJG5vcm1hbGl6ZWRcbiAgICAgICAgfCBpZiAoJG5vcm1hbGl6ZWQgfCB0ZXN0KFwiXlswLTldezR9LVswLTldezJ9LVswLTldezJ9VFswLTldezJ9OlswLTldezJ9OlswLTldezJ9WiRcIikpXG4gICAgICAgICAgICBhbmQgKHRyeSAoKCRub3JtYWxpemVkIHwgZnJvbWRhdGVpc284NjAxIHwgdG9kYXRlaXNvODYwMSkgPT0gJG5vcm1hbGl6ZWQpIGNhdGNoIGZhbHNlKVxuICAgICAgICB0aGVuICRub3JtYWxpemVkXG4gICAgICAgIGVsc2UgZXJyb3IoXCJpbnZhbGlkIHRpbWVzdGFtcFwiKVxuICAgICAgICBlbmRcbiAgICAnIDJcdTAwM2UvZGV2L251bGxcbn1cblxudGltZXN0YW1wX2Vwb2NoKCkge1xuICAgIGpxIC1uciAtLWFyZyB0aW1lc3RhbXAgXCIkMVwiICckdGltZXN0YW1wIHwgZnJvbWRhdGVpc284NjAxJ1xufVxuXG5hZGRfc2Vjb25kcygpIHtcbiAgICBqcSAtbnIgLS1hcmcgdGltZXN0YW1wIFwiJDFcIiAtLWFyZ2pzb24gc2Vjb25kcyBcIiQyXCIgXFxcbiAgICAgICAgJyR0aW1lc3RhbXAgfCBmcm9tZGF0ZWlzbzg2MDEgKyAkc2Vjb25kcyB8IHRvZGF0ZWlzbzg2MDEnXG59XG5cbmdpdGh1Yl9hcGkoKSB7XG4gICAgZ2ggYXBpIFwiJEBcIiAyXHUwMDNlXCIkdG1wX2Rpci9naC1hcGktZXJyb3JcIlxufVxuXG5ibG9iX2xpbmVfY291bnQoKSB7XG4gICAgbG9jYWwgcmVwb3NpdG9yeT0kMSBibG9iX3NoYT0kMiBvdXRwdXQ9JDNcblxuICAgIGlmICEgZ2l0aHViX2FwaSAtSCBcIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yi5yYXcranNvblwiIFxcXG4gICAgICAgIFwicmVwb3MvJHJlcG9zaXRvcnkvZ2l0L2Jsb2JzLyRibG9iX3NoYVwiIFx1MDAzZVwiJG91dHB1dFwiOyB0aGVuXG4gICAgICAgIHJldHVybiAxXG4gICAgZmlcbiAgICB3YyAtbCBcdTAwM2NcIiRvdXRwdXRcIiB8IHRyIC1kICcgJ1xufVxuXG5sb2FkX3RyZWUoKSB7XG4gICAgbG9jYWwgcmVwb3NpdG9yeT0kMSBjb21taXRfc2hhPSQyIG91dHB1dD0kM1xuXG4gICAgaWYgISBnaXRodWJfYXBpIFwicmVwb3MvJHJlcG9zaXRvcnkvZ2l0L3RyZWVzLyRjb21taXRfc2hhP3JlY3Vyc2l2ZT0xXCIgXHUwMDNlXCIkb3V0cHV0XCI7IHRoZW5cbiAgICAgICAgcmV0dXJuIDFcbiAgICBmaVxuICAgIGpxIC1lICcudHJ1bmNhdGVkID09IGZhbHNlIGFuZCAoLnRyZWUgfCB0eXBlID09IFwiYXJyYXlcIiknIFwiJG91dHB1dFwiIFx1MDAzZS9kZXYvbnVsbFxufVxuXG5hc3NpZ25fY2FzZSgpIHtcbiAgICBsb2NhbCByZXBvc2l0b3J5PSQxIGNvbW1pdF9zaGE9JDJcbiAgICBsb2NhbCBhcmNoaXZlX2ZpbGU9XCIkdG1wX2Rpci9hc3NpZ25tZW50LWFyY2hpdmUudGFyLmd6XCJcbiAgICBsb2NhbCBleHRyYWN0X2Rpcj1cIiR0bXBfZGlyL2Fzc2lnbm1lbnQtYXJjaGl2ZVwiXG4gICAgbG9jYWwgcm9vdF9kaXIgcGF0aCBsaW5lc1xuICAgIGxvY2FsIGxhcmdlc3RfcGF0aD0nJyBsYXJnZXN0X2xpbmVzPS0xXG4gICAgbG9jYWwgZWxpZ2libGVfZmlsZV9jb3VudD0wIHRvdGFsX2xpbmVzPTAgY29tcGxpYW50X2xpbmVzPTBcblxuICAgIG1rZGlyIC1wIFwiJGV4dHJhY3RfZGlyXCJcbiAgICBpZiBbWyAtbiAkbG9jYWxfcmVwb19yb290IF1dIFxcXG4gICAgICAgIFx1MDAyNlx1MDAyNiBnaXQgLUMgXCIkbG9jYWxfcmVwb19yb290XCIgY2F0LWZpbGUgLWUgXCIkY29tbWl0X3NoYV57Y29tbWl0fVwiIDJcdTAwM2UvZGV2L251bGw7IHRoZW5cbiAgICAgICAgZ2l0IC1DIFwiJGxvY2FsX3JlcG9fcm9vdFwiIGFyY2hpdmUgXCIkY29tbWl0X3NoYVwiIC0tIHBrZyB8IHRhciAteGYgLSAtQyBcIiRleHRyYWN0X2RpclwiIHx8IHJldHVybiAxXG4gICAgICAgIHJvb3RfZGlyPSRleHRyYWN0X2RpclxuICAgIGVsc2VcbiAgICAgICAgZ2l0aHViX2FwaSAtSCBcIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uXCIgXFxcbiAgICAgICAgICAgIFwicmVwb3MvJHJlcG9zaXRvcnkvdGFyYmFsbC8kY29tbWl0X3NoYVwiIFx1MDAzZVwiJGFyY2hpdmVfZmlsZVwiIHx8IHJldHVybiAxXG4gICAgICAgIHRhciAteHpmIFwiJGFyY2hpdmVfZmlsZVwiIC1DIFwiJGV4dHJhY3RfZGlyXCIgfHwgcmV0dXJuIDFcbiAgICAgICAgcm9vdF9kaXI9JChmaW5kIFwiJGV4dHJhY3RfZGlyXCIgLW1pbmRlcHRoIDEgLW1heGRlcHRoIDEgLXR5cGUgZCAtcHJpbnQgLXF1aXQpXG4gICAgZmlcbiAgICBbWyAtbiAkcm9vdF9kaXIgXHUwMDI2XHUwMDI2IC1kICRyb290X2Rpci9wa2cgXV0gfHwgcmV0dXJuIDFcblxuICAgIHdoaWxlIElGUz0gcmVhZCAtciAtZCAnJyBwYXRoOyBkb1xuICAgICAgICBsaW5lcz0kKHdjIC1sIFx1MDAzY1wiJHJvb3RfZGlyLyRwYXRoXCIgfCB0ciAtZCAnICcpIHx8IHJldHVybiAxXG4gICAgICAgIGVsaWdpYmxlX2ZpbGVfY291bnQ9JCgoZWxpZ2libGVfZmlsZV9jb3VudCArIDEpKVxuICAgICAgICB0b3RhbF9saW5lcz0kKCh0b3RhbF9saW5lcyArIGxpbmVzKSlcbiAgICAgICAgaWYgKCggbGluZXMgXHUwMDNjIFRIUkVTSE9MRF9MSU5FUyApKTsgdGhlblxuICAgICAgICAgICAgY29tcGxpYW50X2xpbmVzPSQoKGNvbXBsaWFudF9saW5lcyArIGxpbmVzKSlcbiAgICAgICAgZmlcbiAgICAgICAgaWYgKCggbGluZXMgXHUwMDNlIGxhcmdlc3RfbGluZXMgKSkgXFxcbiAgICAgICAgICAgIHx8IHsgKCggbGluZXMgPT0gbGFyZ2VzdF9saW5lcyApKSBcdTAwMjZcdTAwMjYgW1sgJHBhdGggXHUwMDNlICRsYXJnZXN0X3BhdGggXV07IH07IHRoZW5cbiAgICAgICAgICAgIGxhcmdlc3RfcGF0aD0kcGF0aFxuICAgICAgICAgICAgbGFyZ2VzdF9saW5lcz0kbGluZXNcbiAgICAgICAgZmlcbiAgICBkb25lIFx1MDAzYyBcdTAwM2MoY2QgXCIkcm9vdF9kaXJcIiBcdTAwMjZcdTAwMjYgZmluZCBwa2cgLXR5cGUgZiAtbmFtZSAnKi5nbycgISAtbmFtZSAnKl90ZXN0LmdvJyAtcHJpbnQwKVxuXG4gICAgW1sgLW4gJGxhcmdlc3RfcGF0aCBdXSB8fCByZXR1cm4gMVxuXG4gICAganEgLWNuIFxcXG4gICAgICAgIC0tYXJnIHBhdGggXCIkbGFyZ2VzdF9wYXRoXCIgXFxcbiAgICAgICAgLS1hcmdqc29uIGluaXRpYWxMaW5lcyBcIiRsYXJnZXN0X2xpbmVzXCIgXFxcbiAgICAgICAgLS1hcmdqc29uIHRocmVzaG9sZExpbmVzIFwiJFRIUkVTSE9MRF9MSU5FU1wiIFxcXG4gICAgICAgIC0tYXJnanNvbiB0YXJnZXRMaW5lcyBcIiRUQVJHRVRfTElORVNcIiBcXFxuICAgICAgICAgICAgICAgIC0tYXJnanNvbiBlbGlnaWJsZUZpbGVDb3VudCBcIiRlbGlnaWJsZV9maWxlX2NvdW50XCIgXFxcbiAgICAgICAgICAgICAgICAtLWFyZ2pzb24gdG90YWxMaW5lcyBcIiR0b3RhbF9saW5lc1wiIFxcXG4gICAgICAgICAgICAgICAgLS1hcmdqc29uIGNvbXBsaWFudExpbmVzIFwiJGNvbXBsaWFudF9saW5lc1wiIFxcXG4gICAgICAgIC0tYXJnIHN1YmplY3RTaGEgXCIkY29tbWl0X3NoYVwiIFxcXG4gICAgICAgICd7cGF0aDogJHBhdGgsIGluaXRpYWxMaW5lczogJGluaXRpYWxMaW5lcywgdGhyZXNob2xkTGluZXM6ICR0aHJlc2hvbGRMaW5lcyxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TGluZXM6ICR0YXJnZXRMaW5lcywgc3ViamVjdFNoYTogJHN1YmplY3RTaGEsXG4gICAgICAgICAgICAgICAgICAgIGVsaWdpYmxlRmlsZUNvdW50OiAkZWxpZ2libGVGaWxlQ291bnQsIHRvdGFsTGluZXM6ICR0b3RhbExpbmVzLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGlhbnRMaW5lczogJGNvbXBsaWFudExpbmVzfSdcbn1cblxuY2FzZV9kaWFnbm9zdGljcygpIHtcbiAgICAgICAgbG9jYWwgY2FzZV9qc29uPSQxIGN1cnJlbnRfbGluZXM9JDJcblxuICAgICAgICBwcmludGYgJyVzXFxuJyBcIiRjYXNlX2pzb25cIiB8IGpxIC1jIFxcXG4gICAgICAgICAgICAgICAgLS1hcmdqc29uIGN1cnJlbnRMaW5lcyBcIiRjdXJyZW50X2xpbmVzXCIgXFxcbiAgICAgICAgICAgICAgICAtLWFyZ2pzb24gaGVhbHRoeUxpbWl0IFwiJCgoVEhSRVNIT0xEX0xJTkVTIC0gMSkpXCIgJ1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsYXJnZXN0LWZpbGUtaGVhbHRoXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAoaWYgKC5pbml0aWFsTGluZXMgfCB0eXBlKSA9PSBcIm51bWJlclwiIGFuZCAuaW5pdGlhbExpbmVzIFx1MDAzZSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiAoWzEsICgkaGVhbHRoeUxpbWl0IC8gLmluaXRpYWxMaW5lcyldIHwgbWluKSBlbHNlIG51bGwgZW5kKSxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21wbGlhbnQtbGluZS1tYXNzLXNoYXJlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAoaWYgKC5lbGlnaWJsZUZpbGVDb3VudCB8IHR5cGUpID09IFwibnVtYmVyXCIgYW5kIC5lbGlnaWJsZUZpbGVDb3VudCBcdTAwM2UgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgKC50b3RhbExpbmVzIHwgdHlwZSkgPT0gXCJudW1iZXJcIiBhbmQgLnRvdGFsTGluZXMgXHUwMDNlIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kICguY29tcGxpYW50TGluZXMgfCB0eXBlKSA9PSBcIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiAoLmNvbXBsaWFudExpbmVzIC8gLnRvdGFsTGluZXMpIGVsc2UgbnVsbCBlbmQpLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluZXM6ICRjdXJyZW50TGluZXNcbiAgICAgICAgICAgICAgICB9J1xufVxuXG5sYXRlc3RfY29tbWl0X2F0X2N1dG9mZigpIHtcbiAgICBsb2NhbCByZXBvc2l0b3J5PSQxIGN1dG9mZj0kMlxuICAgIGxvY2FsIHJlcG9zaXRvcnlfanNvbiBkZWZhdWx0X2JyYW5jaCBjb21taXRzX2pzb24gbG9jYWxfY29tbWl0XG5cbiAgICBpZiBbWyAtbiAkbG9jYWxfcmVwb19yb290IF1dIFxcXG4gICAgICAgIFx1MDAyNlx1MDAyNiBnaXQgLUMgXCIkbG9jYWxfcmVwb19yb290XCIgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCByZWZzL3JlbW90ZXMvb3JpZ2luL21haW47IHRoZW5cbiAgICAgICAgbG9jYWxfY29tbWl0PSQoZ2l0IC1DIFwiJGxvY2FsX3JlcG9fcm9vdFwiIHJldi1saXN0IC0xIC0t', - 'YmVmb3JlPVwiJGN1dG9mZlwiIHJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFpbikgfHwgcmV0dXJuIDFcbiAgICAgICAgaWYgW1sgLW4gJGxvY2FsX2NvbW1pdCBdXTsgdGhlblxuICAgICAgICAgICAgcHJpbnRmICclc1xcbicgXCIkbG9jYWxfY29tbWl0XCJcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBmaVxuICAgIGZpXG5cbiAgICByZXBvc2l0b3J5X2pzb249JChnaXRodWJfYXBpIFwicmVwb3MvJHJlcG9zaXRvcnlcIikgfHwgcmV0dXJuIDFcbiAgICBkZWZhdWx0X2JyYW5jaD0kKHByaW50ZiAnJXNcXG4nIFwiJHJlcG9zaXRvcnlfanNvblwiIHwganEgLWVyICcuZGVmYXVsdF9icmFuY2ggfCBzZWxlY3QodHlwZSA9PSBcInN0cmluZ1wiIGFuZCBsZW5ndGggXHUwMDNlIDApJykgXFxcbiAgICAgICAgfHwgcmV0dXJuIDFcbiAgICBjb21taXRzX2pzb249JChnaXRodWJfYXBpIC1YIEdFVCBcInJlcG9zLyRyZXBvc2l0b3J5L2NvbW1pdHNcIiBcXFxuICAgICAgICAtZiBzaGE9XCIkZGVmYXVsdF9icmFuY2hcIiAtZiB1bnRpbD1cIiRjdXRvZmZcIiAtZiBwZXJfcGFnZT0xKSB8fCByZXR1cm4gMVxuICAgIHByaW50ZiAnJXNcXG4nIFwiJGNvbW1pdHNfanNvblwiIHwganEgLWVyICcuWzBdLnNoYSB8IHNlbGVjdCh0eXBlID09IFwic3RyaW5nXCIgYW5kIHRlc3QoXCJeWzAtOWEtZl17NDB9JFwiKSknXG59XG5cbmVtaXRfbnVsbCgpIHtcbiAgICBsb2NhbCBvcHBvcnR1bml0eV9rZXk9JDEgY2FzZV9qc29uPSQyIGV2aWRlbmNlX2N1dG9mZj0kMyBtYXR1cmVzX2F0PSQ0IHJlYXNvbj0kNVxuXG4gICAganEgLWNuIFxcXG4gICAgICAgIC0tYXJnIG9wcG9ydHVuaXR5S2V5IFwiJG9wcG9ydHVuaXR5X2tleVwiIFxcXG4gICAgICAgIC0tYXJnanNvbiBjYXNlIFwiJGNhc2VfanNvblwiIFxcXG4gICAgICAgIC0tYXJnIGV2aWRlbmNlQ3V0b2ZmIFwiJGV2aWRlbmNlX2N1dG9mZlwiIFxcXG4gICAgICAgIC0tYXJnIG1hdHVyZXNBdCBcIiRtYXR1cmVzX2F0XCIgXFxcbiAgICAgICAgLS1hcmcgcmVhc29uIFwiJHJlYXNvblwiIFxcXG4gICAgICAgICd7dmFsdWU6IG51bGwsIG9wcG9ydHVuaXR5S2V5OiAkb3Bwb3J0dW5pdHlLZXksIGNhc2U6ICRjYXNlLFxuICAgICAgICAgIGV2aWRlbmNlQ3V0b2ZmOiAkZXZpZGVuY2VDdXRvZmYsIG1hdHVyZXNBdDogJG1hdHVyZXNBdCxcbiAgICAgICAgICBwcm92ZW5hbmNlOiBbXSwgZGlhZ25vc3RpY3M6IHttaXNzaW5nUmVhc29uOiAkcmVhc29ufX0nXG59XG5cbmdyYWRlX3J1bigpIHtcbiAgICBsb2NhbCByZXF1ZXN0IHJ1bl9pZCByZXBvc2l0b3J5IHdvcmtmbG93IHJ1bl9zaGEgY3JlYXRlZF9hdCBldmlkZW5jZV9hdFxuICAgIGxvY2FsIG1hdHVyZXNfYXQgZXZpZGVuY2VfY3V0b2ZmIGV2aWRlbmNlX2Vwb2NoIG1hdHVyZXNfZXBvY2hcbiAgICBsb2NhbCBjYXNlX2pzb24gcGF0aCBpbml0aWFsX2xpbmVzIG9wcG9ydHVuaXR5X2tleSBldmlkZW5jZSB2YWx1ZSBkaWFnbm9zdGljc1xuICAgIGxvY2FsIGN1dG9mZl9jb21taXQgYmxvYl9zaGEgY3VycmVudF9saW5lc1xuICAgIGxvY2FsIHRyZWVfZmlsZT1cIiR0bXBfZGlyL2N1dG9mZi10cmVlLmpzb25cIlxuICAgIGxvY2FsIGJsb2JfZmlsZT1cIiR0bXBfZGlyL2N1dG9mZi1ibG9iXCJcblxuICAgIHJlcXVlc3Q9JChjYXQpXG4gICAgaWYgISBwcmludGYgJyVzXFxuJyBcIiRyZXF1ZXN0XCIgfCBqcSAtZSAnXG4gICAgICAgIC5zY2hlbWFWZXJzaW9uID09IDFcbiAgICAgICAgYW5kICgucnVuLmlkIHwgdHlwZSA9PSBcInN0cmluZ1wiIGFuZCBsZW5ndGggXHUwMDNlIDApXG4gICAgICAgIGFuZCAoLnJ1bi5yZXBvc2l0b3J5IHwgdHlwZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICBhbmQgKC5ydW4ud29ya2Zsb3cgfCB0eXBlID09IFwic3RyaW5nXCIpXG4gICAgICAgIGFuZCAoLnJ1bi5zaGEgfCB0eXBlID09IFwic3RyaW5nXCIgYW5kIHRlc3QoXCJeWzAtOWEtZl17NDB9JFwiKSlcbiAgICAgICAgYW5kICgucnVuLmNyZWF0ZWRBdCB8IHR5cGUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgYW5kICguZXZpZGVuY2VBdCB8IHR5cGUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgYW5kICguY2FzZSA9PSBudWxsIG9yICguY2FzZSB8IHR5cGUgPT0gXCJvYmplY3RcIikpXG4gICAgJyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjE7IHRoZW5cbiAgICAgICAgcHJpbnRmICclc1xcbicgJ3tcInZhbHVlXCI6bnVsbCxcIm9wcG9ydHVuaXR5S2V5XCI6XCJpbnZhbGlkLXJlcXVlc3RcIixcImNhc2VcIjp7XCJpbnZhbGlkUmVxdWVzdFwiOnRydWV9LFwiZXZpZGVuY2VDdXRvZmZcIjpcIjE5NzAtMDEtMDFUMDA6MDA6MDBaXCIsXCJtYXR1cmVzQXRcIjpcIjE5NzAtMDEtMDFUMDA6MDA6MDBaXCIsXCJwcm92ZW5hbmNlXCI6W10sXCJkaWFnbm9zdGljc1wiOntcIm1pc3NpbmdSZWFzb25cIjpcImludmFsaWQgcmVxdWVzdFwifX0nXG4gICAgICAgIHJldHVyblxuICAgIGZpXG5cbiAgICBydW5faWQ9JChwcmludGYgJyVzXFxuJyBcIiRyZXF1ZXN0XCIgfCBqcSAtciAnLnJ1bi5pZCcpXG4gICAgcmVwb3NpdG9yeT0kKHByaW50ZiAnJXNcXG4nIFwiJHJlcXVlc3RcIiB8IGpxIC1yICcucnVuLnJlcG9zaXRvcnknKVxuICAgIHdvcmtmbG93PSQocHJpbnRmICclc1xcbicgXCIkcmVxdWVzdFwiIHwganEgLXIgJy5ydW4ud29ya2Zsb3cnKVxuICAgIHJ1bl9zaGE9JChwcmludGYgJyVzXFxuJyBcIiRyZXF1ZXN0XCIgfCBqcSAtciAnLnJ1bi5zaGEnKVxuICAgIGNyZWF0ZWRfYXQ9JChwcmludGYgJyVzXFxuJyBcIiRyZXF1ZXN0XCIgfCBqcSAtciAnLnJ1bi5jcmVhdGVkQXQnKVxuICAgIGV2aWRlbmNlX2F0PSQocHJpbnRmICclc1xcbicgXCIkcmVxdWVzdFwiIHwganEgLXIgJy5ldmlkZW5jZUF0JylcblxuICAgIGlmICEgY3JlYXRlZF9hdD0kKG5vcm1hbGl6ZV90aW1lc3RhbXAgXCIkY3JlYXRlZF9hdFwiKSBcXFxuICAgICAgICB8fCAhIGV2aWRlbmNlX2F0PSQobm9ybWFsaXplX3RpbWVzdGFtcCBcIiRldmlkZW5jZV9hdFwiKTsgdGhlblxuICAgICAgICBwcmludGYgJyVzXFxuJyAne1widmFsdWVcIjpudWxsLFwib3Bwb3J0dW5pdHlLZXlcIjpcImludmFsaWQtdGltZXN0YW1wXCIsXCJjYXNlXCI6e1wiaW52YWxpZFRpbWVzdGFtcFwiOnRydWV9LFwiZXZpZGVuY2VDdXRvZmZcIjpcIjE5NzAtMDEtMDFUMDA6MDA6MDBaXCIsXCJtYXR1cmVzQXRcIjpcIjE5NzAtMDEtMDFUMDA6MDA6MDBaXCIsXCJwcm92ZW5hbmNlXCI6W10sXCJkaWFnbm9zdGljc1wiOntcIm1pc3NpbmdSZWFzb25cIjpcImludmFsaWQgdGltZXN0YW1wXCJ9fSdcbiAgICAgICAgcmV0dXJuXG4gICAgZmlcblxuICAgIG1hdHVyZXNfYXQ9JChhZGRfc2Vjb25kcyBcIiRjcmVhdGVkX2F0XCIgXCIkTUFUVVJBVElPTl9TRUNPTkRTXCIpXG4gICAgZXZpZGVuY2VfZXBvY2g9JCh0aW1lc3RhbXBfZXBvY2ggXCIkZXZpZGVuY2VfYXRcIilcbiAgICBtYXR1cmVzX2Vwb2NoPSQodGltZXN0YW1wX2Vwb2NoIFwiJG1hdHVyZXNfYXRcIilcbiAgICBpZiAoKCBldmlkZW5jZV9lcG9jaCBcdTAwM2MgbWF0dXJlc19lcG9jaCApKTsgdGhlblxuICAgICAgICBldmlkZW5jZV9jdXRvZmY9JGV2aWRlbmNlX2F0XG4gICAgZWxzZVxuICAgICAgICBldmlkZW5jZV9jdXRvZmY9JG1hdHVyZXNfYXRcbiAgICBmaVxuXG4gICAgaWYgW1sgJHJlcG9zaXRvcnkgIT0gXCIkUkVQT1NJVE9SWVwiIHx8ICR3b3JrZmxvdyAhPSBcIiRXT1JLRkxPV19OQU1FXCIgXV07IHRoZW5cbiAgICAgICAgZW1pdF9udWxsIFwicnVuOiRydW5faWRcIiAne1wiYXNzaWdubWVudE1pc3NpbmdcIjp0cnVlfScgXCIkZXZpZGVuY2VfY3V0b2ZmXCIgXCIkbWF0dXJlc19hdFwiIFxcXG4gICAgICAgICAgICBcInJ1biByZXBvc2l0b3J5IG9yIHdvcmtmbG93IGRvZXMgbm90IG1hdGNoIHRoZSBmcm96ZW4gY29udHJhY3RcIlxuICAgICAgICByZXR1cm5cbiAgICBmaVxuXG4gICAgY2FzZV9qc29uPSQocHJpbnRmICclc1xcbicgXCIkcmVxdWVzdFwiIHwganEgLWMgJy5jYXNlJylcbiAgICBpZiBbWyAkY2FzZV9qc29uID09IG51bGwgXV07IHRoZW5cbiAgICAgICAgaWYgISBjYXNlX2pzb249JChhc3NpZ25fY2FzZSBcIiRyZXBvc2l0b3J5XCIgXCIkcnVuX3NoYVwiKTsgdGhlblxuICAgICAgICAgICAgZW1pdF9udWxsIFwicnVuOiRydW5faWRcIiAne1wiYXNzaWdubWVudE1pc3NpbmdcIjp0cnVlfScgXCIkZXZpZGVuY2VfY3V0b2ZmXCIgXCIkbWF0dXJlc19hdFwiIFxcXG4gICAgICAgICAgICAgICAgXCJhc3NpZ25tZW50LXVuYXZhaWxhYmxlXCJcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBmaVxuICAgIGVsaWYgISBwcmludGYgJyVzXFxuJyBcIiRjYXNlX2pzb25cIiB8IGpxIC1lIFxcXG4gICAgICAgIC0tYXJnanNvbiB0aHJlc2hvbGQgXCIkVEhSRVNIT0xEX0xJTkVTXCIgXFxcbiAgICAgICAgLS1hcmdqc29uIHRhcmdldCBcIiRUQVJHRVRfTElORVNcIiAnXG4gICAgICAgICAgICAoLnBhdGggfCB0eXBlID09IFwic3RyaW5nXCIgYW5kIHRlc3QoXCJecGtnLy4qXFxcXC5nbyRcIikgYW5kIChlbmRzd2l0aChcIl90ZXN0LmdvXCIpIHwgbm90KSlcbiAgICAgICAgICAgIGFuZCAoLmluaXRpYWxMaW5lcyB8IHR5cGUgPT0gXCJudW1iZXJcIiBhbmQgLiBcdTAwM2U9IDAgYW5kIGZsb29yID09IC4pXG4gICAgICAgICAgICBhbmQgLnRocmVzaG9sZExpbmVzID09ICR0aHJlc2hvbGRcbiAgICAgICAgICAgIGFuZCAudGFyZ2V0TGluZXMgPT0gJHRhcmdldFxuICAgICAgICAgICAgYW5kICguc3ViamVjdFNoYSB8IHR5cGUgPT0gXCJzdHJpbmdcIiBhbmQgdGVzdChcIl5bMC05YS1mXXs0MH0kXCIpKVxuICAgICAgICAgICAgYW5kICgoaGFzKFwiZWxpZ2libGVGaWxlQ291bnRcIikgfCBub3QpIG9yICguZWxpZ2libGVGaWxlQ291bnQgfCB0eXBlID09IFwibnVtYmVyXCIgYW5kIC4gXHUwMDNlPSAwIGFuZCBmbG9vciA9PSAuKSlcbiAgICAgICAgICAgIGFuZCAoKGhhcyhcInRvdGFsTGluZXNcIikgfCBub3QpIG9yICgudG90YWxMaW5lcyB8IHR5cGUgPT0gXCJudW1iZXJcIiBhbmQgLiBcdTAwM2U9IDAgYW5kIGZsb29yID09IC4pKVxuICAgICAgICAgICAgYW5kICgoaGFzKFwiY29tcGxpYW50TGluZXNcIikgfCBub3QpIG9yICguY29tcGxpYW50TGluZXMgfCB0eXBlID09IFwibnVtYmVyXCIgYW5kIC4gXHUwMDNlPSAwIGFuZCBmbG9vciA9PSAuKSlcbiAgICAgICAgJyBcdTAwM2UvZGV2L251bGw7IHRoZW5cbiAgICAgICAgZW1pdF9udWxsIFwicnVuOiRydW5faWRcIiAne1wiYXNzaWdubWVudE1pc3NpbmdcIjp0cnVlfScgXCIkZXZpZGVuY2VfY3V0b2ZmXCIgXCIkbWF0dXJlc19hdFwiIFxcXG4gICAgICAgICAgICBcImludmFsaWQtY2FzZVwiXG4gICAgICAgIHJldHVyblxuICAgIGZpXG5cbiAgICBwYXRoPSQocHJpbnRmICclc1xcbicgXCIkY2FzZV9qc29uXCIgfCBqcSAtciAnLnBhdGgnKVxuICAgIGluaXRpYWxfbGluZXM9JChwcmludGYgJyVzXFxuJyBcIiRjYXNlX2pzb25cIiB8IGpxIC1yICcuaW5pdGlhbExpbmVzJylcbiAgICBpZiAoKCBpbml0aWFsX2xpbmVzIFx1MDAzYyBUSFJFU0hPTERfTElORVMgKSk7IHRoZW5cbiAgICAgICAgb3Bwb3J0dW5pdHlfa2V5PVwicmVwb3NpdG9yeS1oZWFsdGg6bm9uLXRlc3QtZ28tdW5kZXItMTAwMFwiXG4gICAgICAgIGV2aWRlbmNlPSQoanEgLWNuIFxcXG4gICAgICAgICAgICAtLWFyZ2pzb24gaW5pdGlhbExpbmVzIFwiJGluaXRpYWxfbGluZXNcIiBcXFxuICAgICAgICAgICAgLS1hcmdqc29uIHRocmVzaG9sZExpbmVzIFwiJFRIUkVTSE9MRF9MSU5FU1wiIFxcXG4gICAgICAgICAgICAtLWFyZ2pzb24gdGFyZ2V0TGluZXMgXCIkVEFSR0VUX0xJTkVTXCIgXFxcbiAgICAgICAgICAgICd7dmFsaWQ6IHRydWUsIGluaXRpYWxMaW5lczogJGluaXRpYWxMaW5lcywgY3VycmVudExpbmVzOiAkaW5pdGlhbExpbmVzLCB0aHJlc2hvbGRMaW5lczogJHRocmVzaG9sZExpbmVzLCB0YXJnZXRMaW5lczogJHRhcmdldExpbmVzfScpXG4gICAgICAgIHZhbHVlPSQocHJpbnRmICclc1xcbicgXCIkZXZpZGVuY2VcIiB8IG1ldHJpYylcbiAgICAgICAgZGlhZ25vc3RpY3M9JChjYXNlX2RpYWdub3N0aWNzIFwiJGNhc2VfanNvblwiIFwiJGluaXRpYWxfbGluZXNcIilcbiAgICAgICAganEgLWNuIFxcXG4gICAgICAgICAgICAtLWFyZ2pzb24gdmFsdWUgXCIkdmFsdWVcIiBcXFxuICAgICAgICAgICAgLS1hcmcgb3Bwb3J0dW5pdHlLZXkgXCIkb3Bwb3J0dW5pdHlfa2V5XCIgXFxcbiAgICAgICAgICAgIC0tYXJnanNvbiBjYXNlIFwiJGNhc2VfanNvblwiIFxcXG4gICAgICAgICAgICAtLWFyZyBldmlkZW5jZUN1dG9mZiBcIiRldmlkZW5jZV9jdXRvZmZcIiBcXFxuICAgICAgICAgICAgLS1hcmcgbWF0dXJlc0F0IFwiJG1hdHVyZXNfYXRcIiBcXFxuICAgICAgICAgICAgLS1hcmcgcmVwb3NpdG9yeSBcIiRyZXBvc2l0b3J5XCIgXFxcbiAgICAgICAgICAgIC0tYXJnIHNoYSBcIiRydW5fc2hhXCIgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tYXJnanNvbiBkaWFnbm9zdGljcyBcIiRkaWFnbm9zdGljc1wiIFxcXG4gICAgICAgICAgICAne3ZhbHVlOiAkdmFsdWUsIG9wcG9ydHVuaXR5S2V5OiAkb3Bwb3J0dW5pdHlLZXksIGNhc2U6ICRjYXNlLFxuICAgICAgICAgICAgICBldmlkZW5jZUN1dG9mZjogJGV2aWRlbmNlQ3V0b2ZmLCBtYXR1cmVzQXQ6ICRtYXR1cmVzQXQsXG4gICAgICAgICAgICAgIHByb3ZlbmFuY2U6IFt7cmVwb3NpdG9yeTogJHJlcG9zaXRvcnksIGtpbmQ6IFwiZ2l0LXRyZWVcIiwgcmVmOiAkc2hhfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ25vc3RpY3M6ICgkZGlhZ25vc3RpY3MgKyB7cmVwb3NpdG9yeUhlYWx0aHlBdEFzc2lnbm1lbnQ6IHRydWV9KX0nXG4gICAgICAgIHJldHVyblxuICAgIGZpXG5cbiAgICBvcHBvcnR1bml0eV9rZXk9XCJnby1maWxlOiRwYXRoXCJcbiAgICBpZiAhIGN1dG9mZl9jb21taXQ9JChsYXRlc3RfY29tbWl0X2F0X2N1dG9mZiBcIiRyZXBvc2l0b3J5XCIgXCIkZXZpZGVuY2VfY3V0b2ZmXCIpOyB0aGVuXG4gICAgICAgIGVtaXRfbnVsbCBcIiRvcHBvcnR1bml0eV9rZXlcIiBcIiRjYXNlX2pzb25cIiBcIiRldmlkZW5jZV9jdXRvZmZcIiBcIiRtYXR1cmVzX2F0XCIgXFxcbiAgICAgICAgICAgIFwiY3V0b2ZmLWNvbW1pdC11bmF2YWlsYWJsZVwiXG4gICAgICAgIHJldHVyblxuICAgIGZpXG4gICAgaWYgW1sgLW4gJGxvY2FsX3JlcG9fcm9vdCBdXSBcXFxuICAgICAgICBcdTAwMjZcdTAwMjYgZ2l0IC1DIFwiJGxvY2FsX3JlcG9fcm9vdFwiIGNhdC1maWxlIC1lIFwiJGN1dG9mZl9jb21taXRee2NvbW1pdH1cIiAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4gICAgICAgIGlmIGdpdCAtQyBcIiRsb2NhbF9yZXBvX3Jvb3RcIiBjYXQtZmlsZSAtZSBcIiRjdXRvZmZfY29tbWl0OiRwYXRoXCIgMlx1MDAzZS9kZXYvbnVsbDsgdGhlblxuICAgICAgICAgICAgY3VycmVudF9saW5lcz0kKGdpdCAtQyBcIiRsb2NhbF9yZXBvX3Jvb3RcIiBzaG93IFwiJGN1dG9mZl9jb21taXQ6JHBhdGhcIiB8IHdjIC1sIHwgdHIgLWQgJyAnKSB8fCByZXR1cm4gMVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjdXJyZW50X2xpbmVzPTBcbiAgICAgICAgZmlcbiAgICBlbHNlXG4gICAgICAgIGlmICEgbG9hZF90cmVlIFwiJHJlcG9zaXRvcnlcIiBcIiRjdXRvZmZfY29tbWl0XCIgXCIkdHJlZV9maWxlXCI7IHRoZW5cbiAgICAgICAgICAgIGVtaXRfbnVsbCBcIiRvcHBvcnR1bml0eV9rZXlcIiBcIiRjYXNlX2pzb25cIiBcIiRldmlkZW5jZV9jdXRvZmZcIiBcIiRtYXR1cmVzX2F0XCIgXFxcbiAgICAgICAgICAgICAgICBcImN1dG9mZi10cmVlLXVuYXZhaWxhYmxlXCJcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBmaVxuXG4gICAgICAgIGJsb2Jfc2hhPSQoanEgLXIgLS1hcmcgcGF0aCBcIiRwYXRoXCIgXFxcbiAgICAgICAgICAgICcudHJlZVtdIHwgc2VsZWN0KC50eXBlID09IFwiYmxvYlwiIGFuZCAucGF0aCA9PSAkcGF0aCkgfCAuc2hhJyBcIiR0cmVlX2ZpbGVcIilcbiAgICAgICAgaWYgW1sgLXogJGJsb2Jfc2hhIF1dOyB0aGVuXG4gICAgICAgICAgICBjdXJyZW50X2xpbmVzPTBcbiAgICAgICAgZWxpZiAhIGN1cnJlbnRfbGluZXM9JChibG9iX2xpbmVfY291bnQgXCIkcmVwb3NpdG9yeVwiIFwiJGJsb2Jfc2hhXCIgXCIkYmxvYl9maWxlXCIpOyB0aGVuXG4gICAgICAgICAgICBlbWl0X251bGwgXCIkb3Bwb3J0dW5pdHlfa2V5XCIgXCIkY2FzZV9qc29uXCIgXCIkZXZpZGVuY2VfY3V0b2ZmXCIgXCIkbWF0dXJlc19hdFwiIFxcXG4gICAgICAgICAgICAgICAgXCJibG9iLXVuYXZhaWxhYmxlXCJcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBmaVxuICAgIGZpXG5cbiAgICBldmlkZW5jZT0kKGpxIC1jbiBcXFxuICAgICAgICAtLWFyZ2pzb24gaW5pdGlhbExpbmVzIFwiJGluaXRpYWxfbGluZXNcIiBcXFxuICAgICAgICAtLWFyZ2pzb24gY3VycmVudExpbmVzIFwiJGN1cnJlbnRfbGluZXNcIiBcXFxuICAgICAgICAtLWFyZ2pzb24gdGhyZXNob2xkTGluZXMgXCIkVEhSRVNIT0xEX0xJTkVTXCIgXFxcbiAgICAgICAgLS1hcmdqc29uIHRhcmdldExpbmVzIFwiJFRBUkdFVF9MSU5FU1wiIFxcXG4gICAgICAgICd7dmFsaWQ6IHRydWUsIGluaXRpYWxMaW5lczogJGluaXRpYWxMaW5lcywgY3VycmVudExpbmVzOiAkY3VycmVudExpbmVzLCB0aHJlc2hvbGRMaW5lczogJHRocmVzaG9sZExpbmVzLCB0YXJnZXRMaW5lczogJHRhcmdldExpbmVzfScpXG4gICAgdmFsdWU9JChwcmludGYgJyVzXFxuJyBcIiRldmlkZW5jZVwiIHwgbWV0cmljKVxuICAgIGRpYWdub3N0aWNzPSQoY2FzZV9kaWFnbm9zdGljcyBcIiRjYXNlX2pzb25cIiBcIiRjdXJyZW50X2xpbmVzXCIpXG4gICAganEgLWNuIFxcXG4gICAgICAgIC0tYXJnanNvbiB2YWx1ZSBcIiR2YWx1ZVwiIFxcXG4gICAgICAgIC0tYXJnIG9wcG9ydHVuaXR5S2V5IFwiJG9wcG9ydHVuaXR5X2tleVwiIFxcXG4gICAgICAgIC0tYXJnanNvbiBjYXNlIFwiJGNhc2VfanNvblwiIFxcXG4gICAgICAgIC0tYXJnIGV2aWRlbmNlQ3V0b2ZmIFwiJGV2aWRlbmNlX2N1dG9mZlwiIFxcXG4gICAgICAgIC0tYXJnIG1hdHVyZXNBdCBcIiRtYXR1cmVzX2F0XCIgXFxcbiAgICAgICAgLS1hcmcgcmVwb3NpdG9yeSBcIiRyZXBvc2l0b3J5XCIgXFxcbiAgICAg', - 'ICAgLS1hcmcgY3V0b2ZmQ29tbWl0IFwiJGN1dG9mZl9jb21taXRcIiBcXFxuICAgICAgICAtLWFyZyBwYXRoIFwiJHBhdGhcIiBcXFxuICAgICAgICAtLWFyZ2pzb24gY3VycmVudExpbmVzIFwiJGN1cnJlbnRfbGluZXNcIiBcXFxuICAgICAgICAgICAgICAgIC0tYXJnanNvbiBkaWFnbm9zdGljcyBcIiRkaWFnbm9zdGljc1wiIFxcXG4gICAgICAgICd7dmFsdWU6ICR2YWx1ZSwgb3Bwb3J0dW5pdHlLZXk6ICRvcHBvcnR1bml0eUtleSwgY2FzZTogJGNhc2UsXG4gICAgICAgICAgZXZpZGVuY2VDdXRvZmY6ICRldmlkZW5jZUN1dG9mZiwgbWF0dXJlc0F0OiAkbWF0dXJlc0F0LFxuICAgICAgICAgIHByb3ZlbmFuY2U6IFt7cmVwb3NpdG9yeTogJHJlcG9zaXRvcnksIGtpbmQ6IFwiZ2l0LWNvbW1pdFwiLCByZWY6ICRjdXRvZmZDb21taXR9LFxuICAgICAgICAgICAgICAgICAgICAgICB7cmVwb3NpdG9yeTogJHJlcG9zaXRvcnksIGtpbmQ6IFwiZ28tc291cmNlXCIsIHJlZjogKCRwYXRoICsgXCJAXCIgKyAkY3V0b2ZmQ29tbWl0KX1dLFxuICAgICAgICAgICAgICAgICAgICBkaWFnbm9zdGljczogJGRpYWdub3N0aWNzfSdcbn1cblxuY2FzZSAkezE6LX0gaW5cbiAgICAtLWRlZmluaXRpb24pXG4gICAgICAgIGRlZmluaXRpb25cbiAgICAgICAgOztcbiAgICAtLW1ldHJpYylcbiAgICAgICAgbWV0cmljXG4gICAgICAgIDs7XG4gICAgLS1ncmFkZS1ydW4pXG4gICAgICAgIGdyYWRlX3J1blxuICAgICAgICA7O1xuICAgICopXG4gICAgICAgIHByaW50ZiAndXNhZ2U6ICVzIC0tZGVmaW5pdGlvbnwtLW1ldHJpY3wtLWdyYWRlLXJ1blxcbicgXCIkMFwiIFx1MDAzZVx1MDAyNjJcbiAgICAgICAgZXhpdCAxXG4gICAgICAgIDs7XG5lc2FjXG4ifV0=', - ].join(''); - await main(graderManifestB64, graderExecB64); + await main('eyJ2ZXJzaW9uIjoxLCJncmFkZXJzIjpbeyJpZCI6Im9wZXJhdGlvbmFsLXZhbHVlIiwibmFtZSI6IkZpbGUgRGlldCBEZWNpc2lvbiBDb25mb3JtYW5jZSIsImRlc2NyaXB0aW9uIjoiU3Ryb25nZXN0IGF0dHJpYnV0YWJsZSBwcmVjdXJzb3IgdG8gZGVjb21wb3Npbmcgb3ZlcnNpemVkIEdvIGZpbGVzOiB3aGV0aGVyIGdyYWRpbmctdGltZSBldmlkZW5jZSBjb250YWlucyB0aGUgY29ycmVjdCB0YXJnZXQtYm91bmQgcmVmYWN0b3JpbmcgaXNzdWUgb3IgaGVhbHRoeS1yZXBvc2l0b3J5IG5vb3AiLCJzb3VyY2UiOiJvcGVyYXRpb25hbC12YWx1ZSIsImVuYWJsZWQiOnRydWUsInVuaXQiOiJyYXRpbyIsImRpcmVjdGlvbiI6ImhpZ2hlcl9pc19iZXR0ZXIiLCJtYXgiOjEsIm1pbiI6MCwiZGlnZXN0IjoiOWVjYTJlYWFkZmNmNmEzMzJiNTU1MTUyYzAxYjFhZjlhNzRmYmYxNDA4NTJkZWRhZWI2MWUzZTkzMTVhMWY2NSIsInJ1biI6Ii5naXRodWIvZ3JhZGVycy9kYWlseS1maWxlLWRpZXQtb3BlcmF0aW9uYWwtdmFsdWUuc2gifV19', 'W3siaWQiOiJvcGVyYXRpb25hbC12YWx1ZSIsInJ1biI6IiMhL3Vzci9iaW4vZW52IGJhc2hcblxuIyBVbHRpbWF0ZSBnb2FsOiBkZWNvbXBvc2Ugb3ZlcnNpemVkIEdvIGZpbGVzIGludG8gZm9jdXNlZCBmaWxlcyB3aGlsZVxuIyBwcmVzZXJ2aW5nIGJlaGF2aW9yIGFuZCBpbXByb3ZpbmcgdGVzdHMuXG4jIFNlbGVjdGVkIGdyYWRpbmctdGltZSBlZmZlY3Q6IHZlcmlmeSB0aGF0IG9uZSByZXBvc2l0b3J5IHNjYW4gcmVxdWVzdHMgdGhlXG4jIGFjdGlvbiByZXF1aXJlZCBieSB0aGUgbGFyZ2VzdCBub24tdGVzdCBwa2cvKiovKi5nbyBmaWxlIGF0IHRoZSBydW4gU0hBLlxuIyBTdHJvbmdlciBlZmZlY3RzIGFyZSB1bmF2YWlsYWJsZSBoZXJlOiB0aGlzIHdvcmtmbG93IGRvZXMgbm90IHJlZmFjdG9yIGNvZGUsXG4jIGFuZCB0aGUgZ3JhZGVyIHJ1bnMgYmVmb3JlIHRoZSBzYWZlLW91dHB1dCBqb2IgYXBwbGllcyBhIHJlcXVlc3RlZCBpc3N1ZS5cbiMgTWV0cmljczpcbiMgLSBmaWxlLWRpZXQtZGVjaXNpb24tY29uZm9ybWFuY2UgKHByaW1hcnkpOiAxIGZvciB0aGUgY29ycmVjdCB0YXJnZXQtYm91bmRcbiMgICBpc3N1ZS9ub29wLCAwIGZvciBhbiBvYnNlcnZlZCBtaXNzaW5nIG9yIGNvbnRyYWRpY3RvcnkgZGVjaXNpb24sIGFuZCBudWxsXG4jICAgd2hlbiB0aGUgcnVuIG9yIHJlcG9zaXRvcnkgZXZpZGVuY2UgaXMgdW5hdmFpbGFibGUgb3IgbWFsZm9ybWVkLlxuIyAtIGxhcmdlc3QtZmlsZS11bmRlci10aHJlc2hvbGQ6IDEgd2hlbiB0aGUgbGFyZ2VzdCBmaWxlIGlzIGJlbG93IDgwMCBsaW5lcyxcbiMgICAwIHdoZW4gaXQgaXMgYXQgbGVhc3QgODAwIGxpbmVzLCBhbmQgbnVsbCB3aGVuIHRoZSBzY2FuIGlzIHVuYXZhaWxhYmxlLlxuXG5zZXQgLWV1byBwaXBlZmFpbFxuXG5leHBvcnQgTENfQUxMPUNcblxuUkVQT1NJVE9SWT1cImdpdGh1Yi9naC1hd1wiXG5XT1JLRkxPV19OQU1FPVwiRGFpbHkgRmlsZSBEaWV0XCJcblRIUkVTSE9MRF9MSU5FUz04MDBcblxuZW1pdF9tZXRyaWNzKCkge1xuICAgIGxvY2FsIHByaW1hcnk9JDEgaGVhbHRoeT0kMlxuXG4gICAganEgLWNuIFxcXG4gICAgICAgIC0tYXJnanNvbiBwcmltYXJ5IFwiJHByaW1hcnlcIiBcXFxuICAgICAgICAtLWFyZ2pzb24gaGVhbHRoeSBcIiRoZWFsdGh5XCIgXFxcbiAgICAgICAgJ1tcbiAgICAgICAgICAgIHtpZDogXCJmaWxlLWRpZXQtZGVjaXNpb24tY29uZm9ybWFuY2VcIiwgdmFsdWU6ICRwcmltYXJ5fSxcbiAgICAgICAgICAgIHtpZDogXCJsYXJnZXN0LWZpbGUtdW5kZXItdGhyZXNob2xkXCIsIHZhbHVlOiAkaGVhbHRoeX1cbiAgICAgICAgXSdcbn1cblxucmVxdWVzdD0kKGNhdClcbmlmICEgcHJpbnRmICclc1xcbicgXCIkcmVxdWVzdFwiIHwganEgLWUgXFxcbiAgICAtLWFyZyByZXBvc2l0b3J5IFwiJFJFUE9TSVRPUllcIiBcXFxuICAgIC0tYXJnIHdvcmtmbG93IFwiJFdPUktGTE9XX05BTUVcIiAnXG4gICAgICAgIC5zY2hlbWFWZXJzaW9uID09IDFcbiAgICAgICAgYW5kIC5ydW4ucmVwb3NpdG9yeSA9PSAkcmVwb3NpdG9yeVxuICAgICAgICBhbmQgLnJ1bi53b3JrZmxvdyA9PSAkd29ya2Zsb3dcbiAgICAgICAgYW5kICgucnVuLnNoYSB8IHR5cGUgPT0gXCJzdHJpbmdcIiBhbmQgdGVzdChcIl5bMC05YS1mXXs0MH0kXCIpKVxuICAgICAgICBhbmQgKC5ldmVudCB8IHR5cGUgPT0gXCJvYmplY3RcIilcbiAgICAgICAgYW5kICgub3V0cHV0cyB8IHR5cGUgPT0gXCJhcnJheVwiKVxuICAgICAgICBhbmQgKC5jb25maWcgfCB0eXBlID09IFwib2JqZWN0XCIpXG4gICAgJyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjE7IHRoZW5cbiAgICBlbWl0X21ldHJpY3MgbnVsbCBudWxsXG4gICAgZXhpdCAwXG5maVxuXG5ydW5fc2hhPSQocHJpbnRmICclc1xcbicgXCIkcmVxdWVzdFwiIHwganEgLXIgJy5ydW4uc2hhJylcbnN1YmplY3Q9JChwcmludGYgJyVzXFxuJyBcIiRyZXF1ZXN0XCIgfCBqcSAtYyAnXG4gICAgaWYgLmNvbmZpZy52ZXJpZmljYXRpb24gPT0gdHJ1ZSB0aGVuIC5jb25maWcuc3ViamVjdCBlbHNlIG51bGwgZW5kXG4nKVxuXG5pZiBbWyAkc3ViamVjdCAhPSBudWxsIF1dOyB0aGVuXG4gICAgaWYgISBwcmludGYgJyVzXFxuJyBcIiRzdWJqZWN0XCIgfCBqcSAtZSAnXG4gICAgICAgICgucGF0aCB8IHR5cGUgPT0gXCJzdHJpbmdcIiBhbmQgdGVzdChcIl5wa2cvLitcXFxcLmdvJFwiKSBhbmQgKGVuZHN3aXRoKFwiX3Rlc3QuZ29cIikgfCBub3QpKVxuICAgICAgICBhbmQgKC5saW5lcyB8IHR5cGUgPT0gXCJudW1iZXJcIiBhbmQgLiBcdTAwM2U9IDAgYW5kIGZsb29yID09IC4pXG4gICAgJyBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjE7IHRoZW5cbiAgICAgICAgZW1pdF9tZXRyaWNzIG51bGwgbnVsbFxuICAgICAgICBleGl0IDBcbiAgICBmaVxuICAgIGxhcmdlc3RfcGF0aD0kKHByaW50ZiAnJXNcXG4nIFwiJHN1YmplY3RcIiB8IGpxIC1yICcucGF0aCcpXG4gICAgbGFyZ2VzdF9saW5lcz0kKHByaW50ZiAnJXNcXG4nIFwiJHN1YmplY3RcIiB8IGpxIC1yICcubGluZXMnKVxuZWxzZVxuICAgIHRtcF9kaXI9JChta3RlbXAgLWQgXCIke1RNUERJUjotL3RtcH0vZGFpbHktZmlsZS1kaWV0LW9wZXJhdGlvbmFsLXZhbHVlLlhYWFhYWFwiKVxuICAgIHRyYXAgJ3JtIC1yZiBcIiR0bXBfZGlyXCInIEVYSVQgSFVQIElOVCBURVJNXG4gICAgZXh0cmFjdF9kaXI9XCIkdG1wX2Rpci9yZXBvc2l0b3J5XCJcbiAgICBta2RpciAtcCBcIiRleHRyYWN0X2RpclwiXG5cbiAgICByZXBvX3Jvb3Q9JydcbiAgICBpZiBjb21tYW5kIC12IGdpdCBcdTAwM2UvZGV2L251bGwgMlx1MDAzZVx1MDAyNjE7IHRoZW5cbiAgICAgICAgcmVwb19yb290PSQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwgMlx1MDAzZS9kZXYvbnVsbCB8fCB0cnVlKVxuICAgIGZpXG5cbiAgICBzbmFwc2hvdF9yb290PScnXG4gICAgaWYgW1sgLW4gJHJlcG9fcm9vdCBdXSBcdTAwMjZcdTAwMjYgZ2l0IC1DIFwiJHJlcG9fcm9vdFwiIGNhdC1maWxlIC1lIFwiJHJ1bl9zaGFee2NvbW1pdH1cIiAyXHUwMDNlL2Rldi9udWxsOyB0aGVuXG4gICAgICAgIGlmIGdpdCAtQyBcIiRyZXBvX3Jvb3RcIiBhcmNoaXZlIFwiJHJ1bl9zaGFcIiAtLSBwa2cgfCB0YXIgLXhmIC0gLUMgXCIkZXh0cmFjdF9kaXJcIjsgdGhlblxuICAgICAgICAgICAgc25hcHNob3Rfcm9vdD0kZXh0cmFjdF9kaXJcbiAgICAgICAgZmlcbiAgICBlbGlmIGNvbW1hbmQgLXYgZ2ggXHUwMDNlL2Rldi9udWxsIDJcdTAwM2VcdTAwMjYxOyB0aGVuXG4gICAgICAgIGFyY2hpdmVfZmlsZT1cIiR0bXBfZGlyL3JlcG9zaXRvcnkudGFyLmd6XCJcbiAgICAgICAgaWYgZ2ggYXBpIC1IIFwiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb25cIiBcXFxuICAgICAgICAgICAgXCJyZXBvcy8kUkVQT1NJVE9SWS90YXJiYWxsLyRydW5fc2hhXCIgXHUwMDNlXCIkYXJjaGl2ZV9maWxlXCIgMlx1MDAzZVwiJHRtcF9kaXIvZ2gtYXBpLWVycm9yXCIgXFxcbiAgICAgICAgICAgIFx1MDAyNlx1MDAyNiB0YXIgLXh6ZiBcIiRhcmNoaXZlX2ZpbGVcIiAtQyBcIiRleHRyYWN0X2RpclwiOyB0aGVuXG4gICAgICAgICAgICBzbmFwc2hvdF9yb290PSQoZmluZCBcIiRleHRyYWN0X2RpclwiIC1taW5kZXB0aCAxIC1tYXhkZXB0aCAxIC10eXBlIGQgLXByaW50IC1xdWl0KVxuICAgICAgICBmaVxuICAgIGZpXG5cbiAgICBpZiBbWyAteiAkc25hcHNob3Rfcm9vdCB8fCAhIC1kICRzbmFwc2hvdF9yb290L3BrZyBdXTsgdGhlblxuICAgICAgICBlbWl0X21ldHJpY3MgbnVsbCBudWxsXG4gICAgICAgIGV4aXQgMFxuICAgIGZpXG5cbiAgICBsYXJnZXN0X3BhdGg9JydcbiAgICBsYXJnZXN0X2xpbmVzPS0xXG4gICAgd2hpbGUgSUZTPSByZWFkIC1yIC1kICcnIHNvdXJjZV9maWxlOyBkb1xuICAgICAgICByZWxhdGl2ZV9wYXRoPSR7c291cmNlX2ZpbGUjXCIkc25hcHNob3Rfcm9vdC9cIn1cbiAgICAgICAgbGluZV9jb3VudD0kKHdjIC1sIFx1MDAzY1wiJHNvdXJjZV9maWxlXCIgfCB0ciAtZCAnICcpXG4gICAgICAgIGlmICgoIGxpbmVfY291bnQgXHUwMDNlIGxhcmdlc3RfbGluZXMgKSkgXFxcbiAgICAgICAgICAgIHx8IHsgKCggbGluZV9jb3VudCA9PSBsYXJnZXN0X2xpbmVzICkpIFx1MDAyNlx1MDAyNiBbWyAkcmVsYXRpdmVfcGF0aCBcdTAwM2UgJGxhcmdlc3RfcGF0aCBdXTsgfTsgdGhlblxuICAgICAgICAgICAgbGFyZ2VzdF9wYXRoPSRyZWxhdGl2ZV9wYXRoXG4gICAgICAgICAgICBsYXJnZXN0X2xpbmVzPSRsaW5lX2NvdW50XG4gICAgICAgIGZpXG4gICAgZG9uZSBcdTAwM2MgXHUwMDNjKGZpbmQgXCIkc25hcHNob3Rfcm9vdC9wa2dcIiAtdHlwZSBmIC1uYW1lICcqLmdvJyAhIC1uYW1lICcqX3Rlc3QuZ28nIC1wcmludDApXG5cbiAgICBpZiBbWyAteiAkbGFyZ2VzdF9wYXRoIHx8ICRsYXJnZXN0X2xpbmVzIC1sdCAwIF1dOyB0aGVuXG4gICAgICAgIGVtaXRfbWV0cmljcyBudWxsIG51bGxcbiAgICAgICAgZXhpdCAwXG4gICAgZmlcbmZpXG5cbmlmICgoIGxhcmdlc3RfbGluZXMgXHUwMDNjIFRIUkVTSE9MRF9MSU5FUyApKTsgdGhlblxuICAgIGhlYWx0aHk9MVxuZWxzZVxuICAgIGhlYWx0aHk9MFxuZmlcblxubGluZV9sYWJlbD1cIiRsYXJnZXN0X2xpbmVzIGxpbmVzXCJcbmlmICgoIGhlYWx0aHkgPT0gMSApKTsgdGhlblxuICAgIG91dHB1dF92YWxpZD0kKHByaW50ZiAnJXNcXG4nIFwiJHJlcXVlc3RcIiB8IGpxIC1yIFxcXG4gICAgICAgIC0tYXJnIHBhdGggXCIkbGFyZ2VzdF9wYXRoXCIgXFxcbiAgICAgICAgLS1hcmcgbGluZUxhYmVsIFwiJGxpbmVfbGFiZWxcIiAnXG4gICAgICAgIGlmICgub3V0cHV0cyB8IGxlbmd0aCkgIT0gMSB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgLm91dHB1dHNbMF0gYXMgJG91dHB1dFxuICAgICAgICAgICAgfCAoJG91dHB1dC50eXBlID09IFwibm9vcFwiKVxuICAgICAgICAgICAgYW5kICgkb3V0cHV0Lm1lc3NhZ2UgfCB0eXBlID09IFwic3RyaW5nXCIgYW5kIGxlbmd0aCBcdTAwM2UgMClcbiAgICAgICAgICAgIGFuZCAoJG91dHB1dC5tZXNzYWdlIHwgY29udGFpbnMoJHBhdGgpKVxuICAgICAgICAgICAgYW5kICgkb3V0cHV0Lm1lc3NhZ2UgfCBjb250YWlucygkbGluZUxhYmVsKSlcbiAgICAgICAgICAgIGFuZCAoJG91dHB1dC5tZXNzYWdlIHwgYXNjaWlfZG93bmNhc2UgfCB0ZXN0KFwiaGVhbHRoeXxubyByZWZhY3RvcmluZ1wiKSlcbiAgICAgICAgZW5kXG4gICAgJylcbmVsc2VcbiAgICBvdXRwdXRfdmFsaWQ9JChwcmludGYgJyVzXFxuJyBcIiRyZXF1ZXN0XCIgfCBqcSAtciBcXFxuICAgICAgICAtLWFyZyBwYXRoIFwiJGxhcmdlc3RfcGF0aFwiIFxcXG4gICAgICAgIC0tYXJnIGxpbmVMYWJlbCBcIiRsaW5lX2xhYmVsXCIgJ1xuICAgICAgICBpZiAoLm91dHB1dHMgfCBsZW5ndGgpICE9IDEgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIC5vdXRwdXRzWzBdIGFzICRvdXRwdXRcbiAgICAgICAgICAgIHwgKCRvdXRwdXQudHlwZSA9PSBcImNyZWF0ZV9pc3N1ZVwiKVxuICAgICAgICAgICAgYW5kICgkb3V0cHV0LnRpdGxlIHwgdHlwZSA9PSBcInN0cmluZ1wiIGFuZCBsZW5ndGggXHUwMDNlIDApXG4gICAgICAgICAgICBhbmQgKCRvdXRwdXQuYm9keSB8IHR5cGUgPT0gXCJzdHJpbmdcIiBhbmQgbGVuZ3RoIFx1MDAzZSAwKVxuICAgICAgICAgICAgYW5kICgkb3V0cHV0LmJvZHkgfCBjb250YWlucygkcGF0aCkpXG4gICAgICAgICAgICBhbmQgKCRvdXRwdXQuYm9keSB8IGNvbnRhaW5zKCRsaW5lTGFiZWwpKVxuICAgICAgICAgICAgYW5kICgkb3V0cHV0LmJvZHkgfCB0ZXN0KFwiKD9pKXJlZmFjdG9yaW5nIHN0cmF0ZWd5XCIpKVxuICAgICAgICAgICAgYW5kICgkb3V0cHV0LmJvZHkgfCB0ZXN0KFwiKD9pKXRlc3QgY292ZXJhZ2VcIikpXG4gICAgICAgICAgICBhbmQgKCRvdXRwdXQuYm9keSB8IHRlc3QoXCIoP2kpYWNjZXB0YW5jZSBjcml0ZXJpYVwiKSlcbiAgICAgICAgZW5kXG4gICAgJylcbmZpXG5cbmlmIFtbICRvdXRwdXRfdmFsaWQgPT0gdHJ1ZSBdXTsgdGhlblxuICAgIGVtaXRfbWV0cmljcyAxIFwiJGhlYWx0aHlcIlxuZWxzZVxuICAgIGVtaXRfbWV0cmljcyAwIFwiJGhlYWx0aHlcIlxuZmlcbiJ9XQ=='); env: GH_TOKEN: ${{ github.token }} GH_AW_RUN_CREATED_AT: ${{ needs.activation.outputs.run_created_at }} diff --git a/.github/workflows/daily-file-diet.md b/.github/workflows/daily-file-diet.md index ce051000372..28ba79dc190 100644 --- a/.github/workflows/daily-file-diet.md +++ b/.github/workflows/daily-file-diet.md @@ -56,6 +56,10 @@ evals: question: Was a refactoring issue created for files exceeding the healthy size threshold, or was noop used when all files were within limits? graders: operational-value: + name: File Diet Decision Conformance + description: "Strongest attributable precursor to decomposing oversized Go files: whether grading-time evidence contains the correct target-bound refactoring issue or healthy-repository noop" + unit: ratio + direction: higher_is_better run: .github/graders/daily-file-diet-operational-value.sh --- diff --git a/AGENTS.md b/AGENTS.md index 791265e84b5..2a38e22edc8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -32,6 +32,7 @@ Everything else should be loaded **lazily** through skills only when needed. 7. **Large-file guard**: before reading any file with `github-mcp-server-get_file_contents`, check its size. Files larger than 20 KB must be read with targeted tools (`grep`, `glob`, `bash`, or `view` with `view_range`) instead of full-file reads. See [token-optimization.md](.github/aw/token-optimization.md) for the full technique. 8. Never ask the user to confirm the plan. Always execute the plan. 9. **Autopilot mode**: Never ask for confirmation before taking action. Never prompt the user with "Should I proceed?", "Do you want me to…?", or any equivalent. Always act immediately and autonomously. +10. **Operational-value contract**: Do not edit an enabled evaluator independently of its workflow. Any necessary evaluator change must be made through `.github/skills/operational-value-designer/SKILL.md`. Semantic changes update both at the same path and commit; evaluator-only corrections are prospective, and prior results are never rewritten. Validate changes with `.github/skills/operational-value-designer/scripts/verify-operational-value-contract-change.sh `; reserve `--correction` for explicit defect fixes. ## Upstream-managed workflow sources (read-only in this repo) diff --git a/actions/setup/js/child_process_timeouts.cjs b/actions/setup/js/child_process_timeouts.cjs index 22204abe7ed..bdfd224dea5 100644 --- a/actions/setup/js/child_process_timeouts.cjs +++ b/actions/setup/js/child_process_timeouts.cjs @@ -25,8 +25,7 @@ const SETUP_TIMEOUTS = Object.freeze({ mcpContainerStatus: { env: "GH_AW_MCP_CONTAINER_STATUS_TIMEOUT_MS", defaultMs: 15_000 }, mcpDockerCleanup: { env: "GH_AW_MCP_DOCKER_CLEANUP_TIMEOUT_MS", defaultMs: 30_000 }, mcpServerCheck: { env: "GH_AW_MCP_SERVER_CHECK_TIMEOUT_MS", defaultMs: 120_000 }, - operationalValueDefinition: { env: "GH_AW_OPERATIONAL_VALUE_DEFINITION_TIMEOUT_MS", defaultMs: 5_000 }, - operationalValueGradeRun: { env: "GH_AW_OPERATIONAL_VALUE_GRADE_RUN_TIMEOUT_MS", defaultMs: 120_000 }, + operationalValueEvaluator: { env: "GH_AW_OPERATIONAL_VALUE_EVALUATOR_TIMEOUT_MS", defaultMs: 120_000 }, operationalValueSyntaxCheck: { env: "GH_AW_OPERATIONAL_VALUE_SYNTAX_CHECK_TIMEOUT_MS", defaultMs: 5_000 }, outcomeGh: { env: "GH_AW_OUTCOME_GH_TIMEOUT_MS", defaultMs: 300_000 }, safeoutputsCli: { env: "GH_AW_SAFEOUTPUTS_CLI_TIMEOUT_MS", defaultMs: 120_000 }, diff --git a/actions/setup/js/operational_value_grader.cjs b/actions/setup/js/operational_value_grader.cjs index 34acfd0f54d..01799a7876a 100644 --- a/actions/setup/js/operational_value_grader.cjs +++ b/actions/setup/js/operational_value_grader.cjs @@ -16,20 +16,8 @@ function isRecord(value) { return value !== null && typeof value === "object" && !Array.isArray(value); } -/** @param {string} value @param {string} label @returns {number} */ -function parseTimestamp(value, label) { - if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(value)) { - throw new Error(`${label} must be a UTC ISO-8601 timestamp`); - } - const timestamp = Date.parse(value); - if (!Number.isFinite(timestamp)) { - throw new Error(`${label} must be a valid timestamp`); - } - return timestamp; -} - -/** @param {NodeJS.ProcessEnv} env @param {{createdAt?: string}} [metadata] */ -function buildRunSubject(env, metadata = {}) { +/** @param {NodeJS.ProcessEnv} env */ +function buildRunSubject(env) { const runId = String(env.GITHUB_RUN_ID || ""); if (!/^\d+$/.test(runId) || runId === "0") { throw new Error("GITHUB_RUN_ID must identify the workflow run"); @@ -42,7 +30,6 @@ function buildRunSubject(env, metadata = {}) { ref: String(env.GITHUB_REF || ""), sha: String(env.GITHUB_SHA || ""), eventName: String(env.GITHUB_EVENT_NAME || ""), - createdAt: metadata.createdAt || null, }; } @@ -70,30 +57,6 @@ function safeFunctionEnv(env) { return result; } -function parseOperationalValueBaselineDefinition(rawDefinition) { - let definition; - try { - definition = JSON.parse(rawDefinition || "{}"); - } catch (err) { - throw new Error(`operational-value evaluator returned an invalid definition: ${getErrorMessage(err)}`, { cause: err }); - } - if (!isRecord(definition) || definition.schemaVersion !== 4 || definition.grader !== "operational-value" || !isRecord(definition.baseline)) { - throw new Error("operational-value evaluator definition must use schemaVersion 4 and grader 'operational-value'"); - } - if (definition.baseline.mode === "attainment-only") { - if (definition.baseline.value !== null) throw new Error("attainment-only operational-value evaluators must have a null baseline value"); - return null; - } - if (definition.baseline.mode !== "baseline-comparable") { - throw new Error("operational-value evaluator baseline mode must be 'baseline-comparable' or 'attainment-only'"); - } - const baselineValue = definition.baseline.value; - if (typeof baselineValue !== "number" || !Number.isFinite(baselineValue) || baselineValue < 0 || baselineValue > 1) { - throw new Error("baseline-comparable operational-value evaluators require a baseline value in [0,1]"); - } - return baselineValue; -} - /** * Execute a subprocess and throw resilient action-specific errors for timeout, * signal termination, and non-zero exits. @@ -128,22 +91,20 @@ function executeEvaluatorSubprocess(bashPath, args, options) { * Execute and validate one trusted, frozen operational-value evaluator. * @param {string} evaluatorContent * @param {{digest?: string, config?: object}} meta - * @param {{evidenceAt?: string, env?: NodeJS.ProcessEnv, event?: object|null, case?: object|null, runMetadata?: {createdAt?: string}, bashPath?: string}} [options] + * @param {{env?: NodeJS.ProcessEnv, event?: object|null, outputs?: any[], bashPath?: string}} [options] + * @returns {{id: string, value: number|null}[]} */ function executeOperationalValueEvaluator(evaluatorContent, meta, options = {}) { const env = options.env || process.env; const syntaxCheckTimeoutMs = getSetupTimeoutMs("operationalValueSyntaxCheck", env); - const definitionTimeoutMs = getSetupTimeoutMs("operationalValueDefinition", env); - const gradeRunTimeoutMs = getSetupTimeoutMs("operationalValueGradeRun", env); - const evidenceAt = options.evidenceAt || new Date().toISOString(); - const evidenceAtMs = parseTimestamp(evidenceAt, "evidenceAt"); - const run = buildRunSubject(env, options.runMetadata); + const evaluatorTimeoutMs = getSetupTimeoutMs("operationalValueEvaluator", env); + const run = buildRunSubject(env); + const event = options.event === undefined ? readEventPayload(env) : options.event; const request = { schemaVersion: 1, run, - evidenceAt, - case: options.case || null, - event: options.event === undefined ? readEventPayload(env) : options.event, + event: isRecord(event) ? event : {}, + outputs: Array.isArray(options.outputs) ? options.outputs : [], config: meta.config || {}, }; @@ -163,17 +124,9 @@ function executeOperationalValueEvaluator(evaluatorContent, meta, options = {}) throw new Error(`operational-value evaluator has invalid Bash syntax: ${getErrorMessage(err)}`, { cause: err }); } - const definitionExecution = executeEvaluatorSubprocess(bashPath, [evaluatorPath, "--definition"], { - timeout: definitionTimeoutMs, - maxBuffer: OPERATIONAL_VALUE_EVALUATOR_MAX_OUTPUT, - env: safeFunctionEnv(env), - operation: "operational-value evaluator --definition", - }); - const baselineValue = parseOperationalValueBaselineDefinition(definitionExecution.stdout); - - const execution = executeEvaluatorSubprocess(bashPath, [evaluatorPath, "--grade-run"], { + const execution = executeEvaluatorSubprocess(bashPath, [evaluatorPath], { input: JSON.stringify(request), - timeout: gradeRunTimeoutMs, + timeout: evaluatorTimeoutMs, maxBuffer: OPERATIONAL_VALUE_EVALUATOR_MAX_OUTPUT, env: safeFunctionEnv(env), operation: "operational-value evaluator", @@ -181,57 +134,27 @@ function executeOperationalValueEvaluator(evaluatorContent, meta, options = {}) let output; try { - output = JSON.parse(execution.stdout || "{}"); + output = JSON.parse(execution.stdout || "null"); } catch (err) { throw new Error(`operational-value evaluator returned invalid JSON: ${getErrorMessage(err)}`, { cause: err }); } - if (!isRecord(output)) throw new Error("operational-value evaluator output must be an object"); - if (output.value !== null && (typeof output.value !== "number" || !Number.isFinite(output.value) || output.value < 0 || output.value > 1)) { - throw new Error("operational-value evaluator result.value must be null or a finite number in [0,1]"); - } - if (!isRecord(output.case)) throw new Error("operational-value evaluator output.case must be an object"); - if (typeof output.opportunityKey !== "string" || output.opportunityKey.trim() === "") { - throw new Error("operational-value evaluator opportunityKey must be a non-empty string"); - } - const evidenceCutoffMs = parseTimestamp(output.evidenceCutoff, "evidenceCutoff"); - const maturesAtMs = parseTimestamp(output.maturesAt, "maturesAt"); - if (evidenceCutoffMs > evidenceAtMs) throw new Error("operational-value evaluator evidenceCutoff cannot follow evidenceAt"); - if (evidenceCutoffMs > maturesAtMs) throw new Error("operational-value evaluator evidenceCutoff cannot follow maturesAt"); - if (!Array.isArray(output.provenance) || (output.value !== null && output.provenance.length === 0)) { - throw new Error("operational-value evaluator must return provenance for a numeric value"); + if (!Array.isArray(output) || output.length === 0) { + throw new Error("operational-value evaluator output must be a non-empty array"); } - for (const provenance of output.provenance) { - if (!isRecord(provenance) || !["repository", "kind", "ref"].every(key => typeof provenance[key] === "string" && provenance[key].length > 0)) { - throw new Error("operational-value evaluator provenance entries require repository, kind, and ref"); + const ids = new Set(); + for (const metric of output) { + if (!isRecord(metric) || Object.keys(metric).sort().join(",") !== "id,value") { + throw new Error("operational-value evaluator metrics must contain exactly id and value"); + } + if (typeof metric.id !== "string" || metric.id.trim() === "" || ids.has(metric.id)) { + throw new Error("operational-value evaluator metric ids must be non-empty and unique"); + } + if (metric.value !== null && (typeof metric.value !== "number" || !Number.isFinite(metric.value) || metric.value < 0 || metric.value > 1)) { + throw new Error("operational-value evaluator metric values must be null or finite numbers in [0,1]"); } + ids.add(metric.id); } - return { - value: output.value, - ...(typeof output.message === "string" ? { message: output.message } : {}), - ...(isRecord(output.diagnostics) ? { diagnostics: output.diagnostics } : {}), - observation: { - subject: { - type: "workflow-run", - runId: run.id, - attempt: run.attempt, - repository: run.repository, - workflow: run.workflow, - ref: run.ref, - sha: run.sha, - eventName: run.eventName, - createdAt: run.createdAt, - }, - opportunityKey: output.opportunityKey, - evidenceAt, - evidenceCutoff: output.evidenceCutoff, - maturesAt: output.maturesAt, - mature: evidenceAtMs >= maturesAtMs, - case: output.case, - provenance: output.provenance, - }, - baselineValue, - deltaFromBaseline: typeof output.value === "number" && baselineValue !== null ? output.value - baselineValue : null, - }; + return output; } finally { fs.rmSync(tempDir, { recursive: true, force: true }); } @@ -241,8 +164,6 @@ module.exports = { executeOperationalValueEvaluator, buildRunSubject, readEventPayload, - parseTimestamp, - parseOperationalValueBaselineDefinition, safeFunctionEnv, OPERATIONAL_VALUE_EVALUATOR_TEMP_ROOT, OPERATIONAL_VALUE_EVALUATOR_TIMEOUT_MS, diff --git a/actions/setup/js/operational_value_grader.test.cjs b/actions/setup/js/operational_value_grader.test.cjs index fcec6e6d337..58a92a987f0 100644 --- a/actions/setup/js/operational_value_grader.test.cjs +++ b/actions/setup/js/operational_value_grader.test.cjs @@ -15,25 +15,30 @@ const TEST_ENV = { GITHUB_EVENT_NAME: "schedule", }; -function operationalValueEvaluator(output, baseline = { mode: "baseline-comparable", value: 0.25 }) { +/** @type {(output: unknown, expectedOutputs?: any[]) => string} */ +const operationalValueEvaluator = (output, expectedOutputs = []) => { return `#!/usr/bin/env bash set -euo pipefail -case \${1:-} in ---definition) -cat <<'DEFINITION' -${JSON.stringify({ schemaVersion: 4, grader: "operational-value", baseline })} -DEFINITION -;; ---grade-run) -cat >/dev/null +[[ $# -eq 0 ]] +request=$(cat) +printf '%s' "$request" | jq -e ' + .schemaVersion == 1 + and .run.id == "12345" + and .run.attempt == 2 + and .run.repository == "github/gh-aw" + and .run.workflow == "Example" + and .run.ref == "refs/heads/main" + and .run.sha == "0123456789abcdef" + and .run.eventName == "schedule" + and .event.issue.number == 42 + and .outputs == ${JSON.stringify(expectedOutputs)} + and .config.mode == "test" +' >/dev/null cat <<'RESULT' ${JSON.stringify(output)} RESULT -;; -*) exit 1 ;; -esac `; -} +}; describe("operational_value_grader", () => { it("uses the gh-aw agent temp root and forwards the GitHub GraphQL URL", () => { @@ -52,130 +57,56 @@ describe("operational_value_grader", () => { ref: "refs/heads/main", sha: "0123456789abcdef", eventName: "schedule", - createdAt: null, - }); - }); - - it("returns absolute value with a secondary baseline delta", () => { - const output = executeOperationalValueEvaluator( - operationalValueEvaluator({ - value: 0.75, - opportunityKey: "schedule:2026-08-23", - case: { key: "schedule:2026-08-23" }, - evidenceCutoff: "2026-08-23T12:00:00Z", - maturesAt: "2026-08-30T12:00:00Z", - provenance: [{ repository: "github/gh-aw", kind: "git-commit", ref: "abc123" }], - }), - { digest: "abc" }, - { evidenceAt: "2026-08-24T12:00:00Z", env: TEST_ENV } - ); - - expect(output.value).toBe(0.75); - expect(output.baselineValue).toBe(0.25); - expect(output.deltaFromBaseline).toBe(0.5); - expect(output.observation.subject).toEqual({ - type: "workflow-run", - runId: "12345", - attempt: 2, - repository: "github/gh-aw", - workflow: "Example", - ref: "refs/heads/main", - sha: "0123456789abcdef", - eventName: "schedule", - createdAt: null, }); - expect(output.observation.mature).toBe(false); }); - it("caps evidence at maturation and marks mature observations", () => { + it("runs once without mode arguments and returns ordered metrics", () => { const output = executeOperationalValueEvaluator( operationalValueEvaluator( - { - value: 1, - opportunityKey: "issue:42", - case: { issue: 42 }, - evidenceCutoff: "2026-08-30T12:00:00Z", - maturesAt: "2026-08-30T12:00:00Z", - provenance: [{ repository: "github/gh-aw", kind: "issue", ref: "42" }], - }, - { mode: "attainment-only", value: null } + [ + { id: "goal-attained", value: 0.75 }, + { id: "evidence-available", value: null }, + ], + [{ type: "noop", message: "nothing to do" }] ), - {}, - { evidenceAt: "2026-09-01T12:00:00Z", env: TEST_ENV } + { digest: "abc", config: { mode: "test" } }, + { env: TEST_ENV, event: { issue: { number: 42 } }, outputs: [{ type: "noop", message: "nothing to do" }] } ); - expect(output.observation.mature).toBe(true); - expect(output.observation.evidenceCutoff).toBe("2026-08-30T12:00:00Z"); - expect(output.baselineValue).toBeNull(); - expect(output.deltaFromBaseline).toBeNull(); + expect(output).toEqual([ + { id: "goal-attained", value: 0.75 }, + { id: "evidence-available", value: null }, + ]); }); - it("rejects invalid values and uncapped evidence", () => { - expect(() => - executeOperationalValueEvaluator( - operationalValueEvaluator({ - value: 2, - opportunityKey: "issue:42", - case: { issue: 42 }, - evidenceCutoff: "2026-09-01T12:00:00Z", - maturesAt: "2026-08-30T12:00:00Z", - provenance: [], - }), - {}, - { evidenceAt: "2026-09-01T12:00:00Z", env: TEST_ENV } - ) - ).toThrow("result.value must be null or a finite number in [0,1]"); + it.each([ + ["empty array", [], "non-empty array"], + ["extra fields", [{ id: "score", value: 1, message: "no" }], "exactly id and value"], + [ + "duplicate ids", + [ + { id: "score", value: 1 }, + { id: "score", value: 0 }, + ], + "non-empty and unique", + ], + ["empty id", [{ id: " ", value: 1 }], "non-empty and unique"], + ["out-of-range value", [{ id: "score", value: 2 }], "finite numbers in [0,1]"], + ["string value", [{ id: "score", value: "1" }], "finite numbers in [0,1]"], + ])("rejects %s", (_name, output, message) => { + expect(() => executeOperationalValueEvaluator(operationalValueEvaluator(output), { config: { mode: "test" } }, { env: TEST_ENV, event: { issue: { number: 42 } } })).toThrow(message); }); it("rejects invalid Bash", () => { - expect(() => executeOperationalValueEvaluator("#!/usr/bin/env bash\nif", {}, { evidenceAt: "2026-08-24T12:00:00Z", env: TEST_ENV })).toThrow("invalid Bash syntax"); + expect(() => executeOperationalValueEvaluator("#!/usr/bin/env bash\nif", {}, { env: TEST_ENV })).toThrow("invalid Bash syntax"); }); - it("rejects an invalid frozen baseline", () => { - expect(() => - executeOperationalValueEvaluator( - operationalValueEvaluator( - { - value: 1, - opportunityKey: "issue:42", - case: { issue: 42 }, - evidenceCutoff: "2026-08-24T12:00:00Z", - maturesAt: "2026-08-30T12:00:00Z", - provenance: [{ repository: "github/gh-aw", kind: "issue", ref: "42" }], - }, - { mode: "baseline-comparable", value: 2 } - ), - {}, - { evidenceAt: "2026-08-24T12:00:00Z", env: TEST_ENV } - ) - ).toThrow("baseline value in [0,1]"); - }); - - it("supports configurable grade-run timeout with resilient timeout errors", () => { + it("supports a configurable evaluator timeout", () => { const slowEvaluator = `#!/usr/bin/env bash set -euo pipefail -case \${1:-} in ---definition) -cat <<'DEFINITION' -${JSON.stringify({ schemaVersion: 4, grader: "operational-value", baseline: { mode: "baseline-comparable", value: 0.25 } })} -DEFINITION -;; ---grade-run) cat >/dev/null sleep 1 -cat <<'RESULT' -${JSON.stringify({ - value: 0.75, - opportunityKey: "schedule:2026-08-23", - case: { key: "schedule:2026-08-23" }, - evidenceCutoff: "2026-08-23T12:00:00Z", - maturesAt: "2026-08-30T12:00:00Z", - provenance: [{ repository: "github/gh-aw", kind: "git-commit", ref: "abc123" }], -})} -RESULT -;; -*) exit 1 ;; -esac +printf '%s\n' '[{"id":"score","value":1}]' `; expect(() => @@ -183,8 +114,7 @@ esac slowEvaluator, {}, { - evidenceAt: "2026-08-24T12:00:00Z", - env: { ...TEST_ENV, GH_AW_OPERATIONAL_VALUE_GRADE_RUN_TIMEOUT_MS: "50" }, + env: { ...TEST_ENV, GH_AW_OPERATIONAL_VALUE_EVALUATOR_TIMEOUT_MS: "50" }, } ) ).toThrow("operational-value evaluator timed out after 50ms"); diff --git a/actions/setup/js/send_otlp_span.cjs b/actions/setup/js/send_otlp_span.cjs index 433fb5ecd2f..0c1690fde0b 100644 --- a/actions/setup/js/send_otlp_span.cjs +++ b/actions/setup/js/send_otlp_span.cjs @@ -746,8 +746,6 @@ function buildGraderTelemetry(graderOutput, eventTimeMs) { if (typeof result.value === "number" && Number.isFinite(result.value)) resultAttributes.push(buildDoubleAttr("gh-aw.grader.value", result.value)); if (typeof result.passed === "boolean") resultAttributes.push(buildAttr("gh-aw.grader.passed", result.passed)); if (typeof result.severity === "string" && result.severity) resultAttributes.push(buildAttr("gh-aw.grader.severity", result.severity)); - if (typeof result.baselineValue === "number" && Number.isFinite(result.baselineValue)) resultAttributes.push(buildDoubleAttr("gh-aw.grader.baseline_value", result.baselineValue)); - if (typeof result.deltaFromBaseline === "number" && Number.isFinite(result.deltaFromBaseline)) resultAttributes.push(buildDoubleAttr("gh-aw.grader.delta_from_baseline", result.deltaFromBaseline)); return { timeUnixNano, name: "grader.result", attributes: resultAttributes }; }); diff --git a/actions/setup/js/send_otlp_span.test.cjs b/actions/setup/js/send_otlp_span.test.cjs index b1289d83472..401556bfef1 100644 --- a/actions/setup/js/send_otlp_span.test.cjs +++ b/actions/setup/js/send_otlp_span.test.cjs @@ -6543,8 +6543,6 @@ describe("buildGraderTelemetry", () => { status: "pass", source: "builtin", severity: "info", - baselineValue: 0.5, - deltaFromBaseline: 0.25, }, { id: "reliability", name: "Reliability", value: null, passed: false, status: "fail", source: "inline" }, { id: "broken", status: "error", source: "inline" }, @@ -6575,8 +6573,6 @@ describe("buildGraderTelemetry", () => { buildDoubleAttr("gh-aw.grader.value", 0.75), buildAttr("gh-aw.grader.passed", true), buildAttr("gh-aw.grader.severity", "info"), - buildDoubleAttr("gh-aw.grader.baseline_value", 0.5), - buildDoubleAttr("gh-aw.grader.delta_from_baseline", 0.25), ], }); }); diff --git a/actions/setup/js/trace_graders.cjs b/actions/setup/js/trace_graders.cjs index d94305632f0..7686cb4e430 100644 --- a/actions/setup/js/trace_graders.cjs +++ b/actions/setup/js/trace_graders.cjs @@ -437,6 +437,7 @@ function evaluateThreshold(value, direction, threshold) { * @typedef {object} GraderResult * @property {string} id * @property {string} name + * @property {string} [description] * @property {number|null} value * @property {string} unit * @property {boolean|null} passed @@ -446,10 +447,8 @@ function evaluateThreshold(value, direction, threshold) { * @property {string} [message] * @property {string} [error] * @property {string} source - "builtin" | "inline" | "value" - * @property {object} [observation] + * @property {{id: string, value: number|null}[]} [metrics] * @property {object} [diagnostics] - * @property {number|null} [baselineValue] - * @property {number|null} [deltaFromBaseline] * @property {{id: string, version: number, digest?: string}} implementation */ @@ -499,7 +498,7 @@ function buildGradersSummaryBody(results) { * Normalize a grader result from either built-in number or custom object return. * @param {string} id * @param {any} rawResult - number or {value, unit?, passed?, severity?, details?, message?} - * @param {{name: string, unit: string, direction: string, threshold?: number, source: string, digest?: string}} meta + * @param {{name: string, description?: string, unit: string, direction: string, threshold?: number, source: string, digest?: string}} meta * @returns {GraderResult} */ function normalizeResult(id, rawResult, meta) { @@ -507,6 +506,7 @@ function normalizeResult(id, rawResult, meta) { const base = { id, name: meta.name || id, + ...(meta.description ? { description: meta.description } : {}), value: null, unit: meta.unit || "", passed: null, @@ -529,10 +529,8 @@ function normalizeResult(id, rawResult, meta) { if (rawResult.details) base.details = String(rawResult.details); if (rawResult.message) base.message = String(rawResult.message); if (typeof rawResult.passed === "boolean") base.passed = rawResult.passed; - if (isRecord(rawResult.observation)) base.observation = deepClone(rawResult.observation); + if (Array.isArray(rawResult.metrics)) base.metrics = deepClone(rawResult.metrics); if (isRecord(rawResult.diagnostics)) base.diagnostics = deepClone(rawResult.diagnostics); - if (typeof rawResult.baselineValue === "number" || rawResult.baselineValue === null) base.baselineValue = rawResult.baselineValue; - if (typeof rawResult.deltaFromBaseline === "number" || rawResult.deltaFromBaseline === null) base.deltaFromBaseline = rawResult.deltaFromBaseline; } else { value = rawResult; } @@ -660,7 +658,12 @@ function runCustomGrader(id, script, trace, meta) { function runOperationalValueGrader(id, evaluatorContent, meta, options) { try { - const rawResult = executeOperationalValueEvaluator(evaluatorContent, meta, options); + const metrics = executeOperationalValueEvaluator(evaluatorContent, meta, options); + const rawResult = { + value: metrics[0].value, + metrics, + ...(metrics.length > 1 ? { diagnostics: Object.fromEntries(metrics.slice(1).map(metric => [metric.id, metric.value])) } : {}), + }; return normalizeResult(id, rawResult, meta); } catch (err) { const result = normalizeResult(id, null, meta); @@ -770,15 +773,13 @@ async function main(manifestB64, execSpecB64) { } catch (err) { core.warning(`Graders: failed to write payload: ${getErrorMessage(err)}`); } - const runCreatedAt = process.env.GH_AW_RUN_CREATED_AT; - const operationalValueRunMetadata = runCreatedAt ? { createdAt: runCreatedAt } : undefined; - // Run all graders /** @type {GraderResult[]} */ const results = []; for (const grader of enabledGraders) { const meta = { name: grader.name || grader.id, + description: grader.description || "", unit: grader.unit || "", direction: grader.direction || "", threshold: grader.threshold, @@ -796,7 +797,7 @@ async function main(manifestB64, execSpecB64) { result.status = "error"; result.error = `grader ${grader.id} runtime error: ${operationalValueEvaluatorArchiveError}`; } else if (grader.source === "operational-value" && executionMap[grader.id]?.run) { - result = runOperationalValueGrader(grader.id, executionMap[grader.id].run, meta, { runMetadata: operationalValueRunMetadata }); + result = runOperationalValueGrader(grader.id, executionMap[grader.id].run, meta, { outputs: trace.artifacts }); } else if (executionMap[grader.id]?.script) { result = runCustomGrader(grader.id, executionMap[grader.id].script, trace, meta); } else { diff --git a/actions/setup/js/trace_graders.test.cjs b/actions/setup/js/trace_graders.test.cjs index 679284697a6..54ca02f6775 100644 --- a/actions/setup/js/trace_graders.test.cjs +++ b/actions/setup/js/trace_graders.test.cjs @@ -19,6 +19,7 @@ const { runGrader, runBuiltinGrader, runCustomGrader, + runOperationalValueGrader, normalizeResult, buildGradersSummaryBody, evaluateThreshold, @@ -212,6 +213,31 @@ describe("trace_graders", () => { }); }); + describe("runOperationalValueGrader", () => { + it("uses the first ordered metric as primary and retains diagnostics", () => { + const evaluator = `#!/usr/bin/env bash +set -euo pipefail + request=$(cat) + printf '%s' "$request" | jq -e '.outputs == [{"type":"noop","message":"nothing to do"}]' >/dev/null +printf '%s\\n' '[{"id":"goal-attained","value":0.75},{"id":"evidence-available","value":1}]' +`; + const result = runOperationalValueGrader( + "operational-value", + evaluator, + { name: "Operational Value", description: "Whether the run attained its outcome", unit: "ratio", direction: "higher_is_better", source: "operational-value" }, + { env: { ...process.env, GITHUB_RUN_ID: "1", GITHUB_RUN_ATTEMPT: "1" }, event: {}, outputs: [{ type: "noop", message: "nothing to do" }] } + ); + + expect(result.value).toBe(0.75); + expect(result.description).toBe("Whether the run attained its outcome"); + expect(result.metrics).toEqual([ + { id: "goal-attained", value: 0.75 }, + { id: "evidence-available", value: 1 }, + ]); + expect(result.diagnostics).toEqual({ "evidence-available": 1 }); + }); + }); + // --- safeParseJsonl --- describe("safeParseJsonl", () => { it("parses valid JSONL", () => { diff --git a/docs/adr/60682-simplify-operational-value-grading-to-one-shot-evaluators.md b/docs/adr/60682-simplify-operational-value-grading-to-one-shot-evaluators.md new file mode 100644 index 00000000000..0d45f9d7aeb --- /dev/null +++ b/docs/adr/60682-simplify-operational-value-grading-to-one-shot-evaluators.md @@ -0,0 +1,50 @@ +# ADR-60682: Simplify Operational-Value Grading to One-Shot Evaluators + +**Date**: 2026-09-14 +**Status**: Draft +**Deciders**: gh-aw maintainers + +--- + +### Context + +This pull request removes the existing historical replay, maturation, baseline, cache, registry, and report machinery from gh-aw's operational-value grading flow and replaces it with a deterministic per-run evaluator contract. The implementation rewrites the operational-value designer guidance, changes evaluator verification scripts, updates tests, and introduces fixture-based validation for file-backed evaluators. It also updates the Daily File Diet operational-value evaluator to grade the current run's requested issue-or-noop decision against repository state at the run SHA. The architectural question is whether operational value in gh-aw should be modeled as historical attainment over time or as a frozen one-shot evaluation of the strongest effect observable at grading time. + +### Decision + +We will simplify operational-value grading to one-shot evaluators that read the current run request, inspect only evidence available at grading time, and emit an ordered metric array without replay, baselines, or retrospective contract metadata modes. We decided to freeze each workflow's evaluator bytes and SHA-256 digest with the compiled workflow so workflow-specific semantics live in the evaluator itself, while generic runtime infrastructure remains minimal. This was chosen because the PR evidence consistently shifts responsibility from centralized historical machinery to deterministic workflow-specific evaluators and explicitly treats requested safe outputs as evidence of requested actions rather than applied mutations. + +### Alternatives Considered + +#### Alternative 1: Preserve the existing historical replay and baseline framework + +gh-aw could continue using evaluators with definition, metric, and grade-run modes plus historical reports, maturity windows, opportunity keys, and baseline comparisons. This was considered because it supports longitudinal analysis and comparable post-adoption reporting across runs. It was not chosen because the PR removes that machinery across the designer skill, verifier scripts, and Daily File Diet grader in favor of a smaller contract focused on what one run can prove at grading time. + +#### Alternative 2: Keep generic runtime infrastructure and add one-shot evaluators on top + +Another option would be to retain the existing replay-oriented schema and infrastructure while adding a parallel path for simpler evaluators. This was considered because it would preserve backwards compatibility for older workflows while enabling new workflows to opt into a lighter model. It was not chosen because the PR rewrites the core guidance around a single minimal evaluator form, updates verification to require only ordered metric arrays, and removes contract concepts such as baselines and maturation rather than making them optional. + +#### Alternative 3: Measure operational value primarily by applied GitHub mutations + +The project could define operational value only after requested issues, comments, or other mutations are actually applied downstream. This was considered because applied mutations are stronger evidence than requested actions. It was not chosen because the PR explicitly notes that grading occurs before the safe-output job applies requests and therefore the strongest attributable effect for many workflows is the verifiable requested action, not a future applied mutation. + +### Consequences + +#### Positive +- Operational-value evaluators become smaller and easier to reason about because they grade a single run from currently available evidence. +- Workflow-specific semantics move into frozen evaluator code and fixtures, reducing generic infrastructure and hindsight tuning risk. +- The contract more clearly separates requested safe outputs from applied mutations, which makes grading claims more honest about what was actually observed. + +#### Negative +- gh-aw loses built-in historical replay, maturation, and baseline mechanisms that previously supported cross-run reporting in the generic infrastructure. +- Each workflow evaluator must now encode more domain-specific decision logic directly, which can increase authoring burden and duplication. +- Some long-term outcomes can no longer be measured directly and must be represented by weaker but observable precursor effects at grading time. + +#### Neutral +- Evaluators now output an ordered metric array with the first metric treated as primary and later metrics as diagnostics. +- File-backed evaluators gain explicit semantic fixture files, while inline evaluators must carry equivalent coverage in workflow tests. +- Existing workflows adopting this model need paired workflow-and-evaluator updates validated by the new contract-change script. + +--- + +*ADR created by [adr-writer agent]. Review and finalize before changing status from Draft to Accepted.* diff --git a/docs/src/content/docs/experimental/trace-graders.md b/docs/src/content/docs/experimental/trace-graders.md index 0297296e219..c9808cb86f8 100644 --- a/docs/src/content/docs/experimental/trace-graders.md +++ b/docs/src/content/docs/experimental/trace-graders.md @@ -3,7 +3,7 @@ title: Graders description: Deterministic execution and operational value metrics --- -Graders compute deterministic metrics without LLM calls. Built-in and custom inline graders inspect post-agent execution traces. The reserved `operational-value` grader evaluates operational repository outcomes under a frozen evaluator and explicit evidence cutoff. Results are persisted in the agent artifact for downstream tools. +Graders compute deterministic metrics without LLM calls. Built-in and custom inline graders inspect post-agent execution traces. The reserved `operational-value` grader evaluates the current run's operational outcome under a frozen evaluator. Results are persisted in the agent artifact for downstream tools. For normative requirements, see the [Graders Specification](/gh-aw/specs/graders-specification/). @@ -58,53 +58,49 @@ Custom scripts must return a value and stay within 4096 characters (no `require` ## Operational value grader -Configure the reserved `operational-value` grader with a repository-relative Bash evaluator: +Configure the reserved `operational-value` grader with either inline Bash: ```aw wrap graders: operational-value: - run: .github/graders/daily-file-diet-operational-value.sh -``` - -The compiler freezes the evaluator bytes, records their SHA-256 digest, and expects the evaluator to return absolute operational attainment in `[0,1]` for the run's assigned case. A frozen baseline is optional metadata; when present, gh-aw derives `deltaFromBaseline` without changing the primary value. - -Each result records the run subject, operational case, evidence time, maturity, and provenance. Evaluators may query only the repositories declared by their frozen evidence contract. They receive `GH_TOKEN` with the agent job's explicitly declared permissions, but no workflow secrets, and enabling the grader does not add evidence permissions to the agent job. - -Use the `operational value designer` skill (`/operational-value-designer`) to infer operational value from an agentic workflow and design and verify an operational-value evaluator. - -### Regrade a historical run - -```bash -gh aw graders operational-value 123456789 \ - --evidence-at 2026-08-30T12:00:00.000Z \ - --json + name: Goal Attainment + description: Whether the current run attained the workflow's intended outcome + unit: ratio + direction: higher_is_better + script: | + #!/usr/bin/env bash + set -euo pipefail + request=$(cat) + printf '%s\n' '[{"id":"goal-attained","value":1}]' ``` -The command downloads the original grader artifact and reuses its case, run subject, and frozen evaluator. The archived evaluator must match the digest recorded by both the original manifest and result and the evaluator at the recorded commit in the current repository checkout. Regrading emits a new observation identified by `(runId, evaluatorDigest, evidenceAt)` and never modifies the original artifact. Use `--repo [HOST/]OWNER/REPO` to select the host for the checked-out repository. +or a repository-relative Bash evaluator: -### Build a historical report - -```bash -gh aw graders operational-value report daily-file-diet +```aw wrap +graders: + operational-value: + name: File Diet Decision Conformance + description: Whether the run requested the correct refactoring issue or noop + unit: ratio + direction: higher_is_better + run: .github/graders/daily-file-diet-operational-value.sh ``` -The report command discovers completed workflow runs from the evaluator's declared adoption time onward, applies the current evaluator digest to each run, and writes a structured JSON report, an SVG timeline, and a Markdown report under `reports/operational-value`. The versioned JSON is the machine-readable integration contract, and each observation has the stable identity `(repository, workflowId, runId, runAttempt, evaluatorDigest)`. - -Pre-grader runs do not have an archived case or event payload, so the evaluator request includes run ID, attempt, repository, workflow, ref, commit SHA, event name, creation time, and `case: null`. The evaluator must reconstruct the case from that run subject. If accepted evidence still cannot reconstruct the case, the result remains unavailable rather than being scored as zero. +Specify exactly one of `script` or `run`. Give the primary metric a concise `name`, `description`, `unit`, and `direction`; its description is retained in grader artifacts. Document every emitted metric in evaluator comments so its meaning is frozen with the evaluator bytes. The compiler records the evaluator's SHA-256 digest and packages its exact bytes with the run. -Mature numeric observations are cached in Monday-based UTC weekly files under the user cache directory, partitioned by repository, workflow ID, evaluator digest, and week. Independent weeks are evaluated concurrently; use `--concurrency` to control evaluator executions (default `8`). Use `--refresh` to replay every run, `--until` to set an evidence endpoint, `--cache-dir` to relocate the cache, and `--output` to relocate the report artifacts. +The evaluator runs once with no arguments. It reads a request containing `schemaVersion`, `run`, `event`, `outputs`, and `config` from standard input. `outputs` contains the current run's validated safe-output requests; those requests do not prove that their GitHub mutations were applied. The evaluator writes one non-empty ordered array of `{id,value}` metrics. The first metric is primary; later metrics are diagnostics. Values are finite numbers in `[0,1]` or `null`. -Every run remains present in the JSON report and timeline. Weekly primary means keep only the latest observation for each repeated `opportunityKey` within that week. Evaluators may also declare normalized diagnostic metrics with `latest` or `mean` weekly aggregation; the report plots and tabulates each diagnostic independently without folding it into the primary value. The report also includes coverage, errors, frozen contract details, baseline and delta when available, and a warning that the observations do not establish causation. +Evaluators receive `GH_TOKEN` with the agent job's explicitly declared permissions, but no workflow secrets, and enabling the grader does not add evidence permissions to the agent job. -The SVG and Markdown files are standalone local exports, not historical storage or source fixtures. Do not commit live report output merely to retain observations. Consumers such as Central Agentic Ops should ingest the JSON contract and own their presentation. The weekly user cache speeds replay but is not authoritative; deleting it causes gh-aw to rebuild observations from target-repository run metadata and accepted evidence. +Use the `operational value designer` skill (`/operational-value-designer`) to infer operational value from an agentic workflow and design and verify an operational-value evaluator. ## Output files | File | Description | |---|---| | `grader_manifest.json` | Which graders were configured and their enabled state | -| `grader_results.json` | Normalized values, status, implementation identity, and value observations | -| `operational_value_evaluator.sh` | Exact frozen operational-value evaluator used for initial grading and historical replay | +| `grader_results.json` | Normalized values, status, implementation identity, and ordered operational-value metrics | +| `operational_value_evaluator.sh` | Exact frozen operational-value evaluator used for this run | All files are included in the unified `agent` artifact. diff --git a/docs/src/content/docs/reference/artifacts.md b/docs/src/content/docs/reference/artifacts.md index fdc3220132c..1cec68dd0ca 100644 --- a/docs/src/content/docs/reference/artifacts.md +++ b/docs/src/content/docs/reference/artifacts.md @@ -334,7 +334,7 @@ gh run download -n agent gh run download -n agent-output-fallback ``` -`gh aw audit` reports grader outcomes in its console output and includes them in the JSON report under the `graders` key (results, plus `total`, `passed`, `failed`, `error_count`, and `unavailable_count`). Use `gh aw graders operational-value ` to replay the archived operational-value evaluator at an explicit evidence cutoff. +`gh aw audit` reports grader outcomes in its console output and includes them in the JSON report under the `graders` key (results, plus `total`, `passed`, `failed`, `error_count`, and `unavailable_count`). The artifact also retains the exact operational-value evaluator bytes used for that run. ## Naming Compatibility diff --git a/docs/src/content/docs/reference/glossary.md b/docs/src/content/docs/reference/glossary.md index 4f4ab1a0ee8..638b3f67f7a 100644 --- a/docs/src/content/docs/reference/glossary.md +++ b/docs/src/content/docs/reference/glossary.md @@ -1688,7 +1688,7 @@ Deterministic, non-LLM checks that compute metrics from a workflow run's post-ag ### Operational Value Grader (`graders.operational-value`) -A reserved grader that evaluates operational repository outcomes using a repository-relative Bash evaluator script, frozen at compile time with its SHA-256 digest recorded for reproducibility. It returns an absolute operational attainment value in `[0,1]` for the run's assigned case, alongside the evaluation's evidence timestamp, maturity, and provenance. A frozen baseline is optional metadata used to derive `deltaFromBaseline` without changing the primary operational value. The evaluator receives the workflow token via `GH_TOKEN` with the agent job's declared permissions, but not workflow secrets, and enabling the grader does not add evidence permissions to the agent job. Historical runs can be recomputed with `gh aw graders operational-value --evidence-at `. See [Graders Reference](/gh-aw/experimental/trace-graders/#operational-value-grader) and the `operational value designer` skill (`/operational-value-designer`) for inferring operational value from an agentic workflow. +A reserved grader that evaluates operational repository outcomes using inline Bash or a repository-relative Bash file, frozen at compile time with its SHA-256 digest recorded for reproducibility. It runs once with no arguments, reads the current run request from standard input, and writes an ordered array of normalized metrics. The first metric is primary and later metrics are diagnostics. The evaluator receives the workflow token via `GH_TOKEN` with the agent job's declared permissions, but not workflow secrets, and enabling the grader does not add evidence permissions to the agent job. See [Graders Reference](/gh-aw/experimental/trace-graders/#operational-value-grader) and the `operational value designer` skill (`/operational-value-designer`) for inferring operational value from an agentic workflow. ### Recurrence Trapping Time (RQA TT) (`graders.recurrence-trapping-time`) diff --git a/docs/src/content/docs/setup/cli.md b/docs/src/content/docs/setup/cli.md index 5e3d325ad34..842135889c7 100644 --- a/docs/src/content/docs/setup/cli.md +++ b/docs/src/content/docs/setup/cli.md @@ -587,20 +587,20 @@ The diff output shows: new or removed network domains, status changes (allowed #### `graders` -Inspect and replay workflow graders. `graders run` runs one grader declared by a -local workflow against a saved run payload or JSON from standard input. -`graders operational-value` regrades the operational-value observation from a -completed workflow run at an explicit evidence cutoff. It verifies and executes -the evaluator archived by the run without modifying the original artifact. +Run one grader declared by a local workflow against a saved run payload or JSON +from standard input. Operational-value evaluators use the same one-shot request +shape as workflow execution and return an ordered metric array. The command +executes either Bash embedded in `graders.operational-value.script` or a Bash +file referenced by `graders.operational-value.run`; operational-value graders +require standard input because historical replay is not supported. ```bash wrap gh aw graders run weekly-research loops 123456789 cat payload.json | gh aw graders run weekly-research loops -gh aw graders operational-value 123456789 \ - --evidence-at 2026-08-30T12:00:00.000Z --json +cat request.json | gh aw graders run daily-file-diet operational-value ``` -**Options:** `--evidence-at` (required), `--json/-j`, `--repo/-r` +**Options:** `--repo/-r` #### `outcomes` diff --git a/docs/src/content/docs/specs/graders-specification.md b/docs/src/content/docs/specs/graders-specification.md index 38eb72e96bf..8cf77b290f9 100644 --- a/docs/src/content/docs/specs/graders-specification.md +++ b/docs/src/content/docs/specs/graders-specification.md @@ -17,7 +17,7 @@ sidebar: ## Abstract -This specification defines the `graders` feature in gh-aw: deterministic execution metrics and operational value observations persisted as structured artifacts. It specifies configuration, built-in grader behavior, custom inline grader constraints, operational-value grader behavior, execution ordering, artifact outputs, historical regrading, experiment metric references, and conformance requirements. +This specification defines the `graders` feature in gh-aw: deterministic execution metrics and operational-value results persisted as structured artifacts. It specifies configuration, built-in grader behavior, custom inline grader constraints, operational-value grader behavior, execution ordering, artifact outputs, experiment metric references, and conformance requirements. ## Status of This Document @@ -57,7 +57,7 @@ This specification covers: - Frontmatter configuration under `graders` - Built-in grader identifiers and semantics - Custom inline grader script requirements -- Operational-value evaluator and replay requirements +- Operational-value evaluator requirements - Output artifact contracts - Experiment metric integration for grader references @@ -71,7 +71,7 @@ This specification does NOT cover: A conforming implementation: -1. MUST compute grader values deterministically for the same inputs and evidence cutoff. +1. MUST compute grader values deterministically for the same request and observable evidence. 2. MUST preserve stable grader IDs for experiment references. 3. MUST keep trace grading isolated from network-dependent behavior. 4. MUST emit machine-readable grader artifacts for downstream tooling. @@ -129,7 +129,7 @@ The configuration key MUST be `graders`. - Built-in grader entries MAY be `null` to enable defaults. - Custom grader entries MUST be objects and MUST include `script`. -- The reserved `operational-value` entry MUST be an object and MUST include `run`. +- The reserved `operational-value` entry MUST be an object and MUST include exactly one of `run` or `script`. Supported object fields include `enabled`, `name`, `description`, `unit`, `direction`, `threshold`, `min`, `max`, `config`, `script`, and `run`. Only the reserved `operational-value` grader accepts `run`. @@ -186,26 +186,15 @@ Inline scripts MUST be rejected if they contain any forbidden pattern, including ## 7. Operational Value Grader -The reserved grader ID MUST be `operational-value`. It MUST NOT accept an inline `script`. +The reserved grader ID MUST be `operational-value`. It MUST define exactly one evaluator source: inline Bash in `script`, or a repository-relative Bash file in `run`. -The compiler MUST resolve `run` within the repository, reject symlinks and non-regular files, validate Bash syntax prerequisites, freeze the evaluator bytes, and record their SHA-256 digest in the grader manifest and result implementation. +The grader SHOULD declare a concise `name`, `description`, `unit`, and `direction` for its primary metric. The evaluator SHOULD document the workflow intent and every emitted metric's meaning, including `1`, `0`, and `null`, in source comments that are frozen with the evaluator bytes. The primary description MUST be retained in the grader manifest and normalized result when declared. -The evaluator MUST implement `--definition` and `--grade-run`. Its primary `value` MUST be absolute operational attainment in `[0,1]` or `null`. A baseline MAY be frozen separately; gh-aw MUST derive `deltaFromBaseline` and MUST NOT replace the primary value with that delta. +Both forms MUST be valid UTF-8, start with a Bash shebang, pass Bash syntax validation, and contain no more than 65,536 bytes. The compiler MUST resolve `run` within the repository and reject symlinks and non-regular files. It MUST freeze either source as exact evaluator bytes and record their SHA-256 digest in the grader manifest and result implementation. -An operational-value observation MUST include: +The evaluator MUST run once with no mode arguments. It MUST read one JSON request from standard input containing `schemaVersion`, `run`, `event`, `outputs`, and `config`. `outputs` MUST contain the current run's validated safe-output requests and MUST NOT be treated as proof that requested GitHub mutations were applied. The evaluator MUST write exactly one non-empty ordered array of objects containing exactly `id` and `value`. IDs MUST be non-empty and unique. Values MUST be finite numbers in `[0,1]` or `null`. The first item is the primary metric; later items are diagnostics. -- the complete workflow run subject and run attempt; -- a stable opportunity key and replayable operational case; -- requested evidence time, effective evidence cutoff, and maturity time; -- accepted evidence provenance for every numeric value. - -The effective evidence cutoff MUST NOT follow either the requested evidence time or the maturity time. A replayed observation MUST be identified by `(runId, evaluatorDigest, evidenceAt)`. - -Historical regrading MUST reuse the original case, run subject, and archived evaluator. It MUST verify that the archived evaluator matches the digest recorded by both the original manifest and result and the evaluator at the recorded commit in a trusted local checkout before execution. It MUST emit a new observation and MUST NOT mutate the original run artifact. - -A historical report MUST apply one current evaluator digest to every included run so observations remain comparable. It MUST discover completed runs no earlier than the contract's adoption time. For runs without grader artifacts, it MUST provide the available workflow run subject and a null case and event, allowing the evaluator to reconstruct assignment from accepted evidence. It MUST preserve unavailable and failed observations and MUST NOT coerce missing evidence to zero. - -Historical report caches MUST be partitioned by repository, workflow ID, evaluator digest, and UTC week. Only mature numeric observations MAY be treated as final cache entries. Report output MUST retain every run-level observation. Aggregates MUST NOT treat repeated opportunity keys within one week as independent observations; the latest observation for each key in that week is used for the weekly mean. +The evaluator MUST return the same metric array for the same request and observable evidence. Missing or malformed required evidence MUST produce `null`, not zero. Historical replay, maturation, baselines, opportunity keys, evaluator definitions, provenance schemas, caches, and reports are outside this contract. --- @@ -275,7 +264,6 @@ semantic task correctness. The normative readiness, decision, and JSON contracts - Grading MUST operate on local run artifacts and MUST NOT require outbound network access for built-ins. - Custom inline graders MUST execute in a restricted context with blocked dangerous primitives. - Operational-value graders MAY access declared repository evidence using `GH_TOKEN`; implementations MUST NOT add agent-job permission scopes on behalf of the evaluator, and evaluators MUST NOT receive workflow secrets. -- Historical regrading MUST verify archived evaluator bytes against both digest records and a trusted local checkout at the recorded commit before execution. - Implementations SHOULD enforce bounded execution time for inline scripts. - Implementations SHOULD redact grader outputs when custom scripts are enabled to reduce secret leakage risk. @@ -296,9 +284,9 @@ semantic task correctness. The normative readiness, decision, and JSON contracts - **T-GRD-009**: Grader files are present in `agent` artifact. - **T-GRD-010**: `experiments.*.metric` with `grader:` validates declared enabled grader. - **T-GRD-011**: `experiments.*.metric` with `graders..value` validates declared enabled grader. -- **T-GRD-012**: `graders.operational-value.run` is frozen and its digest is recorded. -- **T-GRD-013**: Operational-value output, evidence cutoff, maturity, and provenance are validated. -- **T-GRD-014**: Historical regrading rejects evaluator or run identity mismatches. +- **T-GRD-012**: Each operational-value evaluator source is frozen and its digest is recorded. +- **T-GRD-013**: Operational-value metric arrays, IDs, values, and ordering are validated. +- **T-GRD-014**: Operational-value `script` and `run` enforce the inclusive 65,536-byte limit. ### 11.2 Compliance Checklist @@ -310,8 +298,7 @@ semantic task correctness. The normative readiness, decision, and JSON contracts | Script safety constraints enforced | T-GRD-004, T-GRD-005 | 2 | Required | | Required artifact files emitted | T-GRD-007, T-GRD-008 | 1 | Required | | Experiment grader references validate | T-GRD-010, T-GRD-011 | 3 | Required | -| Operational-value evaluators and observations validate | T-GRD-012, T-GRD-013 | 2 | Required | -| Historical regrading preserves identity | T-GRD-014 | 2 | Required | +| Operational-value evaluators and metric arrays validate | T-GRD-012, T-GRD-013, T-GRD-014 | 2 | Required | --- @@ -345,7 +332,7 @@ semantic task correctness. The normative readiness, decision, and JSON contracts ### Version 0.2.0 (Draft Specification) - Defines the operational value grader and absolute attainment semantics. -- Defines evidence-bounded historical regrading and observation identity. +- Defines frozen one-shot operational-value evaluators and their metric-array contract. ### Version 0.1.0 (Draft Specification) diff --git a/pkg/cli/cli_consistency_help_test.go b/pkg/cli/cli_consistency_help_test.go index 52c8a1fc5b8..65b71c4945b 100644 --- a/pkg/cli/cli_consistency_help_test.go +++ b/pkg/cli/cli_consistency_help_test.go @@ -84,7 +84,9 @@ func TestCLIDocsReflectStatusAuditExperimentsAndGradersCommands(t *testing.T) { text := string(content) assert.Contains(t, text, "#### `experiments`", "CLI setup docs should include the experiments command") assert.Contains(t, text, "#### `graders`", "CLI setup docs should include the graders command") - assert.Contains(t, text, "**Options:** `--evidence-at` (required), `--json/-j`, `--repo/-r`", "graders docs should include all operational-value options") + assert.Contains(t, text, "cat request.json | gh aw graders run daily-file-diet operational-value", "graders docs should show one-shot operational-value execution") + assert.Contains(t, text, "graders.operational-value.script", "graders docs should describe embedded operational-value execution") + assert.NotContains(t, text, "graders operational-value", "graders docs should not advertise removed historical regrading") assert.Contains(t, text, "#### `doctor`", "CLI setup docs should include the doctor command") assert.Contains(t, text, "The `audit` command has two modes", "audit docs should describe the current two-mode behavior") assert.NotContains(t, text, "enabled/disabled status, schedules, and labels", "status docs should not promise schedule output in console mode") diff --git a/pkg/cli/experiments_grader_observations.go b/pkg/cli/experiments_grader_observations.go index 57c38aa5653..5f06bd71e19 100644 --- a/pkg/cli/experiments_grader_observations.go +++ b/pkg/cli/experiments_grader_observations.go @@ -75,33 +75,9 @@ type graderArtifactResult struct { ID string `json:"id"` Status string `json:"status"` Value json.RawMessage `json:"value"` - Observation *graderArtifactObservation `json:"observation,omitempty"` Implementation graderArtifactImplementation `json:"implementation"` } -type graderArtifactObservation struct { - Subject graderArtifactSubject `json:"subject"` - OpportunityKey string `json:"opportunityKey"` - EvidenceAt string `json:"evidenceAt"` - EvidenceCutoff string `json:"evidenceCutoff"` - MaturesAt string `json:"maturesAt"` - Mature bool `json:"mature"` - Case map[string]any `json:"case"` - Provenance []map[string]any `json:"provenance"` -} - -type graderArtifactSubject struct { - Type string `json:"type"` - RunID string `json:"runId"` - Attempt int `json:"attempt"` - Repository string `json:"repository"` - Workflow string `json:"workflow"` - Ref string `json:"ref"` - SHA string `json:"sha"` - EventName string `json:"eventName"` - CreatedAt *string `json:"createdAt"` -} - type graderArtifactImplementation struct { ID string `json:"id"` Version int `json:"version"` diff --git a/pkg/cli/graders_command.go b/pkg/cli/graders_command.go index ea243d8fadf..45b8b8c4ab9 100644 --- a/pkg/cli/graders_command.go +++ b/pkg/cli/graders_command.go @@ -1,22 +1,19 @@ package cli import ( - "errors" "os" - "strconv" "github.com/github/gh-aw/pkg/constants" "github.com/spf13/cobra" ) -// NewGradersCommand creates commands for inspecting and replaying workflow graders. +// NewGradersCommand creates commands for running workflow graders. func NewGradersCommand() *cobra.Command { cmd := &cobra.Command{ Use: "graders", - Short: "Inspect and replay workflow graders", + Short: "Run workflow graders", } cmd.AddCommand(newGradersRunCommand()) - cmd.AddCommand(newGradersOperationalValueCommand()) return cmd } @@ -26,7 +23,8 @@ func newGradersRunCommand() *cobra.Command { Short: "Run one workflow grader with a JSON payload", Long: `Run one grader declared by a local workflow. When run-id is provided, the preprocessed payload is downloaded from the run's agent artifact. Otherwise, -the JSON payload is read from standard input.`, +the JSON payload is read from standard input. Operational-value graders execute +either embedded Bash from the script field or a Bash file referenced by run.`, Example: ` ` + string(constants.CLIExtensionPrefix) + ` graders run weekly-research loops 123456789 cat payload.json | ` + string(constants.CLIExtensionPrefix) + ` graders run weekly-research loops`, Args: cobra.RangeArgs(2, 3), @@ -55,37 +53,3 @@ the JSON payload is read from standard input.`, cmd.SetOut(os.Stdout) return cmd } - -func newGradersOperationalValueCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "operational-value ", - Short: "Regrade a workflow run's operational value", - Long: `Regrade the operational-value observation from a completed workflow run at an explicit -evidence cutoff. The command verifies and executes the exact evaluator archived -by the run. The original artifact is not modified.`, - Example: ` ` + string(constants.CLIExtensionPrefix) + ` graders operational-value 123456789 \ - --evidence-at 2026-08-30T12:00:00.000Z --json`, - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - runID, err := strconv.ParseInt(args[0], 10, 64) - if err != nil || runID <= 0 { - return errors.New("run ID must be a positive integer") - } - evidenceAt, _ := cmd.Flags().GetString("evidence-at") - repoOverride, _ := cmd.Flags().GetString("repo") - jsonOutput, _ := cmd.Flags().GetBool("json") - return RunOperationalValueRegrade(cmd.Context(), OperationalValueRegradeConfig{ - RunID: runID, - EvidenceAt: evidenceAt, - RepoOverride: repoOverride, - JSONOutput: jsonOutput, - }) - }, - } - cmd.Flags().String("evidence-at", "", "UTC evidence cutoff for this observation") - _ = cmd.MarkFlagRequired("evidence-at") - addRepoFlag(cmd) - addJSONFlag(cmd) - cmd.AddCommand(newGradersOperationalValueReportCommand()) - return cmd -} diff --git a/pkg/cli/graders_integration_test.go b/pkg/cli/graders_integration_test.go index 752ba67963b..9b4667a29cb 100644 --- a/pkg/cli/graders_integration_test.go +++ b/pkg/cli/graders_integration_test.go @@ -23,7 +23,7 @@ func TestGradersCommandIntegration(t *testing.T) { { name: "graders help", args: []string{"graders", "--help"}, - wantOutput: []string{"Inspect and replay workflow graders", "operational-value", "run"}, + wantOutput: []string{"Run workflow graders", "run"}, }, { name: "run grader help", @@ -36,34 +36,6 @@ func TestGradersCommandIntegration(t *testing.T) { wantErr: true, wantOutput: []string{"run ID must be a positive integer"}, }, - { - name: "operational value help", - args: []string{"graders", "operational-value", "--help"}, - wantOutput: []string{"Regrade the operational-value observation", "report", "--evidence-at", "--repo", "--json"}, - }, - { - name: "operational value report help", - args: []string{"graders", "operational-value", "report", "--help"}, - wantOutput: []string{"complete operational-value history", "--until", "--cache-dir", "--refresh", "--output"}, - }, - { - name: "operational value requires run ID", - args: []string{"graders", "operational-value", "--evidence-at", "2026-08-30T12:00:00.000Z"}, - wantErr: true, - wantOutput: []string{"accepts 1 arg(s)"}, - }, - { - name: "operational value requires evidence cutoff", - args: []string{"graders", "operational-value", "123456789"}, - wantErr: true, - wantOutput: []string{"required flag(s) \"evidence-at\" not set"}, - }, - { - name: "operational value rejects invalid run ID", - args: []string{"graders", "operational-value", "0", "--evidence-at", "2026-08-30T12:00:00.000Z"}, - wantErr: true, - wantOutput: []string{"run ID must be a positive integer"}, - }, } for _, tt := range tests { diff --git a/pkg/cli/graders_operational_value_regrade.go b/pkg/cli/graders_operational_value_regrade.go deleted file mode 100644 index 1b108ed46dd..00000000000 --- a/pkg/cli/graders_operational_value_regrade.go +++ /dev/null @@ -1,717 +0,0 @@ -package cli - -import ( - "bytes" - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "math" - "net/url" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "time" - "unicode/utf8" - - "github.com/github/gh-aw/pkg/console" - "github.com/github/gh-aw/pkg/constants" - "github.com/github/gh-aw/pkg/gitutil" - "github.com/github/gh-aw/pkg/repoutil" - "github.com/github/gh-aw/pkg/stringutil" -) - -const ( - maxOperationalValueRegradeEvaluatorBytes = 64 * 1024 - maxOperationalValueRegradeOutputBytes = 1024 * 1024 - operationalValueDefinitionTimeout = 5 * time.Second - operationalValueEvaluatorTimeout = 2 * time.Minute -) - -// OperationalValueRegradeConfig configures historical operational-value regrading. -type OperationalValueRegradeConfig struct { - RunID int64 - EvidenceAt string - RepoOverride string - JSONOutput bool -} - -type operationalValueGraderManifest struct { - Version int `json:"version"` - Graders []operationalValueGraderManifestEntry `json:"graders"` -} - -type operationalValueGraderManifestEntry struct { - ID string `json:"id"` - Name string `json:"name"` - Source string `json:"source"` - Enabled bool `json:"enabled"` - Unit string `json:"unit,omitempty"` - Direction string `json:"direction,omitempty"` - Threshold *float64 `json:"threshold,omitempty"` - Digest string `json:"digest"` - Run string `json:"run"` - Config map[string]any `json:"config,omitempty"` -} - -type operationalValueRunSubject struct { - ID string `json:"id"` - Attempt int `json:"attempt"` - Repository string `json:"repository"` - Workflow string `json:"workflow"` - Ref string `json:"ref"` - SHA string `json:"sha"` - EventName string `json:"eventName"` - CreatedAt *string `json:"createdAt"` -} - -type operationalValueRunRequest struct { - SchemaVersion int `json:"schemaVersion"` - Run operationalValueRunSubject `json:"run"` - EvidenceAt string `json:"evidenceAt"` - Case map[string]any `json:"case"` - Event any `json:"event"` - Config map[string]any `json:"config"` -} - -type operationalValueRegradeObservation struct { - Subject graderArtifactSubject `json:"subject"` - OpportunityKey string `json:"opportunityKey"` - EvidenceAt string `json:"evidenceAt"` - EvidenceCutoff string `json:"evidenceCutoff"` - MaturesAt string `json:"maturesAt"` - Mature bool `json:"mature"` - Case map[string]any `json:"case"` - Provenance []map[string]any `json:"provenance"` -} - -type operationalValueRegradeResult struct { - ID string `json:"id"` - Name string `json:"name"` - Value *float64 `json:"value"` - Unit string `json:"unit"` - Passed *bool `json:"passed"` - Status string `json:"status"` - Source string `json:"source"` - Message string `json:"message,omitempty"` - Observation operationalValueRegradeObservation `json:"observation"` - Diagnostics map[string]any `json:"diagnostics,omitempty"` - BaselineValue *float64 `json:"baselineValue"` - DeltaFromBaseline *float64 `json:"deltaFromBaseline"` - Implementation graderArtifactImplementation `json:"implementation"` -} - -type operationalValueRegradeMetadata struct { - Identity operationalValueRegradeIdentity `json:"identity"` - OriginalEvidenceAt string `json:"originalEvidenceAt"` -} - -type operationalValueRegradeIdentity struct { - RunID string `json:"runId"` - EvaluatorDigest string `json:"evaluatorDigest"` - EvidenceAt string `json:"evidenceAt"` -} - -type operationalValueRegradeArtifact struct { - Version int `json:"version"` - Run graderArtifactRun `json:"run"` - Regrade operationalValueRegradeMetadata `json:"regrade"` - Results []operationalValueRegradeResult `json:"results"` -} - -type operationalValueEvaluatorExecution struct { - Value *float64 - Message string - Diagnostics map[string]any - Observation operationalValueRegradeObservation - BaselineValue *float64 - DeltaFromBaseline *float64 -} - -type boundedCommandBuffer struct { - bytes.Buffer - limit int - exceeded bool -} - -func (b *boundedCommandBuffer) Write(data []byte) (int, error) { - written := len(data) - remaining := b.limit - b.Len() - if remaining > 0 { - if len(data) < remaining { - remaining = len(data) - } - _, _ = b.Buffer.Write(data[:remaining]) - } - if written > remaining { - b.exceeded = true - } - return written, nil -} - -// RunOperationalValueRegrade downloads a historical grader observation and recomputes it as of EvidenceAt. -func RunOperationalValueRegrade(ctx context.Context, config OperationalValueRegradeConfig) error { - evidenceAt, err := parseOperationalValueTimestamp(config.EvidenceAt, "evidence-at") - if err != nil { - return err - } - repoSlug, artifactRepo, evaluatorHost, err := resolveOperationalValueRegradeRepo(config.RepoOverride) - if err != nil { - return err - } - - tempDir, err := os.MkdirTemp("", "gh-aw-operational-value-regrade-*") - if err != nil { - return fmt.Errorf("failed to create operational-value regrade directory: %w", err) - } - defer os.RemoveAll(tempDir) - - runIDText := strconv.FormatInt(config.RunID, 10) - source := newGitHubGraderRunArtifactSource(tempDir, artifactRepo) - runData := source.downloadGraderArtifact(ctx, config.RunID, runIDText) - if runData.ExclusionReason != "" { - return fmt.Errorf("cannot regrade run %d: grader artifact %s", config.RunID, runData.ExclusionReason) - } - runDir := filepath.Join(tempDir, runIDText) - evaluatorContent, evaluatorDigest, err := readArchivedOperationalValueEvaluator(runDir) - if err != nil { - return err - } - manifest, err := readOperationalValueGraderManifest(runDir) - if err != nil { - return err - } - manifestEntry, originalResult, err := selectHistoricalOperationalValueGrader(manifest, runData.Artifact, runIDText) - if err != nil { - return err - } - if err := verifyHistoricalOperationalValueIdentity(repoSlug, evaluatorDigest, manifestEntry, originalResult, runData.Artifact.Run, runIDText); err != nil { - return err - } - currentRepoSlug, err := GetCurrentRepoSlug() - if err != nil { - return fmt.Errorf("cannot establish a trusted checkout for operational-value replay: %w", err) - } - gitRoot, err := gitutil.FindGitRoot() - if err != nil { - return fmt.Errorf("cannot establish a trusted checkout for operational-value replay: %w", err) - } - if err := verifyArchivedOperationalValueEvaluatorSource(gitRoot, currentRepoSlug, repoSlug, evaluatorContent, evaluatorDigest, *manifestEntry, originalResult.Observation.Subject); err != nil { - return err - } - - execution, err := executeHistoricalOperationalValueEvaluator(ctx, evaluatorContent, *manifestEntry, *originalResult.Observation, config.EvidenceAt, evidenceAt, evaluatorHost) - if err != nil { - return err - } - artifact := buildOperationalValueRegradeArtifact(runData.Artifact.Run, *manifestEntry, *originalResult, evaluatorDigest, execution) - return renderOperationalValueRegradeArtifact(artifact, config.JSONOutput) -} - -func resolveOperationalValueRegradeRepo(repoOverride string) (repoSlug, artifactRepo, evaluatorHost string, err error) { - if repoOverride == "" { - repoSlug, err = GetCurrentRepoSlug() - return repoSlug, "", getGitHubHostForRepo(repoSlug), err - } - ownerRepo, host := repoutil.NormalizeRepoForAPI(repoOverride) - owner, repo, splitErr := repoutil.SplitRepoSlug(ownerRepo) - if splitErr != nil { - return "", "", "", fmt.Errorf("invalid --repo %q: expected [HOST/]owner/repo", repoOverride) - } - evaluatorHost = getGitHubHostForRepo(ownerRepo) - if host != "" { - evaluatorHost = stringutil.NormalizeGitHubHostURL(host) - } - return strings.Join([]string{owner, repo}, "/"), repoOverride, evaluatorHost, nil -} - -func readArchivedOperationalValueEvaluator(runDir string) (string, string, error) { - evaluatorPath := filepath.Join(runDir, "agent", "graders", constants.OperationalValueEvaluatorFilename.String()) - info, err := os.Lstat(evaluatorPath) - if err != nil { - evaluatorPath = filepath.Join(runDir, "graders", constants.OperationalValueEvaluatorFilename.String()) - info, err = os.Lstat(evaluatorPath) - } - if err != nil { - return "", "", fmt.Errorf("cannot inspect archived operational-value evaluator: %w", err) - } - if info.Mode()&os.ModeSymlink != 0 { - return "", "", errors.New("archived operational-value evaluator must not be a symbolic link") - } - if !info.Mode().IsRegular() { - return "", "", errors.New("archived operational-value evaluator must be a regular file") - } - file, err := os.Open(evaluatorPath) - if err != nil { - return "", "", fmt.Errorf("cannot read archived operational-value evaluator: %w", err) - } - defer file.Close() - content, err := io.ReadAll(io.LimitReader(file, maxOperationalValueRegradeEvaluatorBytes+1)) - if err != nil { - return "", "", fmt.Errorf("cannot read archived operational-value evaluator: %w", err) - } - if len(content) > maxOperationalValueRegradeEvaluatorBytes { - return "", "", fmt.Errorf("archived operational-value evaluator exceeds the %d-byte limit", maxOperationalValueRegradeEvaluatorBytes) - } - if !utf8.Valid(content) { - return "", "", errors.New("archived operational-value evaluator must be valid UTF-8") - } - evaluatorContent := string(content) - if !strings.HasPrefix(evaluatorContent, "#!/usr/bin/env bash\n") && !strings.HasPrefix(evaluatorContent, "#!/bin/bash\n") { - return "", "", errors.New("archived operational-value evaluator must start with a Bash shebang") - } - digest := sha256.Sum256(content) - return evaluatorContent, hex.EncodeToString(digest[:]), nil -} - -func readOperationalValueGraderManifest(runDir string) (*operationalValueGraderManifest, error) { - manifestPath := filepath.Join(runDir, "agent", "graders", constants.GraderManifestFilename.String()) - if _, err := os.Stat(manifestPath); err != nil { - manifestPath = filepath.Join(runDir, "graders", constants.GraderManifestFilename.String()) - } - file, err := os.Open(manifestPath) - if err != nil { - return nil, fmt.Errorf("cannot read grader manifest: %w", err) - } - defer file.Close() - data, err := io.ReadAll(io.LimitReader(file, maxGraderResultsBytes+1)) - if err != nil { - return nil, fmt.Errorf("cannot read grader manifest: %w", err) - } - if len(data) > maxGraderResultsBytes { - return nil, fmt.Errorf("grader manifest exceeds the %d-byte limit", maxGraderResultsBytes) - } - var manifest operationalValueGraderManifest - if err := json.Unmarshal(data, &manifest); err != nil || manifest.Version <= 0 { - return nil, errors.New("grader manifest is malformed") - } - return &manifest, nil -} - -func selectHistoricalOperationalValueGrader(manifest *operationalValueGraderManifest, artifact *graderResultsArtifact, runID string) (*operationalValueGraderManifestEntry, *graderArtifactResult, error) { - if manifest == nil || artifact == nil { - return nil, nil, fmt.Errorf("run %s has no grader data", runID) - } - var manifestEntry *operationalValueGraderManifestEntry - for index := range manifest.Graders { - if manifest.Graders[index].ID != "operational-value" { - continue - } - if manifestEntry != nil { - return nil, nil, fmt.Errorf("run %s grader manifest contains duplicate operational-value graders", runID) - } - manifestEntry = &manifest.Graders[index] - } - var result *graderArtifactResult - for index := range artifact.Results { - if artifact.Results[index].ID != "operational-value" { - continue - } - if result != nil { - return nil, nil, fmt.Errorf("run %s grader artifact contains duplicate operational-value results", runID) - } - result = &artifact.Results[index] - } - if manifestEntry == nil || !manifestEntry.Enabled || manifestEntry.Source != "operational-value" { - return nil, nil, fmt.Errorf("run %s did not use an enabled operational-value grader", runID) - } - if result == nil || result.Observation == nil { - return nil, nil, fmt.Errorf("run %s has no replayable operational-value observation", runID) - } - return manifestEntry, result, nil -} - -func verifyHistoricalOperationalValueIdentity(repoSlug, evaluatorDigest string, manifest *operationalValueGraderManifestEntry, result *graderArtifactResult, run graderArtifactRun, runID string) error { - if run.ID != runID || run.Attempt <= 0 { - return fmt.Errorf("grader artifact run identity does not match run %s", runID) - } - if manifest.Digest == "" || result.Implementation.Digest == "" || manifest.Digest != result.Implementation.Digest { - return fmt.Errorf("run %s has inconsistent operational-value evaluator provenance", runID) - } - if evaluatorDigest != manifest.Digest { - return fmt.Errorf("operational-value evaluator digest mismatch: run %s recorded %s, local evaluator is %s", runID, manifest.Digest, evaluatorDigest) - } - subject := result.Observation.Subject - if subject.Type != "workflow-run" || subject.RunID != runID || subject.Attempt != run.Attempt { - return fmt.Errorf("operational-value observation subject does not match run %s attempt %d", runID, run.Attempt) - } - if subject.Repository == "" || subject.Repository != repoSlug { - return fmt.Errorf("operational-value observation repository %q does not match %q", subject.Repository, repoSlug) - } - if result.Observation.Case == nil { - return fmt.Errorf("run %s operational-value observation has no replayable case", runID) - } - return nil -} - -func verifyArchivedOperationalValueEvaluatorSource(gitRoot, currentRepoSlug, requestedRepoSlug, evaluatorContent, evaluatorDigest string, manifest operationalValueGraderManifestEntry, subject graderArtifactSubject) error { - if !strings.EqualFold(currentRepoSlug, requestedRepoSlug) { - return fmt.Errorf("refusing to execute an operational-value evaluator from %q without a trusted local checkout of that repository", requestedRepoSlug) - } - objectArg, err := buildSafeGitShowObjectArg(subject.SHA, manifest.Run) - if err != nil { - return errors.New("operational-value evaluator provenance contains an unsafe commit or path") - } - cmd := exec.Command("git", "-C", gitRoot, "show", "--no-ext-diff", "--no-textconv", objectArg) - trustedContent, err := cmd.Output() - if err != nil { - return fmt.Errorf("cannot establish operational-value evaluator from trusted commit %s: %w", subject.SHA, err) - } - trustedDigest := sha256.Sum256(trustedContent) - if hex.EncodeToString(trustedDigest[:]) != evaluatorDigest || !bytes.Equal(trustedContent, []byte(evaluatorContent)) { - return fmt.Errorf("archived operational-value evaluator does not match %s at trusted commit %s", manifest.Run, subject.SHA) - } - return nil -} - -func executeHistoricalOperationalValueEvaluator(ctx context.Context, evaluatorContent string, manifest operationalValueGraderManifestEntry, original graderArtifactObservation, evidenceAtText string, evidenceAt time.Time, evaluatorHost string) (*operationalValueEvaluatorExecution, error) { - bashPath := "/bin/bash" - if _, err := os.Stat(bashPath); err != nil { - return nil, fmt.Errorf("bash is required to regrade operational value: %w", err) - } - tempDir, err := os.MkdirTemp("", "gh-aw-operational-value-evaluator-*") - if err != nil { - return nil, fmt.Errorf("failed to create operational-value evaluator directory: %w", err) - } - defer os.RemoveAll(tempDir) - evaluatorPath := filepath.Join(tempDir, "operational-value.sh") - if err := os.WriteFile(evaluatorPath, []byte(evaluatorContent), constants.FilePermExecutable); err != nil { - return nil, fmt.Errorf("failed to stage operational-value evaluator: %w", err) - } - if _, err := runOperationalValueEvaluatorBash(ctx, bashPath, evaluatorPath, []string{"-n", evaluatorPath}, nil, operationalValueDefinitionTimeout, evaluatorHost); err != nil { - return nil, fmt.Errorf("operational-value evaluator has invalid Bash syntax: %w", err) - } - definitionJSON, err := runOperationalValueEvaluatorBash(ctx, bashPath, evaluatorPath, []string{evaluatorPath, "--definition"}, nil, operationalValueDefinitionTimeout, evaluatorHost) - if err != nil { - return nil, fmt.Errorf("operational-value evaluator --definition failed: %w", err) - } - baselineValue, err := parseOperationalValueDefinition(definitionJSON) - if err != nil { - return nil, err - } - evaluatorConfig := manifest.Config - if evaluatorConfig == nil { - evaluatorConfig = map[string]any{} - } - request := operationalValueRunRequest{ - SchemaVersion: 1, - Run: operationalValueRunSubject{ - ID: original.Subject.RunID, - Attempt: original.Subject.Attempt, - Repository: original.Subject.Repository, - Workflow: original.Subject.Workflow, - Ref: original.Subject.Ref, - SHA: original.Subject.SHA, - EventName: original.Subject.EventName, - CreatedAt: original.Subject.CreatedAt, - }, - EvidenceAt: evidenceAtText, - Case: original.Case, - Event: nil, - Config: evaluatorConfig, - } - requestJSON, err := json.Marshal(request) - if err != nil { - return nil, fmt.Errorf("failed to encode operational-value regrade request: %w", err) - } - outputJSON, err := runOperationalValueEvaluatorBash(ctx, bashPath, evaluatorPath, []string{evaluatorPath, "--grade-run"}, requestJSON, operationalValueEvaluatorTimeout, evaluatorHost) - if err != nil { - return nil, fmt.Errorf("operational-value evaluator --grade-run failed: %w", err) - } - return parseOperationalValueEvaluatorOutput(outputJSON, original.Subject, evidenceAtText, evidenceAt, baselineValue) -} - -func runOperationalValueEvaluatorBash(ctx context.Context, bashPath, evaluatorPath string, args []string, input []byte, timeout time.Duration, evaluatorHost string) ([]byte, error) { - commandCtx, cancel := context.WithTimeout(ctx, timeout) - defer cancel() - cmd := exec.CommandContext(commandCtx, bashPath, args...) - cmd.Dir = filepath.Dir(evaluatorPath) - cmd.Env = operationalValueEvaluatorEnvironment(os.Environ(), evaluatorHost) - cmd.Stdin = bytes.NewReader(input) - stdout := &boundedCommandBuffer{limit: maxOperationalValueRegradeOutputBytes} - stderr := &boundedCommandBuffer{limit: maxOperationalValueRegradeOutputBytes} - cmd.Stdout = stdout - cmd.Stderr = stderr - err := cmd.Run() - if errors.Is(commandCtx.Err(), context.DeadlineExceeded) { - return nil, fmt.Errorf("timed out after %s", timeout) - } - if stdout.exceeded || stderr.exceeded { - return nil, fmt.Errorf("output exceeded the %d-byte limit", maxOperationalValueRegradeOutputBytes) - } - if err != nil { - message := strings.TrimSpace(stderr.String()) - if message != "" { - return nil, errors.New(message) - } - return nil, err - } - return stdout.Bytes(), nil -} - -func operationalValueEvaluatorEnvironment(environ []string, evaluatorHost string) []string { - keys := []string{ - "PATH", "HOME", "TMPDIR", "TEMP", "TMP", "SystemRoot", "ComSpec", - "GH_TOKEN", "GH_HOST", "GITHUB_API_URL", "GITHUB_GRAPHQL_URL", "GITHUB_SERVER_URL", - } - values := make(map[string]string, len(environ)) - for _, entry := range environ { - key, value, ok := strings.Cut(entry, "=") - if ok { - values[key] = value - } - } - hostURL, err := url.Parse(evaluatorHost) - if err == nil && hostURL.Scheme != "" && hostURL.Host != "" { - serverURL := strings.TrimSuffix(hostURL.String(), "/") - values["GH_HOST"] = hostURL.Host - values["GITHUB_SERVER_URL"] = serverURL - if strings.EqualFold(hostURL.Hostname(), "github.com") { - values["GITHUB_API_URL"] = "https://api.github.com" - values["GITHUB_GRAPHQL_URL"] = "https://api.github.com/graphql" - } else { - values["GITHUB_API_URL"] = serverURL + "/api/v3" - values["GITHUB_GRAPHQL_URL"] = serverURL + "/api/graphql" - } - } - env := make([]string, 0, len(keys)) - for _, key := range keys { - if value := values[key]; value != "" { - env = append(env, key+"="+value) - } - } - return env -} - -func parseOperationalValueDefinition(data []byte) (*float64, error) { - var definition struct { - SchemaVersion int `json:"schemaVersion"` - Grader string `json:"grader"` - Baseline struct { - Mode string `json:"mode"` - Value json.RawMessage `json:"value"` - } `json:"baseline"` - } - if err := json.Unmarshal(data, &definition); err != nil { - return nil, fmt.Errorf("operational-value evaluator returned an invalid definition: %w", err) - } - if definition.SchemaVersion != 4 || definition.Grader != "operational-value" { - return nil, errors.New("operational-value evaluator definition must use schemaVersion 4 and grader \"operational-value\"") - } - valueJSON := bytes.TrimSpace(definition.Baseline.Value) - switch definition.Baseline.Mode { - case "attainment-only": - if !bytes.Equal(valueJSON, []byte("null")) { - return nil, errors.New("attainment-only operational-value evaluators must have a null baseline value") - } - return nil, nil - case "baseline-comparable": - value, err := parseNullableOperationalValue(valueJSON) - if err != nil || value == nil || *value < 0 || *value > 1 { - return nil, errors.New("baseline-comparable operational-value evaluators require a baseline value in [0,1]") - } - return value, nil - default: - return nil, errors.New("operational-value evaluator baseline mode must be \"baseline-comparable\" or \"attainment-only\"") - } -} - -func parseOperationalValueEvaluatorOutput(data []byte, subject graderArtifactSubject, evidenceAtText string, evidenceAt time.Time, baselineValue *float64) (*operationalValueEvaluatorExecution, error) { - var fields map[string]json.RawMessage - if err := json.Unmarshal(data, &fields); err != nil || fields == nil { - return nil, errors.New("operational-value evaluator returned invalid JSON") - } - value, err := parseNullableOperationalValue(fields["value"]) - if err != nil || (value != nil && (*value < 0 || *value > 1)) { - return nil, errors.New("operational-value evaluator result.value must be null or a finite number in [0,1]") - } - observation, err := parseOperationalValueObservation(fields, subject, evidenceAtText, evidenceAt, value) - if err != nil { - return nil, err - } - var message string - if rawMessage, ok := fields["message"]; ok { - if err := json.Unmarshal(rawMessage, &message); err != nil { - message = "" - } - } - var diagnostics map[string]any - if rawDiagnostics, ok := fields["diagnostics"]; ok { - if err := json.Unmarshal(rawDiagnostics, &diagnostics); err != nil { - diagnostics = nil - } - } - var delta *float64 - if value != nil && baselineValue != nil { - computed := *value - *baselineValue - delta = &computed - } - return &operationalValueEvaluatorExecution{ - Value: value, - Message: message, - Diagnostics: diagnostics, - Observation: observation, - BaselineValue: baselineValue, - DeltaFromBaseline: delta, - }, nil -} - -func parseOperationalValueObservation(fields map[string]json.RawMessage, subject graderArtifactSubject, evidenceAtText string, evidenceAt time.Time, value *float64) (operationalValueRegradeObservation, error) { - var caseValue map[string]any - if err := json.Unmarshal(fields["case"], &caseValue); err != nil || caseValue == nil { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator output.case must be an object") - } - var opportunityKey, evidenceCutoffText, maturesAtText string - if err := json.Unmarshal(fields["opportunityKey"], &opportunityKey); err != nil || strings.TrimSpace(opportunityKey) == "" { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator opportunityKey must be a non-empty string") - } - if err := json.Unmarshal(fields["evidenceCutoff"], &evidenceCutoffText); err != nil { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator evidenceCutoff must be a UTC ISO-8601 timestamp") - } - if err := json.Unmarshal(fields["maturesAt"], &maturesAtText); err != nil { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator maturesAt must be a UTC ISO-8601 timestamp") - } - evidenceCutoff, err := parseOperationalValueTimestamp(evidenceCutoffText, "evidenceCutoff") - if err != nil { - return operationalValueRegradeObservation{}, err - } - maturesAt, err := parseOperationalValueTimestamp(maturesAtText, "maturesAt") - if err != nil { - return operationalValueRegradeObservation{}, err - } - if evidenceCutoff.After(evidenceAt) { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator evidenceCutoff cannot follow evidenceAt") - } - if evidenceCutoff.After(maturesAt) { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator evidenceCutoff cannot follow maturesAt") - } - var provenance []map[string]any - if err := json.Unmarshal(fields["provenance"], &provenance); err != nil || (value != nil && len(provenance) == 0) { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator must return provenance for a numeric value") - } - for _, item := range provenance { - for _, key := range []string{"repository", "kind", "ref"} { - text, ok := item[key].(string) - if !ok || text == "" { - return operationalValueRegradeObservation{}, errors.New("operational-value evaluator provenance entries require repository, kind, and ref") - } - } - } - return operationalValueRegradeObservation{ - Subject: subject, - OpportunityKey: opportunityKey, - EvidenceAt: evidenceAtText, - EvidenceCutoff: evidenceCutoffText, - MaturesAt: maturesAtText, - Mature: !evidenceAt.Before(maturesAt), - Case: caseValue, - Provenance: provenance, - }, nil -} - -func parseNullableOperationalValue(data []byte) (*float64, error) { - data = bytes.TrimSpace(data) - if bytes.Equal(data, []byte("null")) { - return nil, nil - } - var value float64 - if len(data) == 0 || json.Unmarshal(data, &value) != nil || math.IsNaN(value) || math.IsInf(value, 0) { - return nil, errors.New("expected a finite number or null") - } - return &value, nil -} - -func parseOperationalValueTimestamp(value, label string) (time.Time, error) { - for _, layout := range []string{"2006-01-02T15:04:05Z", "2006-01-02T15:04:05.000Z"} { - if parsed, err := time.Parse(layout, value); err == nil { - return parsed, nil - } - } - return time.Time{}, fmt.Errorf("%s must be a UTC ISO-8601 timestamp", label) -} - -func buildOperationalValueRegradeArtifact(run graderArtifactRun, manifest operationalValueGraderManifestEntry, original graderArtifactResult, evaluatorDigest string, execution *operationalValueEvaluatorExecution) operationalValueRegradeArtifact { - passed := evaluateOperationalValueThreshold(execution.Value, manifest.Direction, manifest.Threshold) - status := "unavailable" - if execution.Value != nil { - status = "pass" - if passed != nil && !*passed { - status = "fail" - } - } - return operationalValueRegradeArtifact{ - Version: 1, - Run: run, - Regrade: operationalValueRegradeMetadata{ - Identity: operationalValueRegradeIdentity{ - RunID: run.ID, - EvaluatorDigest: evaluatorDigest, - EvidenceAt: execution.Observation.EvidenceAt, - }, - OriginalEvidenceAt: original.Observation.EvidenceAt, - }, - Results: []operationalValueRegradeResult{{ - ID: "operational-value", - Name: manifest.Name, - Value: execution.Value, - Unit: manifest.Unit, - Passed: passed, - Status: status, - Source: "operational-value", - Message: execution.Message, - Observation: execution.Observation, - Diagnostics: execution.Diagnostics, - BaselineValue: execution.BaselineValue, - DeltaFromBaseline: execution.DeltaFromBaseline, - Implementation: graderArtifactImplementation{ - ID: "gh-aw-graders-operational-value-regrade", - Version: 1, - Digest: evaluatorDigest, - }, - }}, - } -} - -func evaluateOperationalValueThreshold(value *float64, direction string, threshold *float64) *bool { - if value == nil || threshold == nil { - return nil - } - passed := *value >= *threshold - if direction == "lower_is_better" { - passed = *value <= *threshold - } - return &passed -} - -func renderOperationalValueRegradeArtifact(artifact operationalValueRegradeArtifact, jsonOutput bool) error { - result := artifact.Results[0] - if jsonOutput { - data, err := marshalIndentJSONOrWrap(artifact, "operational-value regrade observation") - if err != nil { - return err - } - fmt.Fprintln(os.Stdout, string(data)) - return nil - } - value := "null" - if result.Value != nil { - value = strconv.FormatFloat(*result.Value, 'f', -1, 64) - } - fmt.Fprintln(os.Stdout, console.FormatSuccessMessage(fmt.Sprintf("Regraded operational value for run %s: %s", artifact.Run.ID, value))) - fmt.Fprintf(os.Stdout, "Evidence cutoff: %s\n", result.Observation.EvidenceCutoff) - fmt.Fprintf(os.Stdout, "Mature: %t\n", result.Observation.Mature) - if result.BaselineValue != nil { - fmt.Fprintf(os.Stdout, "Baseline value: %s\n", strconv.FormatFloat(*result.BaselineValue, 'f', -1, 64)) - delta := "null" - if result.DeltaFromBaseline != nil { - delta = strconv.FormatFloat(*result.DeltaFromBaseline, 'f', -1, 64) - } - fmt.Fprintf(os.Stdout, "Delta from baseline: %s\n", delta) - } - return nil -} diff --git a/pkg/cli/graders_operational_value_regrade_test.go b/pkg/cli/graders_operational_value_regrade_test.go deleted file mode 100644 index 174042b8ff2..00000000000 --- a/pkg/cli/graders_operational_value_regrade_test.go +++ /dev/null @@ -1,385 +0,0 @@ -package cli - -import ( - "context" - "crypto/sha256" - "encoding/hex" - "io" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "testing" - "time" -) - -func historicalOperationalValueFixture() (operationalValueGraderManifestEntry, graderArtifactResult, graderArtifactRun) { - digest := strings.Repeat("a", 64) - createdAt := "2026-08-23T11:58:00Z" - manifest := operationalValueGraderManifestEntry{ - ID: "operational-value", - Name: "Operational value", - Source: "operational-value", - Enabled: true, - Direction: "higher_is_better", - Digest: digest, - Config: map[string]any{"window": "7d"}, - } - result := graderArtifactResult{ - ID: "operational-value", - Implementation: graderArtifactImplementation{ - ID: "gh-aw-graders", - Version: 1, - Digest: digest, - }, - Observation: &graderArtifactObservation{ - Subject: graderArtifactSubject{ - Type: "workflow-run", - RunID: "12345", - Attempt: 2, - Repository: "github/gh-aw", - Workflow: "Example", - Ref: "refs/heads/main", - SHA: "0123456789abcdef", - EventName: "schedule", - CreatedAt: &createdAt, - }, - EvidenceAt: "2026-08-24T12:00:00Z", - Case: map[string]any{"issue": float64(42)}, - }, - } - return manifest, result, graderArtifactRun{ID: "12345", Attempt: 2} -} - -func TestVerifyHistoricalOperationalValueIdentity(t *testing.T) { - t.Parallel() - manifest, result, run := historicalOperationalValueFixture() - if err := verifyHistoricalOperationalValueIdentity("github/gh-aw", manifest.Digest, &manifest, &result, run, run.ID); err != nil { - t.Fatalf("expected valid identity, got %v", err) - } - - t.Run("digest mismatch", func(t *testing.T) { - t.Parallel() - err := verifyHistoricalOperationalValueIdentity("github/gh-aw", strings.Repeat("b", 64), &manifest, &result, run, run.ID) - if err == nil || !strings.Contains(err.Error(), "digest mismatch") { - t.Fatalf("expected digest mismatch, got %v", err) - } - }) - - t.Run("repository mismatch", func(t *testing.T) { - t.Parallel() - err := verifyHistoricalOperationalValueIdentity("github/other", manifest.Digest, &manifest, &result, run, run.ID) - if err == nil || !strings.Contains(err.Error(), "repository") { - t.Fatalf("expected repository mismatch, got %v", err) - } - }) -} - -func TestExecuteHistoricalOperationalValueEvaluator(t *testing.T) { - t.Parallel() - manifest, result, _ := historicalOperationalValueFixture() - manifest.Config = nil - evaluatorContent := `#!/usr/bin/env bash -set -euo pipefail -case ${1:-} in ---definition) - printf '%s\n' '{"schemaVersion":4,"grader":"operational-value","baseline":{"mode":"baseline-comparable","value":0.25}}' - ;; ---grade-run) - request=$(cat) - [[ "$request" == *'"evidenceAt":"2026-09-01T12:00:00Z"'* ]] - [[ "$request" == *'"case":{"issue":42}'* ]] - [[ "$request" == *'"config":{}'* ]] - printf '%s\n' '{"value":0.75,"opportunityKey":"issue:42","case":{"issue":42},"evidenceCutoff":"2026-08-30T12:00:00Z","maturesAt":"2026-08-30T12:00:00Z","provenance":[{"repository":"github/gh-aw","kind":"issue","ref":"42"}]}' - ;; -*) exit 1 ;; -esac -` - evidenceAt, err := parseOperationalValueTimestamp("2026-09-01T12:00:00Z", "evidence-at") - if err != nil { - t.Fatal(err) - } - execution, err := executeHistoricalOperationalValueEvaluator( - context.Background(), evaluatorContent, manifest, *result.Observation, - "2026-09-01T12:00:00Z", evidenceAt, "https://github.com", - ) - if err != nil { - t.Fatalf("executeHistoricalOperationalValueEvaluator() error = %v", err) - } - if execution.Value == nil || *execution.Value != 0.75 { - t.Fatalf("value = %v, want 0.75", execution.Value) - } - if execution.DeltaFromBaseline == nil || *execution.DeltaFromBaseline != 0.5 { - t.Fatalf("delta = %v, want 0.5", execution.DeltaFromBaseline) - } - if !execution.Observation.Mature || execution.Observation.Subject.RunID != "12345" { - t.Fatalf("unexpected replay observation: %+v", execution.Observation) - } -} - -func TestVerifyArchivedOperationalValueEvaluatorSource(t *testing.T) { - t.Parallel() - repoRoot := t.TempDir() - evaluatorPath := filepath.Join(repoRoot, ".github", "graders", "example.sh") - if err := os.MkdirAll(filepath.Dir(evaluatorPath), 0o755); err != nil { - t.Fatal(err) - } - content := []byte("#!/usr/bin/env bash\nprintf 'trusted\\n'\n") - if err := os.WriteFile(evaluatorPath, content, 0o755); err != nil { - t.Fatal(err) - } - for _, args := range [][]string{ - {"init"}, - {"config", "user.email", "test@example.com"}, - {"config", "user.name", "Test"}, - {"add", ".github/graders/example.sh"}, - {"commit", "-m", "add evaluator"}, - } { - cmd := exec.Command("git", append([]string{"-C", repoRoot}, args...)...) - if output, err := cmd.CombinedOutput(); err != nil { - t.Fatalf("git %v failed: %v: %s", args, err, output) - } - } - shaOutput, err := exec.Command("git", "-C", repoRoot, "rev-parse", "HEAD").Output() - if err != nil { - t.Fatal(err) - } - digest := sha256.Sum256(content) - manifest := operationalValueGraderManifestEntry{Run: ".github/graders/example.sh"} - subject := graderArtifactSubject{SHA: strings.TrimSpace(string(shaOutput))} - if err := verifyArchivedOperationalValueEvaluatorSource(repoRoot, "owner/repo", "owner/repo", string(content), hex.EncodeToString(digest[:]), manifest, subject); err != nil { - t.Fatalf("expected trusted evaluator, got %v", err) - } - if err := verifyArchivedOperationalValueEvaluatorSource(repoRoot, "owner/repo", "other/repo", string(content), hex.EncodeToString(digest[:]), manifest, subject); err == nil || !strings.Contains(err.Error(), "trusted local checkout") { - t.Fatalf("expected repository trust error, got %v", err) - } - if err := verifyArchivedOperationalValueEvaluatorSource(repoRoot, "owner/repo", "owner/repo", string(content)+"# changed\n", hex.EncodeToString(digest[:]), manifest, subject); err == nil || !strings.Contains(err.Error(), "does not match") { - t.Fatalf("expected source mismatch, got %v", err) - } -} - -func TestReadArchivedOperationalValueEvaluatorRejectsSymlink(t *testing.T) { - t.Parallel() - if runtime.GOOS == "windows" { - t.Skip("symlink creation requires additional privileges on Windows") - } - runDir := t.TempDir() - gradersDir := filepath.Join(runDir, "agent", "graders") - if err := os.MkdirAll(gradersDir, 0o755); err != nil { - t.Fatal(err) - } - targetPath := filepath.Join(runDir, "evaluator.sh") - if err := os.WriteFile(targetPath, []byte("#!/usr/bin/env bash\n"), 0o755); err != nil { - t.Fatal(err) - } - if err := os.Symlink(targetPath, filepath.Join(gradersDir, "operational_value_evaluator.sh")); err != nil { - t.Fatal(err) - } - - _, _, err := readArchivedOperationalValueEvaluator(runDir) - if err == nil || !strings.Contains(err.Error(), "must not be a symbolic link") { - t.Fatalf("expected symbolic-link rejection, got %v", err) - } -} - -func TestOperationalValueEvaluatorEnvironmentUsesRequestedHost(t *testing.T) { - t.Parallel() - env := operationalValueEvaluatorEnvironment([]string{ - "PATH=/usr/bin", - "GH_TOKEN=token", - "GH_HOST=stale.example.com", - "GITHUB_API_URL=https://stale.example.com/api/v3", - }, "https://ghe.example.com") - joined := strings.Join(env, "\n") - for _, expected := range []string{ - "GH_HOST=ghe.example.com", - "GITHUB_SERVER_URL=https://ghe.example.com", - "GITHUB_API_URL=https://ghe.example.com/api/v3", - "GITHUB_GRAPHQL_URL=https://ghe.example.com/api/graphql", - } { - if !strings.Contains(joined, expected) { - t.Fatalf("expected %q in evaluator environment: %v", expected, env) - } - } -} - -func TestRenderOperationalValueRegradeArtifactWithNullDelta(t *testing.T) { - baseline := 0.25 - artifact := operationalValueRegradeArtifact{ - Run: graderArtifactRun{ID: "12345"}, - Results: []operationalValueRegradeResult{{ - BaselineValue: &baseline, - Observation: operationalValueRegradeObservation{}, - }}, - } - oldStdout := os.Stdout - readOutput, writeOutput, err := os.Pipe() - if err != nil { - t.Fatal(err) - } - os.Stdout = writeOutput - t.Cleanup(func() { os.Stdout = oldStdout }) - if err := renderOperationalValueRegradeArtifact(artifact, false); err != nil { - t.Fatal(err) - } - _ = writeOutput.Close() - output, err := io.ReadAll(readOutput) - if err != nil { - t.Fatal(err) - } - if !strings.Contains(string(output), "Delta from baseline: null") { - t.Fatalf("unexpected output: %s", output) - } -} - -func TestParseOperationalValueEvaluatorOutputRejectsFutureEvidence(t *testing.T) { - t.Parallel() - evidenceAt, err := time.Parse(time.RFC3339, "2026-08-24T12:00:00Z") - if err != nil { - t.Fatal(err) - } - _, err = parseOperationalValueEvaluatorOutput([]byte(`{ - "value": 1, - "opportunityKey": "issue:42", - "case": {"issue": 42}, - "evidenceCutoff": "2026-08-25T12:00:00Z", - "maturesAt": "2026-08-30T12:00:00Z", - "provenance": [{"repository":"github/gh-aw","kind":"issue","ref":"42"}] -}`), graderArtifactSubject{}, "2026-08-24T12:00:00Z", evidenceAt, nil) - if err == nil || !strings.Contains(err.Error(), "cannot follow evidenceAt") { - t.Fatalf("expected future evidence rejection, got %v", err) - } -} - -func TestSelectHistoricalOperationalValueGrader(t *testing.T) { - t.Parallel() - - makeManifest := func(entries ...operationalValueGraderManifestEntry) *operationalValueGraderManifest { - return &operationalValueGraderManifest{Version: 1, Graders: entries} - } - makeArtifact := func(results ...graderArtifactResult) *graderResultsArtifact { - return &graderResultsArtifact{Version: 1, Results: results} - } - enabledEntry := operationalValueGraderManifestEntry{ID: "operational-value", Source: "operational-value", Enabled: true} - resultWithObservation := graderArtifactResult{ID: "operational-value", Observation: &graderArtifactObservation{}} - - tests := []struct { - name string - manifest *operationalValueGraderManifest - artifact *graderResultsArtifact - runID string - wantErr string - wantEntryID string - }{ - { - name: "nil manifest", - manifest: nil, - artifact: makeArtifact(resultWithObservation), - runID: "123", - wantErr: "run 123 has no grader data", - }, - { - name: "nil artifact", - manifest: makeManifest(enabledEntry), - artifact: nil, - runID: "123", - wantErr: "run 123 has no grader data", - }, - { - name: "duplicate manifest entries", - manifest: makeManifest(enabledEntry, enabledEntry), - artifact: makeArtifact(resultWithObservation), - runID: "456", - wantErr: "run 456 grader manifest contains duplicate operational-value graders", - }, - { - name: "duplicate artifact results", - manifest: makeManifest(enabledEntry), - artifact: makeArtifact(resultWithObservation, resultWithObservation), - runID: "789", - wantErr: "run 789 grader artifact contains duplicate operational-value results", - }, - { - name: "no matching manifest entry", - manifest: makeManifest(operationalValueGraderManifestEntry{ID: "other-grader"}), - artifact: makeArtifact(resultWithObservation), - runID: "111", - wantErr: "run 111 did not use an enabled operational-value grader", - }, - { - name: "manifest entry not enabled", - manifest: makeManifest(operationalValueGraderManifestEntry{ID: "operational-value", Source: "operational-value", Enabled: false}), - artifact: makeArtifact(resultWithObservation), - runID: "222", - wantErr: "run 222 did not use an enabled operational-value grader", - }, - { - name: "manifest entry has wrong source", - manifest: makeManifest(operationalValueGraderManifestEntry{ID: "operational-value", Source: "other-source", Enabled: true}), - artifact: makeArtifact(resultWithObservation), - runID: "333", - wantErr: "run 333 did not use an enabled operational-value grader", - }, - { - name: "no matching artifact result", - manifest: makeManifest(enabledEntry), - artifact: makeArtifact(graderArtifactResult{ID: "other-result"}), - runID: "444", - wantErr: "run 444 has no replayable operational-value observation", - }, - { - name: "artifact result missing observation", - manifest: makeManifest(enabledEntry), - artifact: makeArtifact(graderArtifactResult{ID: "operational-value", Observation: nil}), - runID: "555", - wantErr: "run 555 has no replayable operational-value observation", - }, - { - name: "success", - manifest: makeManifest(enabledEntry), - artifact: makeArtifact(resultWithObservation), - runID: "666", - wantEntryID: "operational-value", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - entry, result, err := selectHistoricalOperationalValueGrader(tt.manifest, tt.artifact, tt.runID) - if tt.wantErr != "" { - if err == nil || !strings.Contains(err.Error(), tt.wantErr) { - t.Fatalf("expected error containing %q, got %v", tt.wantErr, err) - } - if entry != nil || result != nil { - t.Fatalf("expected nil entry/result on error, got entry=%v result=%v", entry, result) - } - return - } - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if entry == nil || entry.ID != tt.wantEntryID { - t.Fatalf("expected entry with ID %q, got %v", tt.wantEntryID, entry) - } - if result == nil || result.ID != "operational-value" { - t.Fatalf("expected result with ID operational-value, got %v", result) - } - }) - } -} - -func TestNewGradersCommand(t *testing.T) { - t.Parallel() - command := NewGradersCommand() - operationalValueCommand, _, err := command.Find([]string{"operational-value"}) - if err != nil { - t.Fatal(err) - } - for _, name := range []string{"evidence-at", "repo", "json"} { - if operationalValueCommand.Flags().Lookup(name) == nil { - t.Fatalf("operational-value command missing --%s", name) - } - } -} diff --git a/pkg/cli/graders_operational_value_report_build.go b/pkg/cli/graders_operational_value_report_build.go deleted file mode 100644 index de174056243..00000000000 --- a/pkg/cli/graders_operational_value_report_build.go +++ /dev/null @@ -1,235 +0,0 @@ -package cli - -import ( - "cmp" - "encoding/json" - "math" - "slices" - "sort" - "time" -) - -func buildOperationalValueReport(evaluator *operationalValueReportEvaluator, observations []operationalValueReportObservation, generatedAt, windowEndAt time.Time, stats operationalValueReportBackfillStats) operationalValueReport { //nolint:largefunc // Report assembly preserves the serialized contract order. - observations = slices.Clone(observations) - for index := range observations { - if observations[index].EvaluatorDigest == "" { - observations[index].EvaluatorDigest = evaluator.EvaluatorDigest - } - observations[index].ID = operationalValueReportObservationID(evaluator.Definition.Repository, evaluator.WorkflowID, observations[index]) - } - values := make([]float64, 0, len(observations)) - distinctNumericOpportunities := make(map[string]struct{}) - coverage := operationalValueReportCoverage{ - RunCount: len(observations), - WeeklyCacheHits: stats.CacheHits, - EvaluatedCount: stats.Evaluated, - } - for _, observation := range observations { - if observation.Mature { - coverage.MatureCount++ - } - switch observation.Status { - case "error": - coverage.ErrorCount++ - case "unavailable": - coverage.UnavailableCount++ - } - if observation.Value != nil { - coverage.NumericCount++ - values = append(values, *observation.Value) - opportunityKey := observation.OpportunityKey - if opportunityKey == "" { - opportunityKey = "run:" + observation.Run.ID - } - distinctNumericOpportunities[opportunityKey] = struct{}{} - } - } - coverage.DistinctOpportunityCount = len(distinctNumericOpportunities) - coverage.DuplicateOpportunityCount = coverage.NumericCount - len(distinctNumericOpportunities) - - startAt := evaluator.Definition.Adoption.AdoptedAt - report := operationalValueReport{ - SchemaVersion: operationalValueReportSchemaVersion, - GeneratedAt: generatedAt.UTC().Format(time.RFC3339), - Repository: evaluator.Definition.Repository, - WorkflowID: evaluator.WorkflowID, - WorkflowName: evaluator.Definition.WorkflowName, - SourcePath: evaluator.Definition.SourcePath, - OperationalValue: evaluator.Definition.OperationalValue, - Window: operationalValueReportWindow{ - StartAt: startAt, - EndAt: windowEndAt.UTC().Format(time.RFC3339), - }, - Evaluator: operationalValueReportEvaluatorReference{ - Path: evaluator.EvaluatorRun, - SHA256: evaluator.EvaluatorDigest, - Definition: append(json.RawMessage(nil), evaluator.Definition.Raw...), - }, - Baseline: evaluator.Definition.Baseline, - Coverage: coverage, - Summary: summarizeOperationalValueValues(values, evaluator.Definition.Baseline.Value), - Weekly: buildOperationalValueReportWeeks(observations), - Diagnostics: buildOperationalValueReportDiagnostics(evaluator.Definition.DiagnosticMetrics, observations), - Observations: observations, - Caveat: "Operational value is observational. Replayed historical values apply one frozen evaluator digest to every run and do not establish that the workflow caused the measured outcome.", - } - return report -} - -func buildOperationalValueReportDiagnostics(metrics []operationalValueReportDiagnosticMetric, observations []operationalValueReportObservation) []operationalValueReportDiagnosticSeries { - series := make([]operationalValueReportDiagnosticSeries, 0, len(metrics)) - for _, metric := range metrics { - values := make([]float64, 0, len(observations)) - for _, observation := range observations { - if value, ok := operationalValueReportDiagnosticValue(observation, metric.ID); ok { - values = append(values, value) - } - } - series = append(series, operationalValueReportDiagnosticSeries{ - Metric: metric, - Summary: summarizeOperationalValueValues(values, nil), - Weekly: buildOperationalValueReportDiagnosticWeeks(metric, observations), - }) - } - return series -} - -func buildOperationalValueReportDiagnosticWeeks(metric operationalValueReportDiagnosticMetric, observations []operationalValueReportObservation) []operationalValueReportDiagnosticWeek { - grouped := make(map[time.Time][]operationalValueReportObservation) - for _, observation := range observations { - weekStart := operationalValueUTCWeekStart(observation.Run.CreatedAt) - grouped[weekStart] = append(grouped[weekStart], observation) - } - weekStarts := make([]time.Time, 0, len(grouped)) - for weekStart := range grouped { - weekStarts = append(weekStarts, weekStart) - } - slices.SortFunc(weekStarts, func(left, right time.Time) int { return cmp.Compare(left.Unix(), right.Unix()) }) - - weeks := make([]operationalValueReportDiagnosticWeek, 0, len(weekStarts)) - for _, weekStart := range weekStarts { - values := make([]float64, 0, len(grouped[weekStart])) - var latest *operationalValueReportObservation - for index := range grouped[weekStart] { - observation := &grouped[weekStart][index] - value, ok := operationalValueReportDiagnosticValue(*observation, metric.ID) - if !ok { - continue - } - values = append(values, value) - if latest == nil || operationalValueReportRunLess(latest.Run, observation.Run) { - latest = observation - } - } - week := operationalValueReportDiagnosticWeek{ - WeekStart: weekStart.Format(time.RFC3339), - WeekEnd: weekStart.AddDate(0, 0, 7).Format(time.RFC3339), - NumericCount: len(values), - } - if len(values) > 0 { - value := averageOperationalValue(values) - if metric.Aggregation == "latest" { - value, _ = operationalValueReportDiagnosticValue(*latest, metric.ID) - } - week.Value = &value - } - weeks = append(weeks, week) - } - return weeks -} - -func operationalValueReportDiagnosticValue(observation operationalValueReportObservation, metricID string) (float64, bool) { - raw, exists := observation.Diagnostics[metricID] - if !exists { - return 0, false - } - value, ok := raw.(float64) - if !ok || math.IsNaN(value) || math.IsInf(value, 0) || value < 0 || value > 1 { - return 0, false - } - return value, true -} - -func summarizeOperationalValueValues(values []float64, baseline *float64) operationalValueReportSummary { - if len(values) == 0 { - return operationalValueReportSummary{} - } - ordered := slices.Clone(values) - slices.Sort(ordered) - mean := averageOperationalValue(ordered) - median := ordered[len(ordered)/2] - if len(ordered)%2 == 0 { - median = (ordered[len(ordered)/2-1] + ordered[len(ordered)/2]) / 2 - } - first := values[0] - latest := values[len(values)-1] - change := latest - first - summary := operationalValueReportSummary{ - Mean: &mean, Median: &median, Minimum: &ordered[0], Maximum: &ordered[len(ordered)-1], - First: &first, Latest: &latest, Change: &change, - } - if baseline != nil { - delta := latest - *baseline - summary.LatestDeltaFromBaseline = &delta - } - return summary -} - -func buildOperationalValueReportWeeks(observations []operationalValueReportObservation) []operationalValueReportWeek { - grouped := make(map[time.Time][]operationalValueReportObservation) - for _, observation := range observations { - weekStart := operationalValueUTCWeekStart(observation.Run.CreatedAt) - grouped[weekStart] = append(grouped[weekStart], observation) - } - weekStarts := make([]time.Time, 0, len(grouped)) - for weekStart := range grouped { - weekStarts = append(weekStarts, weekStart) - } - slices.SortFunc(weekStarts, func(left, right time.Time) int { return cmp.Compare(left.Unix(), right.Unix()) }) - weeks := make([]operationalValueReportWeek, 0, len(weekStarts)) - for _, weekStart := range weekStarts { - weekObservations := grouped[weekStart] - latestByOpportunity := make(map[string]operationalValueReportObservation) - for _, observation := range weekObservations { - if observation.Value == nil { - continue - } - key := observation.OpportunityKey - if key == "" { - key = "run:" + observation.Run.ID - } - previous, exists := latestByOpportunity[key] - if !exists || previous.Run.CreatedAt.Before(observation.Run.CreatedAt) { - latestByOpportunity[key] = observation - } - } - values := make([]float64, 0, len(latestByOpportunity)) - for _, observation := range latestByOpportunity { - values = append(values, *observation.Value) - } - sort.Float64s(values) - week := operationalValueReportWeek{ - WeekStart: weekStart.Format(time.RFC3339), - WeekEnd: weekStart.AddDate(0, 0, 7).Format(time.RFC3339), - RunCount: len(weekObservations), - NumericCount: len(values), - DistinctOpportunityCount: len(latestByOpportunity), - } - if len(values) > 0 { - mean := averageOperationalValue(values) - week.Mean = &mean - week.Minimum = &values[0] - week.Maximum = &values[len(values)-1] - } - weeks = append(weeks, week) - } - return weeks -} - -func averageOperationalValue(values []float64) float64 { - var total float64 - for _, value := range values { - total += value - } - return total / float64(len(values)) -} diff --git a/pkg/cli/graders_operational_value_report_build_test.go b/pkg/cli/graders_operational_value_report_build_test.go deleted file mode 100644 index 5c49f623b93..00000000000 --- a/pkg/cli/graders_operational_value_report_build_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package cli - -import ( - "encoding/json" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestBuildOperationalValueReportIncludesEveryPointAndDeduplicatesWeeklyMean(t *testing.T) { - baseline := 0.25 - evaluator := &operationalValueReportEvaluator{ - WorkflowID: "daily-file-diet", EvaluatorDigest: strings.Repeat("a", 64), - Definition: operationalValueReportDefinition{ - Repository: "github/gh-aw", WorkflowName: "Daily File Diet", SourcePath: ".github/workflows/daily-file-diet.md", - OperationalValue: "Improve the assigned file.", Adoption: operationalValueReportAdoption{AdoptedAt: "2026-08-01T00:00:00Z"}, - DiagnosticMetrics: []operationalValueReportDiagnosticMetric{{ID: "repository-health", Name: "Repository health", Formula: "health", Direction: "higher_is_better", Aggregation: "latest"}}, - Baseline: operationalValueReportBaseline{Mode: "baseline-comparable", Value: &baseline}, - Raw: json.RawMessage(`{"schemaVersion":4,"grader":"operational-value"}`), - }, - } - valueOne, valueTwo, valueThree := 0.2, 0.6, 0.8 - observations := []operationalValueReportObservation{ - {Run: operationalValueReportRun{ID: "1", CreatedAt: time.Date(2026, 8, 3, 0, 0, 0, 0, time.UTC)}, Value: &valueOne, Status: "pass", OpportunityKey: "issue:1", Mature: true, Diagnostics: map[string]any{"repository-health": 0.3}}, - {Run: operationalValueReportRun{ID: "2", CreatedAt: time.Date(2026, 8, 4, 0, 0, 0, 0, time.UTC)}, Value: &valueTwo, Status: "pass", OpportunityKey: "issue:1", Mature: true, Diagnostics: map[string]any{"repository-health": 0.4}}, - {Run: operationalValueReportRun{ID: "3", CreatedAt: time.Date(2026, 8, 5, 0, 0, 0, 0, time.UTC)}, Value: &valueThree, Status: "pass", OpportunityKey: "issue:2", Mature: true, Diagnostics: map[string]any{"repository-health": 0.7}}, - } - - report := buildOperationalValueReport(evaluator, observations, time.Date(2026, 9, 1, 12, 0, 0, 0, time.UTC), time.Date(2026, 8, 31, 0, 0, 0, 0, time.UTC), operationalValueReportBackfillStats{CacheHits: 2, Evaluated: 1}) - require.Len(t, report.Observations, 3) - assert.Equal(t, "github/gh-aw:daily-file-diet:1:0:"+strings.Repeat("a", 64), report.Observations[0].ID) - require.Len(t, report.Weekly, 1) - assert.Equal(t, "2026-08-01T00:00:00Z", report.Window.StartAt) - assert.Equal(t, 2, report.Weekly[0].DistinctOpportunityCount) - assert.InDelta(t, 0.7, *report.Weekly[0].Mean, 0.000001) - assert.Equal(t, 1, report.Coverage.DuplicateOpportunityCount) - assert.InDelta(t, 0.55, *report.Summary.LatestDeltaFromBaseline, 0.000001) - require.Len(t, report.Diagnostics, 1) - assert.InDelta(t, 0.7, *report.Diagnostics[0].Weekly[0].Value, 0.000001) - assert.InDelta(t, 0.7, *report.Diagnostics[0].Summary.Latest, 0.000001) -} - -func TestRenderOperationalValueReportArtifactsContainRichReport(t *testing.T) { - value, diagnosticFirst, diagnosticValue, diagnosticChange := 0.75, 0.4, 0.9, 0.5 - report := operationalValueReport{ - SchemaVersion: 1, WorkflowID: "example", WorkflowName: "Example ", Repository: "owner/repo", - Window: operationalValueReportWindow{StartAt: "2026-08-01T00:00:00Z", EndAt: "2026-08-31T00:00:00Z"}, - Evaluator: operationalValueReportEvaluatorReference{SHA256: strings.Repeat("a", 64), Definition: json.RawMessage(`{"evidence":{},"primaryMetric":{}}`)}, - Coverage: operationalValueReportCoverage{RunCount: 1, NumericCount: 1}, Summary: operationalValueReportSummary{Latest: &value}, - Weekly: []operationalValueReportWeek{ - { - WeekStart: "2026-08-03T00:00:00Z", WeekEnd: "2026-08-10T00:00:00Z", RunCount: 1, - NumericCount: 1, DistinctOpportunityCount: 1, Mean: &value, Minimum: &value, Maximum: &value, - }, - { - WeekStart: "2026-08-10T00:00:00Z", WeekEnd: "2026-08-17T00:00:00Z", RunCount: 1, - NumericCount: 1, DistinctOpportunityCount: 1, Mean: &diagnosticFirst, Minimum: &diagnosticFirst, Maximum: &diagnosticFirst, - }, - }, - Diagnostics: []operationalValueReportDiagnosticSeries{{ - Metric: operationalValueReportDiagnosticMetric{ID: "health", Name: "Repository health", Formula: "healthy / total", Direction: "higher_is_better", Aggregation: "latest"}, - Summary: operationalValueReportSummary{First: &diagnosticFirst, Latest: &diagnosticValue, Change: &diagnosticChange}, - Weekly: []operationalValueReportDiagnosticWeek{ - {WeekStart: "2026-08-03T00:00:00Z", WeekEnd: "2026-08-10T00:00:00Z", NumericCount: 1, Value: &diagnosticFirst}, - {WeekStart: "2026-08-10T00:00:00Z", WeekEnd: "2026-08-17T00:00:00Z", NumericCount: 1, Value: &diagnosticValue}, - }, - }}, - Observations: []operationalValueReportObservation{{Run: operationalValueReportRun{ID: "1", CreatedAt: time.Date(2026, 8, 10, 0, 0, 0, 0, time.UTC)}, Value: &value}}, - } - svg := string(renderOperationalValueReportSVG(report)) - assert.Contains(t, svg, "Example <Workflow>") - assert.Contains(t, svg, "Repository health improved since adoption") - assert.Contains(t, svg, "40.0% → 90.0%") - assert.Contains(t, svg, "+50.0 pts since adoption") - assert.Contains(t, svg, "Outcome change since adoption") - assert.Contains(t, svg, "Percentage-point change from each metric's first observed value") - assert.Contains(t, svg, "0 pts = first observed value") - assert.Contains(t, svg, ">+50 pts") - assert.Contains(t, svg, ">-50 pts") - assert.Contains(t, svg, "class=\"gain-area\"") - assert.NotContains(t, svg, "class=\"loss-area\"") - assert.Contains(t, svg, "class=\"metric-change endpoint-label-1\">+50.0 pts") - assert.Contains(t, svg, "Per-run operational attainment") - assert.Contains(t, svg, "4-week rolling mean (bold)") - assert.Contains(t, svg, "class=\"primary-trend\"") - assert.Contains(t, svg, "4-week avg 57.5%") - markdown := string(renderOperationalValueReportMarkdown(report, "example.json", "example.svg")) - assert.Contains(t, markdown, "![Example operational value timeline](example.svg)") - assert.Contains(t, markdown, "Weekly History") - assert.Contains(t, markdown, "Diagnostic, Repository health") - assert.Contains(t, markdown, "| 2026-08-03 | 1 | 1 | 0.75 | 0.75-0.75 | 0.4 |") - - decliningLatest, decliningChange := 0.2, -0.2 - report.Diagnostics[0].Summary.Latest = &decliningLatest - report.Diagnostics[0].Summary.Change = &decliningChange - report.Diagnostics[0].Weekly[1].Value = &decliningLatest - decliningSVG := string(renderOperationalValueReportSVG(report)) - assert.NotContains(t, decliningSVG, "class=\"gain-area\"") - assert.Contains(t, decliningSVG, "class=\"loss-area\"") - assert.Contains(t, decliningSVG, "class=\"metric-change endpoint-label-1\">-20.0 pts") -} - -func TestRenderOperationalValueReportSVGWithoutDiagnostics(t *testing.T) { - first, latest, change := 0.25, 0.75, 0.5 - report := operationalValueReport{ - WorkflowName: "Example Workflow", - Window: operationalValueReportWindow{StartAt: "2026-08-03T00:00:00Z", EndAt: "2026-08-17T00:00:00Z"}, - Evaluator: operationalValueReportEvaluatorReference{SHA256: "abcdef1234567890"}, - Summary: operationalValueReportSummary{First: &first, Latest: &latest, Change: &change}, - Weekly: []operationalValueReportWeek{ - {WeekStart: "2026-08-03T00:00:00Z", WeekEnd: "2026-08-10T00:00:00Z", Mean: &first}, - {WeekStart: "2026-08-10T00:00:00Z", WeekEnd: "2026-08-17T00:00:00Z", Mean: &latest}, - }, - } - - svg := string(renderOperationalValueReportSVG(report)) - assert.Contains(t, svg, "Operational attainment improved since adoption") - assert.Contains(t, svg, "25.0% → 75.0%") - assert.Contains(t, svg, "class=\"primary\"") - assert.NotContains(t, svg, "Repository outcome health") - assert.NotContains(t, svg, "Per-run operational attainment") -} diff --git a/pkg/cli/graders_operational_value_report_cache.go b/pkg/cli/graders_operational_value_report_cache.go deleted file mode 100644 index 9454abbe6af..00000000000 --- a/pkg/cli/graders_operational_value_report_cache.go +++ /dev/null @@ -1,131 +0,0 @@ -package cli - -import ( - "encoding/json" - "errors" - "fmt" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "time" - - "github.com/github/gh-aw/pkg/constants" -) - -var operationalValueReportCacheSegmentPattern = regexp.MustCompile(`^[A-Za-z0-9._-]+$`) - -type operationalValueReportWeeklyCache struct { - SchemaVersion int `json:"schemaVersion"` - Repository string `json:"repository"` - WorkflowID string `json:"workflowId"` - EvaluatorDigest string `json:"evaluatorDigest"` - WeekStart string `json:"weekStart"` - WeekEnd string `json:"weekEnd"` - Observations []operationalValueReportObservation `json:"observations"` -} - -func operationalValueUTCWeekStart(value time.Time) time.Time { - value = value.UTC() - dayOffset := (int(value.Weekday()) + 6) % 7 - return time.Date(value.Year(), value.Month(), value.Day()-dayOffset, 0, 0, 0, 0, time.UTC) -} - -func operationalValueReportWeeklyCachePath(cacheRoot, repository, workflowID, evaluatorDigest string, weekStart time.Time) (string, error) { - segments := []string{workflowID, evaluatorDigest} - owner, repo, ok := splitOperationalValueReportRepository(repository) - if !ok { - return "", fmt.Errorf("invalid repository for operational-value cache: %q", repository) - } - segments = append([]string{owner, repo}, segments...) - for _, segment := range segments { - if !operationalValueReportCacheSegmentPattern.MatchString(segment) { - return "", fmt.Errorf("invalid operational-value cache path segment %q", segment) - } - } - weekName := operationalValueUTCWeekStart(weekStart).Format("2006-01-02") + ".json" - return filepath.Join(cacheRoot, owner, repo, workflowID, evaluatorDigest, weekName), nil -} - -func splitOperationalValueReportRepository(repository string) (string, string, bool) { - for index := 1; index < len(repository)-1; index++ { - if repository[index] != '/' { - continue - } - if repository[index+1:] == "" || strings.Contains(repository[index+1:], "/") { - return "", "", false - } - return repository[:index], repository[index+1:], true - } - return "", "", false -} - -func loadOperationalValueReportWeeklyCache(path, repository, workflowID, evaluatorDigest string, weekStart time.Time) ([]operationalValueReportObservation, bool, error) { - info, err := os.Lstat(path) - if errors.Is(err, os.ErrNotExist) { - return nil, false, nil - } - if err != nil { - return nil, false, fmt.Errorf("cannot inspect operational-value cache %s: %w", path, err) - } - if info.Mode()&os.ModeSymlink != 0 || !info.Mode().IsRegular() { - return nil, false, fmt.Errorf("operational-value cache %s must be a regular file", path) - } - data, err := os.ReadFile(path) - if err != nil { - return nil, false, fmt.Errorf("cannot read operational-value cache %s: %w", path, err) - } - var cache operationalValueReportWeeklyCache - if err := json.Unmarshal(data, &cache); err != nil { - return nil, false, fmt.Errorf("operational-value cache %s is malformed: %w", path, err) - } - expectedWeekStart := operationalValueUTCWeekStart(weekStart) - if cache.SchemaVersion != operationalValueReportSchemaVersion || - cache.Repository != repository || cache.WorkflowID != workflowID || - cache.EvaluatorDigest != evaluatorDigest || cache.WeekStart != expectedWeekStart.Format(time.RFC3339) { - return nil, false, nil - } - return cache.Observations, true, nil -} - -func saveOperationalValueReportWeeklyCache(path, repository, workflowID, evaluatorDigest string, weekStart time.Time, observations []operationalValueReportObservation) error { - weekStart = operationalValueUTCWeekStart(weekStart) - cache := operationalValueReportWeeklyCache{ - SchemaVersion: operationalValueReportSchemaVersion, - Repository: repository, - WorkflowID: workflowID, - EvaluatorDigest: evaluatorDigest, - WeekStart: weekStart.Format(time.RFC3339), - WeekEnd: weekStart.AddDate(0, 0, 7).Format(time.RFC3339), - Observations: observations, - } - data, err := json.MarshalIndent(cache, "", " ") - if err != nil { - return fmt.Errorf("cannot encode operational-value cache: %w", err) - } - if err := os.MkdirAll(filepath.Dir(path), constants.DirPermSensitive); err != nil { - return fmt.Errorf("cannot create operational-value cache directory: %w", err) - } - tempFile, err := os.CreateTemp(filepath.Dir(path), ".operational-value-week-"+strconv.FormatInt(time.Now().UnixNano(), 10)+"-*") - if err != nil { - return fmt.Errorf("cannot create operational-value cache file: %w", err) - } - tempPath := tempFile.Name() - defer os.Remove(tempPath) - if err := tempFile.Chmod(constants.FilePermSensitive); err != nil { - _ = tempFile.Close() - return fmt.Errorf("cannot set operational-value cache permissions: %w", err) - } - if _, err := tempFile.Write(data); err != nil { - _ = tempFile.Close() - return fmt.Errorf("cannot write operational-value cache: %w", err) - } - if err := tempFile.Close(); err != nil { - return fmt.Errorf("cannot close operational-value cache: %w", err) - } - if err := os.Rename(tempPath, path); err != nil { - return fmt.Errorf("cannot publish operational-value cache: %w", err) - } - return nil -} diff --git a/pkg/cli/graders_operational_value_report_cache_test.go b/pkg/cli/graders_operational_value_report_cache_test.go deleted file mode 100644 index 4b432580bca..00000000000 --- a/pkg/cli/graders_operational_value_report_cache_test.go +++ /dev/null @@ -1,73 +0,0 @@ -package cli - -import ( - "os" - "path/filepath" - "testing" - "time" - - "github.com/github/gh-aw/pkg/constants" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestOperationalValueReportWeeklyCacheRoundTrip(t *testing.T) { - cacheRoot := t.TempDir() - week := time.Date(2026, time.August, 27, 15, 0, 0, 0, time.UTC) - path, err := operationalValueReportWeeklyCachePath(cacheRoot, "github/gh-aw", "daily-file-diet", "abc123", week) - require.NoError(t, err) - - value := 0.75 - observations := []operationalValueReportObservation{{ - Run: operationalValueReportRun{ID: "12345", Attempt: 2, CreatedAt: week}, - Value: &value, - Status: "pass", - Mature: true, - EvaluatorDigest: "abc123", - }} - require.NoError(t, saveOperationalValueReportWeeklyCache(path, "github/gh-aw", "daily-file-diet", "abc123", week, observations)) - - loaded, hit, err := loadOperationalValueReportWeeklyCache(path, "github/gh-aw", "daily-file-diet", "abc123", week) - require.NoError(t, err) - require.True(t, hit) - require.Len(t, loaded, 1) - assert.Equal(t, "12345", loaded[0].Run.ID) - assert.InDelta(t, 0.75, *loaded[0].Value, 0.000001) - - _, hit, err = loadOperationalValueReportWeeklyCache(path, "github/gh-aw", "daily-file-diet", "different", week) - require.NoError(t, err) - assert.False(t, hit) -} - -func TestOperationalValueReportWeeklyCacheRejectsSymlink(t *testing.T) { - cacheRoot := t.TempDir() - target := cacheRoot + "/target.json" - require.NoError(t, os.WriteFile(target, []byte("{}"), 0o600)) - link := cacheRoot + "/cache.json" - require.NoError(t, os.Symlink(target, link)) - - _, _, err := loadOperationalValueReportWeeklyCache(link, "github/gh-aw", "daily-file-diet", "abc123", time.Now()) - require.ErrorContains(t, err, "must be a regular file") -} - -func TestOperationalValueUTCWeekStartUsesMonday(t *testing.T) { - value := time.Date(2026, time.August, 30, 23, 59, 0, 0, time.FixedZone("offset", -7*60*60)) - assert.Equal(t, "2026-08-31T00:00:00Z", operationalValueUTCWeekStart(value).Format(time.RFC3339)) -} - -func TestOperationalValueReportWeeklyCacheUsesSensitivePermissions(t *testing.T) { - cacheRoot := t.TempDir() - week := time.Date(2026, time.August, 31, 0, 0, 0, 0, time.UTC) - path, err := operationalValueReportWeeklyCachePath(cacheRoot, "github/gh-aw", "daily-file-diet", "abc123", week) - require.NoError(t, err) - - require.NoError(t, saveOperationalValueReportWeeklyCache(path, "github/gh-aw", "daily-file-diet", "abc123", week, nil)) - - dirInfo, err := os.Stat(filepath.Dir(path)) - require.NoError(t, err) - assert.Equal(t, constants.DirPermSensitive, dirInfo.Mode().Perm()) - - fileInfo, err := os.Stat(path) - require.NoError(t, err) - assert.Equal(t, constants.FilePermSensitive, fileInfo.Mode().Perm()) -} diff --git a/pkg/cli/graders_operational_value_report_command.go b/pkg/cli/graders_operational_value_report_command.go deleted file mode 100644 index ebf4863a9a0..00000000000 --- a/pkg/cli/graders_operational_value_report_command.go +++ /dev/null @@ -1,195 +0,0 @@ -package cli - -import ( - "context" - "errors" - "fmt" - "net/url" - "os" - "path/filepath" - "strings" - "time" - - "github.com/github/gh-aw/pkg/console" - "github.com/github/gh-aw/pkg/constants" - "github.com/github/gh-aw/pkg/logger" - "github.com/spf13/cobra" -) - -var operationalValueReportLog = logger.New("cli:graders_operational_value_report") - -const defaultOperationalValueReportOutputDir = "reports/operational-value" - -var operationalValueReportLoadEvaluator = loadOperationalValueReportEvaluator - -type OperationalValueReportConfig struct { - Workflow string - RepoOverride string - Until string - OutputDir string - CacheDir string - Concurrency int - Refresh bool - JSONOutput bool -} - -type operationalValueReportCommandOutput struct { - Report operationalValueReport `json:"report"` - Artifacts operationalValueReportArtifactPaths `json:"artifacts"` - CacheDir string `json:"cacheDir"` -} - -func newGradersOperationalValueReportCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "report ", - Short: "Build a complete operational-value history report", - Long: `Build a complete operational-value history from every completed workflow run since adoption. - -The current frozen evaluator is replayed against runs that predate grader artifacts. -Mature observations are cached in digest-scoped UTC weekly files. The command writes -a JSON report, an SVG timeline, and a Markdown report with the frozen evidence contract. - -Pass "*" as to build reports for every workflow that declares an enabled -graders.operational-value.run entry. Failures for individual workflows are reported -but do not stop processing of the remaining workflows.`, - Example: ` ` + string(constants.CLIExtensionPrefix) + ` graders operational-value report daily-file-diet - ` + string(constants.CLIExtensionPrefix) + ` graders operational-value report daily-file-diet --until 2026-08-31T00:00:00Z - ` + string(constants.CLIExtensionPrefix) + ` graders operational-value report daily-file-diet --refresh --json - ` + string(constants.CLIExtensionPrefix) + ` graders operational-value report "*"`, - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - until, _ := cmd.Flags().GetString("until") - outputDir, _ := cmd.Flags().GetString("output") - cacheDir, _ := cmd.Flags().GetString("cache-dir") - concurrency, _ := cmd.Flags().GetInt("concurrency") - repoOverride, _ := cmd.Flags().GetString("repo") - refresh, _ := cmd.Flags().GetBool("refresh") - jsonOutput, _ := cmd.Flags().GetBool("json") - return RunOperationalValueReport(cmd.Context(), OperationalValueReportConfig{ - Workflow: args[0], RepoOverride: repoOverride, Until: until, - OutputDir: outputDir, CacheDir: cacheDir, Concurrency: concurrency, - Refresh: refresh, JSONOutput: jsonOutput, - }) - }, - } - cmd.Flags().String("until", "", "UTC endpoint for evidence collection (defaults to now)") - cmd.Flags().String("cache-dir", "", "Weekly observation cache directory (defaults to the user cache)") - cmd.Flags().Int("concurrency", 0, "Maximum number of concurrent evaluator executions (0 = use default)") - cmd.Flags().Bool("refresh", false, "Re-evaluate observations instead of reading weekly cache entries") - addOutputFlag(cmd, defaultOperationalValueReportOutputDir) - addRepoFlag(cmd) - addJSONFlag(cmd) - cmd.ValidArgsFunction = CompleteWorkflowNames - return cmd -} - -func RunOperationalValueReport(ctx context.Context, config OperationalValueReportConfig) error { - if config.Workflow == "*" { - return runOperationalValueReportForAllWorkflows(ctx, config) - } - return runOperationalValueReportForWorkflow(ctx, config) -} - -// runOperationalValueReportForAllWorkflows builds an operational-value report for every -// workflow that declares an enabled graders.operational-value.run entry. Each workflow is -// processed independently: a failure is reported and logged but does not stop processing -// of the remaining workflows. The aggregate error, if any, joins every per-workflow failure. -func runOperationalValueReportForAllWorkflows(ctx context.Context, config OperationalValueReportConfig) error { - workflowIDs, err := discoverOperationalValueGradedWorkflowIDs() - if err != nil { - return err - } - if len(workflowIDs) == 0 { - return errors.New("no workflows declare an enabled graders.operational-value.run") - } - operationalValueReportLog.Printf("Building operational-value reports for %d graded workflow(s)", len(workflowIDs)) - var failed []string - var errs error - for _, workflowID := range workflowIDs { - workflowConfig := config - workflowConfig.Workflow = workflowID - if err := runOperationalValueReportForWorkflow(ctx, workflowConfig); err != nil { - fmt.Fprintln(os.Stderr, console.FormatWarningMessageStderr(fmt.Sprintf("operational-value report failed for %s: %v", workflowID, err))) - failed = append(failed, workflowID) - errs = errors.Join(errs, fmt.Errorf("%s: %w", workflowID, err)) - } - } - succeeded := len(workflowIDs) - len(failed) - summary := fmt.Sprintf("Built operational-value reports for %d/%d graded workflow(s)", succeeded, len(workflowIDs)) - if len(failed) > 0 { - fmt.Fprintln(os.Stderr, console.FormatWarningMessageStderr(summary)) - } else { - fmt.Fprintln(os.Stderr, console.FormatInfoMessageStderr(summary)) - } - return errs -} - -func runOperationalValueReportForWorkflow(ctx context.Context, config OperationalValueReportConfig) error { //nolint:largefunc // Coordinates the report pipeline and its cleanup in one lifecycle. - evidenceAt, err := operationalValueReportEvaluatorEvidenceTime(config.Until, time.Now()) - if err != nil { - return err - } - repoSlug, _, evaluatorHost, err := resolveOperationalValueRegradeRepo(config.RepoOverride) - if err != nil { - return err - } - evaluator, err := operationalValueReportLoadEvaluator(ctx, config.Workflow, evaluatorHost) - if err != nil { - return err - } - if evaluator.cleanup != nil { - defer evaluator.cleanup() - } - if !strings.EqualFold(repoSlug, evaluator.Definition.Repository) { - return fmt.Errorf("operational-value evaluator repository %q does not match report repository %q", evaluator.Definition.Repository, repoSlug) - } - startAt, err := parseOperationalValueTimestamp(evaluator.Definition.Adoption.AdoptedAt, "adoption.adoptedAt") - if err != nil { - return err - } - if !evidenceAt.After(startAt) { - return fmt.Errorf("report endpoint %s must follow workflow adoption %s", evidenceAt.Format(time.RFC3339), startAt.Format(time.RFC3339)) - } - hostname := "" - if parsedHost, parseErr := url.Parse(evaluatorHost); parseErr == nil { - hostname = parsedHost.Hostname() - } - workflowFile := strings.TrimSuffix(filepath.Base(evaluator.Definition.SourcePath), ".md") + ".lock.yml" - operationalValueReportLog.Printf("Listing report runs: repository=%s workflow=%s start=%s end=%s", repoSlug, workflowFile, startAt, evidenceAt) - runs, err := operationalValueReportListRuns(ctx, repoSlug, hostname, workflowFile, startAt, evidenceAt) - if err != nil { - return err - } - cacheDir := config.CacheDir - if cacheDir == "" { - cacheDir, err = defaultOperationalValueReportCacheRoot() - if err != nil { - return err - } - } - observations, stats, err := backfillOperationalValueReportObservations(ctx, evaluator, runs, evidenceAt, cacheDir, evaluatorHost, config.Refresh, config.Concurrency) - if err != nil { - return err - } - report := buildOperationalValueReport(evaluator, observations, time.Now(), evidenceAt, stats) - outputDir := config.OutputDir - if outputDir == "" { - outputDir = defaultOperationalValueReportOutputDir - } - paths, err := writeOperationalValueReportArtifacts(report, outputDir) - if err != nil { - return err - } - if config.JSONOutput { - output := operationalValueReportCommandOutput{Report: report, Artifacts: paths, CacheDir: cacheDir} - data, err := marshalIndentJSONOrWrap(output, "operational-value report command output") - if err != nil { - return err - } - fmt.Fprintln(os.Stdout, string(data)) - return nil - } - fmt.Fprintln(os.Stdout, console.FormatSuccessMessage(fmt.Sprintf("Built operational-value report for %s from %d workflow runs", evaluator.Definition.WorkflowName, len(runs)))) - fmt.Fprintf(os.Stdout, "Markdown: %s\nSVG: %s\nJSON: %s\nWeekly cache: %s\n", paths.Markdown, paths.SVG, paths.JSON, cacheDir) - return nil -} diff --git a/pkg/cli/graders_operational_value_report_command_test.go b/pkg/cli/graders_operational_value_report_command_test.go deleted file mode 100644 index eab2dd93cea..00000000000 --- a/pkg/cli/graders_operational_value_report_command_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package cli - -import ( - "context" - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestRunOperationalValueReportSupportsWildcardWorkflow(t *testing.T) { - originalLoadEvaluator := operationalValueReportLoadEvaluator - originalListRuns := operationalValueReportListRuns - originalGradeRun := operationalValueReportGradeRun - t.Cleanup(func() { - operationalValueReportLoadEvaluator = originalLoadEvaluator - operationalValueReportListRuns = originalListRuns - operationalValueReportGradeRun = originalGradeRun - }) - - tmpDir := t.TempDir() - workflowsDir := filepath.Join(tmpDir, ".github", "workflows") - require.NoError(t, os.MkdirAll(workflowsDir, 0o755)) - writeWorkflow := func(name, content string) { - require.NoError(t, os.WriteFile(filepath.Join(workflowsDir, name), []byte(content), 0o644)) - } - writeWorkflow("daily-file-diet.md", "---\non: workflow_dispatch\ngraders:\n operational-value:\n run: .github/graders/daily-file-diet-operational-value.sh\n---\n# Daily File Diet\n") - writeWorkflow("weekly-research.md", "---\non: workflow_dispatch\ngraders:\n operational-value:\n run: .github/graders/weekly-research-operational-value.sh\n enabled: false\n---\n# Weekly Research\n") - writeWorkflow("no-grader.md", "---\non: workflow_dispatch\n---\n# No Grader\n") - - originalDir, err := os.Getwd() - require.NoError(t, err) - require.NoError(t, os.Chdir(tmpDir)) - t.Cleanup(func() { require.NoError(t, os.Chdir(originalDir)) }) - - evaluatorDigest := strings.Repeat("a", 64) - var requestedWorkflows []string - operationalValueReportLoadEvaluator = func(_ context.Context, workflowArg, _ string) (*operationalValueReportEvaluator, error) { - requestedWorkflows = append(requestedWorkflows, workflowArg) - definitionJSON := json.RawMessage(fmt.Sprintf(`{"schemaVersion":4,"grader":"operational-value","repository":"github/gh-aw","workflowName":%q,"sourcePath":".github/workflows/%s.md","adoption":{"commit":"abc","adoptedAt":"2026-08-01T00:00:00Z"},"operationalValue":"x","evidence":{"opportunity":"file","assignment":"largest","accepted":"Git","repositories":["github/gh-aw"],"collection":"Git API","maturation":"two days","zeroRule":"none","missingRule":"null"},"primaryMetric":{"id":"reduction","formula":"reduction / target","direction":"higher_is_better"},"baseline":{"mode":"attainment-only","value":null,"evidenceCutoff":null,"provenance":[]},"validationExamples":{"sample":{"valid":true}}}`, workflowArg, workflowArg)) - definition, err := parseOperationalValueReportDefinition(definitionJSON) - if err != nil { - return nil, err - } - return &operationalValueReportEvaluator{ - WorkflowID: workflowArg, EvaluatorRun: ".github/graders/" + workflowArg + "-operational-value.sh", - EvaluatorDigest: evaluatorDigest, Definition: definition, GraderDirection: "higher-is-better", - }, nil - } - operationalValueReportListRuns = func(context.Context, string, string, string, time.Time, time.Time) ([]operationalValueReportRun, error) { - return []operationalValueReportRun{{ID: "1", Attempt: 1, CreatedAt: time.Date(2026, 8, 5, 0, 0, 0, 0, time.UTC)}}, nil - } - operationalValueReportGradeRun = func(_ context.Context, evaluator *operationalValueReportEvaluator, run operationalValueReportRun, _ time.Time, _ string) operationalValueReportObservation { - value := 0.5 - return operationalValueReportObservation{Run: run, Value: &value, Status: "pass", Mature: true, OpportunityKey: "go-file:pkg/example.go", EvaluatorDigest: evaluator.EvaluatorDigest, Source: "evaluator-replay"} - } - - outputDir := filepath.Join(tmpDir, "report") - err = RunOperationalValueReport(context.Background(), OperationalValueReportConfig{ - Workflow: "*", RepoOverride: "github/gh-aw", Until: "2026-08-31T00:00:00Z", - OutputDir: outputDir, CacheDir: filepath.Join(tmpDir, "cache"), - }) - require.NoError(t, err) - assert.Equal(t, []string{"daily-file-diet"}, requestedWorkflows) - _, err = os.Stat(filepath.Join(outputDir, "daily-file-diet-operational-value.json")) - require.NoError(t, err) -} - -func TestOperationalValueReportCommandFlags(t *testing.T) { - cmd := newGradersOperationalValueReportCommand() - assert.Equal(t, "report ", cmd.Use) - for _, flag := range []string{"until", "output", "cache-dir", "concurrency", "refresh", "repo", "json"} { - assert.NotNil(t, cmd.Flags().Lookup(flag), "expected --%s", flag) - } -} - -func TestRunOperationalValueReportWritesCompleteArtifacts(t *testing.T) { - originalLoadEvaluator := operationalValueReportLoadEvaluator - originalListRuns := operationalValueReportListRuns - originalGradeRun := operationalValueReportGradeRun - t.Cleanup(func() { - operationalValueReportLoadEvaluator = originalLoadEvaluator - operationalValueReportListRuns = originalListRuns - operationalValueReportGradeRun = originalGradeRun - }) - - evaluatorDigest := strings.Repeat("a", 64) - definitionJSON := json.RawMessage(`{"schemaVersion":4,"grader":"operational-value","repository":"github/gh-aw","workflowName":"Daily File Diet","sourcePath":".github/workflows/daily-file-diet.md","adoption":{"commit":"abc","adoptedAt":"2026-08-01T00:00:00Z"},"operationalValue":"Improve the assigned file.","evidence":{"opportunity":"file","assignment":"largest","accepted":"Git","repositories":["github/gh-aw"],"collection":"Git API","maturation":"two days","zeroRule":"none","missingRule":"null"},"primaryMetric":{"id":"reduction","formula":"reduction / target","direction":"higher_is_better"},"baseline":{"mode":"attainment-only","value":null,"evidenceCutoff":null,"provenance":[]},"validationExamples":{"sample":{"valid":true}}}`) - definition, err := parseOperationalValueReportDefinition(definitionJSON) - require.NoError(t, err) - operationalValueReportLoadEvaluator = func(context.Context, string, string) (*operationalValueReportEvaluator, error) { - return &operationalValueReportEvaluator{ - WorkflowID: "daily-file-diet", EvaluatorRun: ".github/graders/daily-file-diet-operational-value.sh", - EvaluatorDigest: evaluatorDigest, Definition: definition, GraderDirection: "higher-is-better", - }, nil - } - operationalValueReportListRuns = func(_ context.Context, repository, hostname, workflowFile string, _, _ time.Time) ([]operationalValueReportRun, error) { - assert.Equal(t, "github/gh-aw", repository) - assert.Equal(t, "github.com", hostname) - assert.Equal(t, "daily-file-diet.lock.yml", workflowFile) - return []operationalValueReportRun{{ID: "42", Attempt: 1, CreatedAt: time.Date(2026, 8, 5, 0, 0, 0, 0, time.UTC)}}, nil - } - operationalValueReportGradeRun = func(_ context.Context, evaluator *operationalValueReportEvaluator, run operationalValueReportRun, _ time.Time, _ string) operationalValueReportObservation { - value := 0.75 - return operationalValueReportObservation{Run: run, Value: &value, Status: "pass", Mature: true, OpportunityKey: "go-file:pkg/example.go", EvaluatorDigest: evaluator.EvaluatorDigest, Source: "evaluator-replay"} - } - - outputDir := filepath.Join(t.TempDir(), "report") - err = RunOperationalValueReport(context.Background(), OperationalValueReportConfig{ - Workflow: "daily-file-diet", RepoOverride: "github/gh-aw", Until: "2026-08-31T00:00:00Z", - OutputDir: outputDir, CacheDir: filepath.Join(t.TempDir(), "cache"), - }) - require.NoError(t, err) - for _, extension := range []string{"json", "svg", "md"} { - _, err := os.Stat(filepath.Join(outputDir, "daily-file-diet-operational-value."+extension)) - require.NoError(t, err) - } - reportData, err := os.ReadFile(filepath.Join(outputDir, "daily-file-diet-operational-value.json")) - require.NoError(t, err) - var report operationalValueReport - require.NoError(t, json.Unmarshal(reportData, &report)) - require.Len(t, report.Observations, 1) - assert.Equal(t, evaluatorDigest, report.Evaluator.SHA256) - assert.Equal(t, ".github/graders/daily-file-diet-operational-value.sh", report.Evaluator.Path) - assert.Equal(t, "2026-08-31T00:00:00Z", report.Window.EndAt) - assert.NotEqual(t, report.Window.EndAt, report.GeneratedAt) -} diff --git a/pkg/cli/graders_operational_value_report_evaluator.go b/pkg/cli/graders_operational_value_report_evaluator.go deleted file mode 100644 index deea0ebe9c7..00000000000 --- a/pkg/cli/graders_operational_value_report_evaluator.go +++ /dev/null @@ -1,286 +0,0 @@ -package cli - -import ( - "bytes" - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - "time" - "unicode/utf8" - - "github.com/github/gh-aw/pkg/constants" - "github.com/github/gh-aw/pkg/fileutil" - "github.com/github/gh-aw/pkg/gitutil" - "github.com/github/gh-aw/pkg/parser" - "github.com/github/gh-aw/pkg/workflow" -) - -// discoverOperationalValueGradedWorkflowIDs returns the sorted workflow IDs (basenames -// without the .md extension) of every top-level workflow declaring an enabled -// graders.operational-value.run entry. Used to support the "*" workflow argument on -// `graders operational-value report`. -func discoverOperationalValueGradedWorkflowIDs() ([]string, error) { - mdFiles, err := getMarkdownWorkflowFiles("") - if err != nil { - return nil, err - } - var workflowIDs []string - for _, file := range mdFiles { - content, err := os.ReadFile(file) - if err != nil { - return nil, fmt.Errorf("cannot read workflow %s: %w", file, err) - } - parsed, err := parser.ExtractFrontmatterFromContent(string(content)) - if err != nil || parsed.Frontmatter == nil { - continue - } - graders, err := workflow.ParseGradersFromFrontmatter(parsed.Frontmatter) - if err != nil || graders == nil { - continue - } - grader := graders.Graders["operational-value"] - if grader == nil || (grader.Enabled != nil && !*grader.Enabled) || grader.Run == "" { - continue - } - workflowIDs = append(workflowIDs, normalizeWorkflowID(filepath.Base(file))) - } - sort.Strings(workflowIDs) - return workflowIDs, nil -} - -func loadOperationalValueReportEvaluator(ctx context.Context, workflowArg, evaluatorHost string) (*operationalValueReportEvaluator, error) { //nolint:largefunc // Keeps evaluator validation and staged-file cleanup in one lifecycle. - workflowPath, err := ResolveWorkflowPath(workflowArg) - if err != nil { - return nil, err - } - workflowContent, err := os.ReadFile(workflowPath) - if err != nil { - return nil, fmt.Errorf("cannot read workflow %s: %w", workflowPath, err) - } - parsed, err := parser.ExtractFrontmatterFromContent(string(workflowContent)) - if err != nil { - return nil, fmt.Errorf("cannot parse workflow %s: %w", workflowPath, err) - } - graders, err := workflow.ParseGradersFromFrontmatter(parsed.Frontmatter) - if err != nil { - return nil, fmt.Errorf("cannot parse graders in %s: %w", workflowPath, err) - } - if graders == nil { - return nil, fmt.Errorf("workflow %s does not declare graders.operational-value", workflowPath) - } - grader := graders.Graders["operational-value"] - if grader == nil || (grader.Enabled != nil && !*grader.Enabled) || grader.Run == "" { - return nil, fmt.Errorf("workflow %s does not declare an enabled graders.operational-value.run", workflowPath) - } - - repoRoot, err := gitutil.FindGitRootFrom(filepath.Dir(workflowPath)) - if err != nil { - return nil, fmt.Errorf("cannot resolve operational-value evaluator: %w", err) - } - evaluatorPath := filepath.Join(repoRoot, filepath.FromSlash(grader.Run)) - evaluatorContent, evaluatorDigest, err := readOperationalValueReportEvaluator(repoRoot, evaluatorPath) - if err != nil { - return nil, err - } - frozenEvaluatorPath, cleanup, err := stageOperationalValueReportEvaluator(evaluatorPath, evaluatorContent) - if err != nil { - return nil, err - } - cleanupOnError := true - defer func() { - if cleanupOnError { - cleanup() - } - }() - bashPath := "/bin/bash" - if _, err := runOperationalValueEvaluatorBash(ctx, bashPath, frozenEvaluatorPath, []string{"-n", frozenEvaluatorPath}, nil, operationalValueDefinitionTimeout, evaluatorHost); err != nil { - return nil, fmt.Errorf("operational-value evaluator has invalid Bash syntax: %w", err) - } - definitionJSON, err := runOperationalValueEvaluatorBash(ctx, bashPath, frozenEvaluatorPath, []string{frozenEvaluatorPath, "--definition"}, nil, operationalValueDefinitionTimeout, evaluatorHost) - if err != nil { - return nil, fmt.Errorf("operational-value evaluator --definition failed: %w", err) - } - definition, err := parseOperationalValueReportDefinition(definitionJSON) - if err != nil { - return nil, err - } - absoluteWorkflowPath, err := filepath.Abs(workflowPath) - if err != nil { - return nil, fmt.Errorf("cannot resolve workflow path %s: %w", workflowPath, err) - } - relativeWorkflowPath, err := filepath.Rel(repoRoot, absoluteWorkflowPath) - if err != nil || filepath.ToSlash(relativeWorkflowPath) != definition.SourcePath { - return nil, fmt.Errorf("operational-value evaluator sourcePath %q does not match workflow %q", definition.SourcePath, filepath.ToSlash(relativeWorkflowPath)) - } - - workflowID := strings.TrimSuffix(filepath.Base(workflowPath), filepath.Ext(workflowPath)) - cleanupOnError = false - return &operationalValueReportEvaluator{ - WorkflowID: workflowID, - WorkflowPath: workflowPath, - EvaluatorRun: grader.Run, - EvaluatorPath: frozenEvaluatorPath, - EvaluatorContent: evaluatorContent, - EvaluatorDigest: evaluatorDigest, - cleanup: cleanup, - Definition: definition, - GraderName: grader.Name, - GraderUnit: grader.Unit, - GraderDirection: grader.Direction, - GraderThreshold: grader.Threshold, - GraderConfig: grader.Config, - }, nil -} - -func stageOperationalValueReportEvaluator(evaluatorPath, evaluatorContent string) (string, func(), error) { - tempFile, err := os.CreateTemp(filepath.Dir(evaluatorPath), "."+filepath.Base(evaluatorPath)+".frozen-*") - if err != nil { - return "", nil, fmt.Errorf("cannot stage operational-value evaluator: %w", err) - } - tempPath := tempFile.Name() - if err := tempFile.Chmod(constants.FilePermSensitive); err != nil { - _ = tempFile.Close() - _ = os.Remove(tempPath) - return "", nil, fmt.Errorf("cannot secure staged operational-value evaluator: %w", err) - } - if _, err := tempFile.WriteString(evaluatorContent); err != nil { - _ = tempFile.Close() - _ = os.Remove(tempPath) - return "", nil, fmt.Errorf("cannot write staged operational-value evaluator: %w", err) - } - if err := tempFile.Close(); err != nil { - _ = os.Remove(tempPath) - return "", nil, fmt.Errorf("cannot close staged operational-value evaluator: %w", err) - } - cleanup := func() { - _ = os.Remove(tempPath) - } - return tempPath, cleanup, nil -} - -func readOperationalValueReportEvaluator(repoRoot, evaluatorPath string) (string, string, error) { - if err := fileutil.ValidatePathWithinBase(repoRoot, evaluatorPath); err != nil { - return "", "", errors.New("operational-value evaluator escapes the Git repository") - } - info, err := os.Lstat(evaluatorPath) - if err != nil { - return "", "", fmt.Errorf("cannot inspect operational-value evaluator: %w", err) - } - if info.Mode()&os.ModeSymlink != 0 || !info.Mode().IsRegular() { - return "", "", errors.New("operational-value evaluator must be a regular file, not a symbolic link") - } - file, err := os.Open(evaluatorPath) - if err != nil { - return "", "", fmt.Errorf("cannot read operational-value evaluator: %w", err) - } - defer file.Close() - content, err := io.ReadAll(io.LimitReader(file, maxOperationalValueRegradeEvaluatorBytes+1)) - if err != nil { - return "", "", fmt.Errorf("cannot read operational-value evaluator: %w", err) - } - if len(content) > maxOperationalValueRegradeEvaluatorBytes { - return "", "", fmt.Errorf("operational-value evaluator exceeds the %d-byte limit", maxOperationalValueRegradeEvaluatorBytes) - } - if !utf8.Valid(content) { - return "", "", errors.New("operational-value evaluator must be valid UTF-8") - } - if !bytes.HasPrefix(content, []byte("#!/usr/bin/env bash\n")) && !bytes.HasPrefix(content, []byte("#!/bin/bash\n")) { - return "", "", errors.New("operational-value evaluator must start with a Bash shebang") - } - digest := sha256.Sum256(content) - return string(content), hex.EncodeToString(digest[:]), nil -} - -func parseOperationalValueReportDefinition(data []byte) (operationalValueReportDefinition, error) { //nolint:largefunc // Validates the complete frozen definition contract in field order. - if _, err := parseOperationalValueDefinition(data); err != nil { - return operationalValueReportDefinition{}, err - } - var definition operationalValueReportDefinition - if err := json.Unmarshal(data, &definition); err != nil { - return operationalValueReportDefinition{}, fmt.Errorf("operational-value evaluator returned an invalid definition: %w", err) - } - definition.Raw = append(json.RawMessage(nil), data...) - if definition.Repository == "" || definition.WorkflowName == "" || definition.SourcePath == "" { - return operationalValueReportDefinition{}, errors.New("operational-value evaluator definition requires repository, workflowName, and sourcePath") - } - if definition.Adoption.Commit == "" { - return operationalValueReportDefinition{}, errors.New("operational-value evaluator definition requires adoption.commit") - } - if _, err := parseOperationalValueTimestamp(definition.Adoption.AdoptedAt, "adoption.adoptedAt"); err != nil { - return operationalValueReportDefinition{}, err - } - if strings.TrimSpace(definition.OperationalValue) == "" || strings.TrimSpace(definition.PrimaryMetric.ID) == "" || strings.TrimSpace(definition.PrimaryMetric.Formula) == "" { - return operationalValueReportDefinition{}, errors.New("operational-value evaluator definition requires operationalValue and primaryMetric") - } - if definition.PrimaryMetric.Direction != "higher_is_better" { - return operationalValueReportDefinition{}, errors.New("operational-value evaluator primaryMetric.direction must be higher_is_better") - } - metricIDs := map[string]struct{}{definition.PrimaryMetric.ID: {}} - for _, metric := range definition.DiagnosticMetrics { - if strings.TrimSpace(metric.ID) == "" || strings.TrimSpace(metric.Name) == "" || strings.TrimSpace(metric.Formula) == "" { - return operationalValueReportDefinition{}, errors.New("operational-value evaluator diagnosticMetrics require id, name, and formula") - } - if _, exists := metricIDs[metric.ID]; exists { - return operationalValueReportDefinition{}, fmt.Errorf("operational-value evaluator metric id %q is duplicated", metric.ID) - } - metricIDs[metric.ID] = struct{}{} - if metric.Direction != "higher_is_better" { - return operationalValueReportDefinition{}, fmt.Errorf("operational-value evaluator diagnostic metric %q direction must be higher_is_better", metric.ID) - } - if metric.Aggregation != "latest" && metric.Aggregation != "mean" { - return operationalValueReportDefinition{}, fmt.Errorf("operational-value evaluator diagnostic metric %q aggregation must be latest or mean", metric.ID) - } - } - if strings.TrimSpace(definition.Evidence.Opportunity) == "" || - strings.TrimSpace(definition.Evidence.Assignment) == "" || - strings.TrimSpace(definition.Evidence.Accepted) == "" || - len(definition.Evidence.Repositories) == 0 || - strings.TrimSpace(definition.Evidence.Collection) == "" || - strings.TrimSpace(definition.Evidence.Maturation) == "" || - strings.TrimSpace(definition.Evidence.ZeroRule) == "" || - strings.TrimSpace(definition.Evidence.MissingRule) == "" { - return operationalValueReportDefinition{}, errors.New("operational-value evaluator definition requires complete evidence contract fields") - } - if definition.Baseline.Mode == "baseline-comparable" && (definition.Baseline.Value == nil || *definition.Baseline.Value < 0 || *definition.Baseline.Value > 1) { - return operationalValueReportDefinition{}, errors.New("baseline-comparable operational-value evaluators require a baseline value in [0,1]") - } - if definition.Baseline.Mode == "attainment-only" && definition.Baseline.Value != nil { - return operationalValueReportDefinition{}, errors.New("attainment-only operational-value evaluators must have a null baseline value") - } - if definition.Baseline.Mode == "baseline-comparable" { - if definition.Baseline.EvidenceCutoff == nil { - return operationalValueReportDefinition{}, errors.New("baseline-comparable operational-value evaluators require baseline.evidenceCutoff") - } - if _, err := parseOperationalValueTimestamp(*definition.Baseline.EvidenceCutoff, "baseline.evidenceCutoff"); err != nil { - return operationalValueReportDefinition{}, err - } - if len(definition.Baseline.Provenance) == 0 { - return operationalValueReportDefinition{}, errors.New("baseline-comparable operational-value evaluators require baseline.provenance") - } - } - var definitionEnvelope struct { - ValidationExamples map[string]json.RawMessage `json:"validationExamples"` - } - if err := json.Unmarshal(data, &definitionEnvelope); err != nil { - return operationalValueReportDefinition{}, fmt.Errorf("operational-value evaluator returned an invalid definition: %w", err) - } - if len(definitionEnvelope.ValidationExamples) == 0 { - return operationalValueReportDefinition{}, errors.New("operational-value evaluator definition requires primary-metric validation examples") - } - return definition, nil -} - -func operationalValueReportEvaluatorEvidenceTime(value string, fallback time.Time) (time.Time, error) { - if strings.TrimSpace(value) == "" { - return fallback.UTC().Truncate(time.Second), nil - } - return parseOperationalValueTimestamp(value, "until") -} diff --git a/pkg/cli/graders_operational_value_report_evaluator_test.go b/pkg/cli/graders_operational_value_report_evaluator_test.go deleted file mode 100644 index abd350be8a9..00000000000 --- a/pkg/cli/graders_operational_value_report_evaluator_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package cli - -import ( - "context" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestLoadOperationalValueReportEvaluatorResolvesRelativeWorkflowPath(t *testing.T) { - workingDirectory, err := os.Getwd() - require.NoError(t, err) - t.Chdir(filepath.Join(workingDirectory, "..", "..")) - - evaluator, err := loadOperationalValueReportEvaluator(context.Background(), "daily-file-diet", "https://github.com") - require.NoError(t, err) - t.Cleanup(func() { - if evaluator.cleanup != nil { - evaluator.cleanup() - } - }) - assert.Equal(t, ".github/workflows/daily-file-diet.md", evaluator.Definition.SourcePath) - assert.Equal(t, ".github/graders/daily-file-diet-operational-value.sh", evaluator.EvaluatorRun) - assert.NotEqual(t, evaluator.EvaluatorRun, evaluator.EvaluatorPath) -} - -func TestParseOperationalValueReportDefinition(t *testing.T) { - definition, err := parseOperationalValueReportDefinition([]byte(`{ - "schemaVersion":4, - "grader":"operational-value", - "repository":"github/gh-aw", - "workflowName":"Daily File Diet", - "sourcePath":".github/workflows/daily-file-diet.md", - "adoption":{"commit":"abc123","adoptedAt":"2025-11-15T13:36:21Z"}, - "operationalValue":"Decompose the assigned oversized file.", - "evidence":{"opportunity":"An oversized file","assignment":"largest file","accepted":"Git evidence","repositories":["github/gh-aw"],"collection":"GitHub API","maturation":"48 hours","zeroRule":"none","missingRule":"null"}, - "primaryMetric":{"id":"decomposition","formula":"reduction / target","direction":"higher_is_better"}, - "diagnosticMetrics":[{"id":"health","name":"Repository health","formula":"healthy / total","direction":"higher_is_better","aggregation":"latest"}], - "baseline":{"mode":"baseline-comparable","value":0.25,"evidenceCutoff":"2025-11-15T13:27:11Z","provenance":[{"repository":"github/gh-aw","kind":"commit","ref":"abc123"}]}, - "validationExamples":{"sample":{"valid":true}} - }`)) - require.NoError(t, err) - assert.Equal(t, "github/gh-aw", definition.Repository) - require.Len(t, definition.DiagnosticMetrics, 1) - assert.Equal(t, "health", definition.DiagnosticMetrics[0].ID) - require.NotNil(t, definition.Baseline.Value) - assert.InDelta(t, 0.25, *definition.Baseline.Value, 0.000001) -} - -func TestParseOperationalValueReportDefinitionRejectsInvalidDiagnosticMetric(t *testing.T) { - _, err := parseOperationalValueReportDefinition([]byte(`{ - "schemaVersion":4, - "grader":"operational-value", - "repository":"github/gh-aw", - "workflowName":"Daily File Diet", - "sourcePath":".github/workflows/daily-file-diet.md", - "adoption":{"commit":"abc123","adoptedAt":"2025-11-15T13:36:21Z"}, - "operationalValue":"Decompose the assigned oversized file.", - "evidence":{"opportunity":"An oversized file","assignment":"largest file","accepted":"Git evidence","repositories":["github/gh-aw"],"collection":"GitHub API","maturation":"48 hours","zeroRule":"none","missingRule":"null"}, - "primaryMetric":{"id":"decomposition","formula":"reduction / target","direction":"higher_is_better"}, - "diagnosticMetrics":[{"id":"decomposition","name":"Duplicate","formula":"x","direction":"higher_is_better","aggregation":"latest"}], - "baseline":{"mode":"attainment-only","value":null,"evidenceCutoff":null,"provenance":[]}, - "validationExamples":{"sample":{"valid":true}} - }`)) - require.ErrorContains(t, err, "duplicated") -} - -func TestParseOperationalValueReportDefinitionRejectsIncompleteContract(t *testing.T) { - _, err := parseOperationalValueReportDefinition([]byte(`{ - "schemaVersion":4, - "grader":"operational-value", - "baseline":{"mode":"attainment-only","value":null} - }`)) - require.Error(t, err) - assert.Contains(t, err.Error(), "repository, workflowName, and sourcePath") -} - -func TestParseOperationalValueReportDefinitionRejectsMissingEvidenceContractFields(t *testing.T) { - _, err := parseOperationalValueReportDefinition([]byte(`{ - "schemaVersion":4, - "grader":"operational-value", - "repository":"github/gh-aw", - "workflowName":"Daily File Diet", - "sourcePath":".github/workflows/daily-file-diet.md", - "adoption":{"commit":"abc123","adoptedAt":"2025-11-15T13:36:21Z"}, - "operationalValue":"Decompose the assigned oversized file.", - "evidence":{"opportunity":"x","accepted":"y","repositories":["github/gh-aw"]}, - "primaryMetric":{"id":"decomposition","formula":"reduction / target","direction":"higher_is_better"}, - "baseline":{"mode":"attainment-only","value":null,"evidenceCutoff":null,"provenance":[]}, - "validationExamples":{"sample":{"valid":true}} - }`)) - require.ErrorContains(t, err, "complete evidence contract fields") -} - -func TestParseOperationalValueReportDefinitionRejectsComparableBaselineWithoutCutoff(t *testing.T) { - _, err := parseOperationalValueReportDefinition([]byte(`{ - "schemaVersion":4, - "grader":"operational-value", - "repository":"github/gh-aw", - "workflowName":"Daily File Diet", - "sourcePath":".github/workflows/daily-file-diet.md", - "adoption":{"commit":"abc123","adoptedAt":"2025-11-15T13:36:21Z"}, - "operationalValue":"Decompose the assigned oversized file.", - "evidence":{"opportunity":"An oversized file","assignment":"largest file","accepted":"Git evidence","repositories":["github/gh-aw"],"collection":"GitHub API","maturation":"48 hours","zeroRule":"none","missingRule":"null"}, - "primaryMetric":{"id":"decomposition","formula":"reduction / target","direction":"higher_is_better"}, - "baseline":{"mode":"baseline-comparable","value":0.25,"evidenceCutoff":null,"provenance":[{"repository":"github/gh-aw","kind":"commit","ref":"abc123"}]}, - "validationExamples":{"sample":{"valid":true}} - }`)) - require.ErrorContains(t, err, "baseline.evidenceCutoff") -} diff --git a/pkg/cli/graders_operational_value_report_history.go b/pkg/cli/graders_operational_value_report_history.go deleted file mode 100644 index 34782b0e0f4..00000000000 --- a/pkg/cli/graders_operational_value_report_history.go +++ /dev/null @@ -1,378 +0,0 @@ -package cli - -import ( - "cmp" - "context" - "encoding/json" - "errors" - "fmt" - "maps" - "net/url" - "os" - "path/filepath" - "slices" - "strconv" - "strings" - "time" - - "github.com/github/gh-aw/pkg/workflow" - "golang.org/x/sync/errgroup" -) - -type operationalValueGitHubWorkflowRun struct { - ID int64 `json:"id"` - RunAttempt int `json:"run_attempt"` - HTMLURL string `json:"html_url"` - Status string `json:"status"` - Conclusion string `json:"conclusion"` - CreatedAt time.Time `json:"created_at"` - Event string `json:"event"` - HeadBranch string `json:"head_branch"` - HeadSHA string `json:"head_sha"` -} - -type operationalValueGitHubWorkflowRunsPage struct { - TotalCount int `json:"total_count"` - WorkflowRuns []operationalValueGitHubWorkflowRun `json:"workflow_runs"` -} - -var operationalValueReportListRuns = listOperationalValueReportRuns -var operationalValueReportGradeRun = gradeOperationalValueReportRun -var operationalValueReportRunGH = workflow.RunGHCombinedContext - -const operationalValueReportCreatedSearchCap = 1000 -const defaultOperationalValueReportConcurrency = 8 - -func listOperationalValueReportRuns(ctx context.Context, repository, hostname, workflowFile string, startAt, endAt time.Time) ([]operationalValueReportRun, error) { - startAt = startAt.UTC().Truncate(time.Second) - endAt = endAt.UTC().Truncate(time.Second) - runs := make([]operationalValueReportRun, 0) - seen := make(map[string]struct{}) - if err := collectOperationalValueReportRuns(ctx, repository, hostname, workflowFile, startAt, endAt, &runs, seen); err != nil { - return nil, err - } - slices.SortFunc(runs, func(left, right operationalValueReportRun) int { - if operationalValueReportRunLess(left, right) { - return -1 - } - if operationalValueReportRunLess(right, left) { - return 1 - } - return 0 - }) - return runs, nil -} - -func collectOperationalValueReportRuns(ctx context.Context, repository, hostname, workflowFile string, startAt, endAt time.Time, runs *[]operationalValueReportRun, seen map[string]struct{}) error { - pages, totalCount, err := fetchOperationalValueReportRunsRange(ctx, repository, hostname, workflowFile, startAt, endAt) - if err != nil { - return err - } - if totalCount >= operationalValueReportCreatedSearchCap { - if !startAt.Before(endAt) { - return fmt.Errorf("cannot enumerate complete operational-value history: more than %d runs share created_at=%s", operationalValueReportCreatedSearchCap, startAt.Format(time.RFC3339)) - } - mid := time.Unix((startAt.Unix()+endAt.Unix())/2, 0).UTC() - if err := collectOperationalValueReportRuns(ctx, repository, hostname, workflowFile, startAt, mid, runs, seen); err != nil { - return err - } - nextStart := mid - if nextStart.Equal(startAt) { - nextStart = nextStart.Add(time.Second) - } - if nextStart.After(endAt) { - return nil - } - return collectOperationalValueReportRuns(ctx, repository, hostname, workflowFile, nextStart, endAt, runs, seen) - } - for _, page := range pages { - for _, run := range page.WorkflowRuns { - if run.Status != "completed" || run.ID <= 0 || run.CreatedAt.Before(startAt) || run.CreatedAt.After(endAt) { - continue - } - attempt := run.RunAttempt - if attempt <= 0 { - attempt = 1 - } - key := strconv.FormatInt(run.ID, 10) + ":" + strconv.Itoa(attempt) - if _, exists := seen[key]; exists { - continue - } - seen[key] = struct{}{} - ref := run.HeadBranch - if ref != "" && !strings.HasPrefix(ref, "refs/") { - ref = "refs/heads/" + ref - } - *runs = append(*runs, operationalValueReportRun{ - ID: strconv.FormatInt(run.ID, 10), - Attempt: attempt, - CreatedAt: run.CreatedAt.UTC(), - Conclusion: run.Conclusion, - URL: run.HTMLURL, - SHA: run.HeadSHA, - Ref: ref, - EventName: run.Event, - }) - } - } - return nil -} - -func fetchOperationalValueReportRunsRange(ctx context.Context, repository, hostname, workflowFile string, startAt, endAt time.Time) ([]operationalValueGitHubWorkflowRunsPage, int, error) { - endpoint := fmt.Sprintf("repos/%s/actions/workflows/%s/runs", repository, url.PathEscape(workflowFile)) - args := []string{"api"} - if hostname != "" && hostname != "github.com" { - args = append(args, "--hostname", hostname) - } - args = append(args, - "--method", "GET", - "--paginate", - "--slurp", - "-f", "per_page=100", - "-f", "created="+startAt.UTC().Format(time.RFC3339)+".."+endAt.UTC().Format(time.RFC3339), - endpoint, - ) - output, err := operationalValueReportRunGH(ctx, "Fetching operational-value history...", args...) - if err != nil { - return nil, 0, fmt.Errorf("failed to list workflow runs for operational-value report: %w", err) - } - var pages []operationalValueGitHubWorkflowRunsPage - if err := json.Unmarshal(output, &pages); err != nil { - return nil, 0, fmt.Errorf("failed to parse workflow runs for operational-value report: %w", err) - } - totalCount := 0 - for _, page := range pages { - if page.TotalCount > totalCount { - totalCount = page.TotalCount - } - } - return pages, totalCount, nil -} - -func gradeOperationalValueReportRun(ctx context.Context, evaluator *operationalValueReportEvaluator, run operationalValueReportRun, evidenceAt time.Time, evaluatorHost string) operationalValueReportObservation { //nolint:largefunc // Keeps one evaluator invocation and observation mapping atomic. - createdAt := run.CreatedAt.UTC().Format(time.RFC3339) - subject := graderArtifactSubject{ - Type: "workflow-run", - RunID: run.ID, - Attempt: run.Attempt, - Repository: evaluator.Definition.Repository, - Workflow: evaluator.Definition.WorkflowName, - Ref: run.Ref, - SHA: run.SHA, - EventName: run.EventName, - CreatedAt: &createdAt, - } - config := evaluator.GraderConfig - if config == nil { - config = map[string]any{} - } - request := operationalValueRunRequest{ - SchemaVersion: 1, - Run: operationalValueRunSubject{ - ID: run.ID, - Attempt: run.Attempt, - Repository: evaluator.Definition.Repository, - Workflow: evaluator.Definition.WorkflowName, - Ref: run.Ref, - SHA: run.SHA, - EventName: run.EventName, - CreatedAt: &createdAt, - }, - EvidenceAt: evidenceAt.UTC().Format(time.RFC3339), - Case: nil, - Event: nil, - Config: config, - } - requestJSON, err := json.Marshal(request) - if err != nil { - return failedOperationalValueReportObservation(run, evaluator.EvaluatorDigest, err) - } - output, err := runOperationalValueEvaluatorBash(ctx, "/bin/bash", evaluator.EvaluatorPath, - []string{evaluator.EvaluatorPath, "--grade-run"}, requestJSON, operationalValueEvaluatorTimeout, evaluatorHost) - if err != nil { - return failedOperationalValueReportObservation(run, evaluator.EvaluatorDigest, err) - } - execution, err := parseOperationalValueEvaluatorOutput(output, subject, request.EvidenceAt, evidenceAt, evaluator.Definition.Baseline.Value) - if err != nil { - return failedOperationalValueReportObservation(run, evaluator.EvaluatorDigest, err) - } - status := "unavailable" - if execution.Value != nil { - status = "pass" - if passed := evaluateOperationalValueThreshold(execution.Value, evaluator.GraderDirection, evaluator.GraderThreshold); passed != nil && !*passed { - status = "fail" - } - } - return operationalValueReportObservation{ - Run: run, - Value: execution.Value, - Status: status, - Message: execution.Message, - OpportunityKey: execution.Observation.OpportunityKey, - EvidenceAt: execution.Observation.EvidenceAt, - EvidenceCutoff: execution.Observation.EvidenceCutoff, - MaturesAt: execution.Observation.MaturesAt, - Mature: execution.Observation.Mature, - Case: execution.Observation.Case, - Provenance: execution.Observation.Provenance, - Diagnostics: execution.Diagnostics, - BaselineValue: execution.BaselineValue, - DeltaFromBaseline: execution.DeltaFromBaseline, - EvaluatorDigest: evaluator.EvaluatorDigest, - Source: "evaluator-replay", - } -} - -func failedOperationalValueReportObservation(run operationalValueReportRun, evaluatorDigest string, err error) operationalValueReportObservation { - return operationalValueReportObservation{ - Run: run, - Status: "error", - Message: err.Error(), - EvaluatorDigest: evaluatorDigest, - Source: "evaluator-replay", - } -} - -type operationalValueReportBackfillStats struct { - CacheHits int - Evaluated int -} - -type operationalValueReportWeekBackfill struct { - observations []operationalValueReportObservation - stats operationalValueReportBackfillStats -} - -func backfillOperationalValueReportObservations(ctx context.Context, evaluator *operationalValueReportEvaluator, runs []operationalValueReportRun, evidenceAt time.Time, cacheRoot, evaluatorHost string, refresh bool, concurrency int) ([]operationalValueReportObservation, operationalValueReportBackfillStats, error) { - weeks := make(map[time.Time][]operationalValueReportRun) - for _, run := range runs { - week := operationalValueUTCWeekStart(run.CreatedAt) - weeks[week] = append(weeks[week], run) - } - weekStarts := make([]time.Time, 0, len(weeks)) - for week := range weeks { - weekStarts = append(weekStarts, week) - } - slices.SortFunc(weekStarts, func(left, right time.Time) int { return cmp.Compare(left.Unix(), right.Unix()) }) - - if concurrency <= 0 { - concurrency = defaultOperationalValueReportConcurrency - } - results := make([]operationalValueReportWeekBackfill, len(weekStarts)) - group, groupContext := errgroup.WithContext(ctx) - group.SetLimit(concurrency) - for index, weekStart := range weekStarts { - group.Go(func() error { - result, err := backfillOperationalValueReportWeek(groupContext, evaluator, weeks[weekStart], weekStart, evidenceAt, cacheRoot, evaluatorHost, refresh) - if err != nil { - return err - } - results[index] = result - return nil - }) - } - if err := group.Wait(); err != nil { - return nil, operationalValueReportBackfillStats{}, err - } - - observations := make([]operationalValueReportObservation, 0, len(runs)) - stats := operationalValueReportBackfillStats{} - for _, result := range results { - observations = append(observations, result.observations...) - stats.CacheHits += result.stats.CacheHits - stats.Evaluated += result.stats.Evaluated - } - slices.SortFunc(observations, func(left, right operationalValueReportObservation) int { - if operationalValueReportRunLess(left.Run, right.Run) { - return -1 - } - if operationalValueReportRunLess(right.Run, left.Run) { - return 1 - } - return 0 - }) - return observations, stats, nil -} - -func backfillOperationalValueReportWeek(ctx context.Context, evaluator *operationalValueReportEvaluator, runs []operationalValueReportRun, weekStart, evidenceAt time.Time, cacheRoot, evaluatorHost string, refresh bool) (operationalValueReportWeekBackfill, error) { - result := operationalValueReportWeekBackfill{observations: make([]operationalValueReportObservation, 0, len(runs))} - cachePath, err := operationalValueReportWeeklyCachePath(cacheRoot, evaluator.Definition.Repository, evaluator.WorkflowID, evaluator.EvaluatorDigest, weekStart) - if err != nil { - return result, err - } - cached := []operationalValueReportObservation(nil) - if !refresh { - var hit bool - cached, hit, err = loadOperationalValueReportWeeklyCache(cachePath, evaluator.Definition.Repository, evaluator.WorkflowID, evaluator.EvaluatorDigest, weekStart) - if err != nil { - return result, err - } - if !hit { - cached = nil - } - } - cachedByRun := make(map[string]operationalValueReportObservation, len(cached)) - for _, observation := range cached { - if observation.Mature && observation.Value != nil && - (observation.Status == "pass" || observation.Status == "fail") && - observation.EvaluatorDigest == evaluator.EvaluatorDigest { - cachedByRun[operationalValueReportObservationKey(observation)] = observation - } - } - weekCache := make(map[string]operationalValueReportObservation, len(cached)+len(runs)) - maps.Copy(weekCache, cachedByRun) - for _, run := range runs { - key := run.ID + ":" + strconv.Itoa(run.Attempt) - if observation, ok := cachedByRun[key]; ok { - result.observations = append(result.observations, observation) - result.stats.CacheHits++ - continue - } - observation := operationalValueReportGradeRun(ctx, evaluator, run, evidenceAt, evaluatorHost) - result.observations = append(result.observations, observation) - result.stats.Evaluated++ - if observation.Mature && (observation.Status == "pass" || observation.Status == "fail") { - weekCache[key] = observation - } - } - cacheObservations := make([]operationalValueReportObservation, 0, len(weekCache)) - for _, observation := range weekCache { - cacheObservations = append(cacheObservations, observation) - } - slices.SortFunc(cacheObservations, func(left, right operationalValueReportObservation) int { - if operationalValueReportRunLess(left.Run, right.Run) { - return -1 - } - if operationalValueReportRunLess(right.Run, left.Run) { - return 1 - } - return 0 - }) - if len(cacheObservations) > 0 { - if err := saveOperationalValueReportWeeklyCache(cachePath, evaluator.Definition.Repository, evaluator.WorkflowID, evaluator.EvaluatorDigest, weekStart, cacheObservations); err != nil { - return result, err - } - } - return result, nil -} - -func operationalValueReportRunLess(left, right operationalValueReportRun) bool { - if !left.CreatedAt.Equal(right.CreatedAt) { - return left.CreatedAt.Before(right.CreatedAt) - } - if left.ID != right.ID { - return left.ID < right.ID - } - return left.Attempt < right.Attempt -} - -func defaultOperationalValueReportCacheRoot() (string, error) { - cacheRoot, err := os.UserCacheDir() - if err != nil { - return "", fmt.Errorf("cannot resolve user cache directory: %w", err) - } - if strings.TrimSpace(cacheRoot) == "" { - return "", errors.New("user cache directory is empty") - } - return filepath.Join(cacheRoot, "gh-aw", "operational-value"), nil -} diff --git a/pkg/cli/graders_operational_value_report_history_test.go b/pkg/cli/graders_operational_value_report_history_test.go deleted file mode 100644 index e47ef0d97cd..00000000000 --- a/pkg/cli/graders_operational_value_report_history_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package cli - -import ( - "context" - "encoding/json" - "strings" - "sync/atomic" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestBackfillOperationalValueReportObservationsUsesWeeklyCache(t *testing.T) { - originalGradeRun := operationalValueReportGradeRun - t.Cleanup(func() { operationalValueReportGradeRun = originalGradeRun }) - - gradeCalls := 0 - operationalValueReportGradeRun = func(_ context.Context, evaluator *operationalValueReportEvaluator, run operationalValueReportRun, _ time.Time, _ string) operationalValueReportObservation { - gradeCalls++ - value := float64(gradeCalls) / 10 - return operationalValueReportObservation{ - Run: run, Value: &value, Status: "pass", Mature: true, - EvidenceAt: "2026-08-31T00:00:00Z", EvidenceCutoff: "2026-08-28T00:00:00Z", - MaturesAt: "2026-08-28T00:00:00Z", EvaluatorDigest: evaluator.EvaluatorDigest, - Source: "evaluator-replay", - } - } - - evaluator := &operationalValueReportEvaluator{ - WorkflowID: "daily-file-diet", EvaluatorDigest: "abc123", - Definition: operationalValueReportDefinition{Repository: "github/gh-aw"}, - } - runs := []operationalValueReportRun{ - {ID: "1", Attempt: 1, CreatedAt: time.Date(2026, 8, 24, 12, 0, 0, 0, time.UTC)}, - {ID: "2", Attempt: 1, CreatedAt: time.Date(2026, 8, 30, 12, 0, 0, 0, time.UTC)}, - } - cacheRoot := t.TempDir() - - first, firstStats, err := backfillOperationalValueReportObservations(context.Background(), evaluator, runs, time.Date(2026, 8, 31, 0, 0, 0, 0, time.UTC), cacheRoot, "", false, 1) - require.NoError(t, err) - require.Len(t, first, 2) - assert.Equal(t, 2, firstStats.Evaluated) - assert.Equal(t, 0, firstStats.CacheHits) - assert.Equal(t, 2, gradeCalls) - - second, secondStats, err := backfillOperationalValueReportObservations(context.Background(), evaluator, runs, time.Date(2026, 9, 7, 0, 0, 0, 0, time.UTC), cacheRoot, "", false, 1) - require.NoError(t, err) - require.Len(t, second, 2) - assert.Equal(t, 0, secondStats.Evaluated) - assert.Equal(t, 2, secondStats.CacheHits) - assert.Equal(t, 2, gradeCalls) - assert.Equal(t, "evaluator-replay", second[0].Source) -} - -func TestBackfillOperationalValueReportObservationsDoesNotCacheNonFinalResults(t *testing.T) { - originalGradeRun := operationalValueReportGradeRun - t.Cleanup(func() { operationalValueReportGradeRun = originalGradeRun }) - - for _, test := range []struct { - name string - status string - mature bool - }{ - {name: "error", status: "error", mature: false}, - {name: "immature", status: "pass", mature: false}, - {name: "unavailable", status: "unavailable", mature: true}, - } { - t.Run(test.name, func(t *testing.T) { - gradeCalls := 0 - operationalValueReportGradeRun = func(_ context.Context, evaluator *operationalValueReportEvaluator, run operationalValueReportRun, _ time.Time, _ string) operationalValueReportObservation { - gradeCalls++ - return operationalValueReportObservation{Run: run, Status: test.status, Mature: test.mature, EvaluatorDigest: evaluator.EvaluatorDigest} - } - evaluator := &operationalValueReportEvaluator{WorkflowID: "daily-file-diet", EvaluatorDigest: "abc123", Definition: operationalValueReportDefinition{Repository: "github/gh-aw"}} - runs := []operationalValueReportRun{{ID: "1", Attempt: 1, CreatedAt: time.Date(2026, 8, 30, 12, 0, 0, 0, time.UTC)}} - cacheRoot := t.TempDir() - - _, _, err := backfillOperationalValueReportObservations(context.Background(), evaluator, runs, time.Now(), cacheRoot, "", false, 1) - require.NoError(t, err) - _, _, err = backfillOperationalValueReportObservations(context.Background(), evaluator, runs, time.Now(), cacheRoot, "", false, 1) - require.NoError(t, err) - assert.Equal(t, 2, gradeCalls) - }) - } -} - -func TestBackfillOperationalValueReportObservationsRunsWeeksConcurrently(t *testing.T) { - originalGradeRun := operationalValueReportGradeRun - t.Cleanup(func() { operationalValueReportGradeRun = originalGradeRun }) - - started := make(chan struct{}, 2) - release := make(chan struct{}) - var active atomic.Int32 - var maximum atomic.Int32 - operationalValueReportGradeRun = func(_ context.Context, evaluator *operationalValueReportEvaluator, run operationalValueReportRun, _ time.Time, _ string) operationalValueReportObservation { - current := active.Add(1) - for current > maximum.Load() && !maximum.CompareAndSwap(maximum.Load(), current) { - } - started <- struct{}{} - <-release - active.Add(-1) - value := 1.0 - return operationalValueReportObservation{Run: run, Value: &value, Status: "pass", Mature: true, EvaluatorDigest: evaluator.EvaluatorDigest} - } - - evaluator := &operationalValueReportEvaluator{WorkflowID: "daily-file-diet", EvaluatorDigest: "abc123", Definition: operationalValueReportDefinition{Repository: "github/gh-aw"}} - runs := []operationalValueReportRun{ - {ID: "1", Attempt: 1, CreatedAt: time.Date(2026, 8, 24, 12, 0, 0, 0, time.UTC)}, - {ID: "2", Attempt: 1, CreatedAt: time.Date(2026, 8, 31, 12, 0, 0, 0, time.UTC)}, - } - done := make(chan error, 1) - go func() { - _, _, err := backfillOperationalValueReportObservations(context.Background(), evaluator, runs, time.Now(), t.TempDir(), "", true, 2) - done <- err - }() - - for range 2 { - select { - case <-started: - case <-time.After(time.Second): - t.Fatal("timed out waiting for concurrent evaluator executions") - } - } - close(release) - require.NoError(t, <-done) - assert.Equal(t, int32(2), maximum.Load()) -} - -func TestListOperationalValueReportRunsPathEscapesWorkflowFile(t *testing.T) { - originalRunGH := operationalValueReportRunGH - t.Cleanup(func() { operationalValueReportRunGH = originalRunGH }) - - operationalValueReportRunGH = func(_ context.Context, _ string, args ...string) ([]byte, error) { - require.Contains(t, args[len(args)-1], "daily%23file.lock.yml") - return []byte(`[{"total_count":1,"workflow_runs":[{"id":42,"run_attempt":1,"html_url":"https://example.test/42","status":"completed","conclusion":"success","created_at":"2026-08-10T00:00:00Z","event":"schedule","head_branch":"main","head_sha":"abc"}]}]`), nil - } - - runs, err := listOperationalValueReportRuns(context.Background(), "github/gh-aw", "github.com", "daily#file.lock.yml", time.Date(2026, 8, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 8, 31, 0, 0, 0, 0, time.UTC)) - require.NoError(t, err) - require.Len(t, runs, 1) - assert.Equal(t, "42", runs[0].ID) -} - -func TestListOperationalValueReportRunsSplitsCreatedWindowAtCap(t *testing.T) { - originalRunGH := operationalValueReportRunGH - t.Cleanup(func() { operationalValueReportRunGH = originalRunGH }) - - seenRanges := make([]string, 0) - operationalValueReportRunGH = func(_ context.Context, _ string, args ...string) ([]byte, error) { - var createdRange string - for index := range len(args) - 1 { - if args[index] == "-f" && strings.HasPrefix(args[index+1], "created=") { - createdRange = strings.TrimPrefix(args[index+1], "created=") - break - } - } - require.NotEmpty(t, createdRange) - seenRanges = append(seenRanges, createdRange) - - switch createdRange { - case "2026-08-01T00:00:00Z..2026-08-03T00:00:00Z": - return []byte(`[{"total_count":1000,"workflow_runs":[]}]`), nil - case "2026-08-01T00:00:00Z..2026-08-02T00:00:00Z": - return []byte(`[{"total_count":2,"workflow_runs":[{"id":1,"run_attempt":1,"html_url":"https://example.test/1","status":"completed","conclusion":"success","created_at":"2026-08-01T00:00:00Z","event":"schedule","head_branch":"main","head_sha":"a"}]}]`), nil - case "2026-08-02T00:00:00Z..2026-08-03T00:00:00Z": - return []byte(`[{"total_count":1,"workflow_runs":[{"id":2,"run_attempt":1,"html_url":"https://example.test/2","status":"completed","conclusion":"success","created_at":"2026-08-03T00:00:00Z","event":"schedule","head_branch":"main","head_sha":"b"}]}]`), nil - default: - return []byte(`[{"total_count":0,"workflow_runs":[]}]`), nil - } - } - - runs, err := listOperationalValueReportRuns(context.Background(), "github/gh-aw", "github.com", "daily-file-diet.lock.yml", time.Date(2026, 8, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 8, 3, 0, 0, 0, 0, time.UTC)) - require.NoError(t, err) - require.Len(t, runs, 2) - assert.Equal(t, "1", runs[0].ID) - assert.Equal(t, "2", runs[1].ID) - - payload, err := json.Marshal(seenRanges) - require.NoError(t, err) - assert.Contains(t, string(payload), "2026-08-01T00:00:00Z..2026-08-03T00:00:00Z") - assert.Contains(t, string(payload), "2026-08-01T00:00:00Z..2026-08-02T00:00:00Z") - assert.Contains(t, string(payload), "2026-08-02T00:00:00Z..2026-08-03T00:00:00Z") -} diff --git a/pkg/cli/graders_operational_value_report_render.go b/pkg/cli/graders_operational_value_report_render.go deleted file mode 100644 index a7eddf45958..00000000000 --- a/pkg/cli/graders_operational_value_report_render.go +++ /dev/null @@ -1,460 +0,0 @@ -package cli - -import ( - "encoding/json" - "fmt" - "html" - "math" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/github/gh-aw/pkg/constants" -) - -type operationalValueReportArtifactPaths struct { - JSON string `json:"json"` - SVG string `json:"svg"` - Markdown string `json:"markdown"` -} - -func writeOperationalValueReportArtifacts(report operationalValueReport, outputDir string) (operationalValueReportArtifactPaths, error) { - if err := os.MkdirAll(outputDir, constants.DirPermPublic); err != nil { - return operationalValueReportArtifactPaths{}, fmt.Errorf("cannot create operational-value report directory: %w", err) - } - base := report.WorkflowID + "-operational-value" - paths := operationalValueReportArtifactPaths{ - JSON: filepath.Join(outputDir, base+".json"), SVG: filepath.Join(outputDir, base+".svg"), Markdown: filepath.Join(outputDir, base+".md"), - } - jsonData, err := marshalIndentJSONOrWrap(report, "operational-value report") - if err != nil { - return operationalValueReportArtifactPaths{}, err - } - svgData := renderOperationalValueReportSVG(report) - markdownData := renderOperationalValueReportMarkdown(report, filepath.Base(paths.JSON), filepath.Base(paths.SVG)) - for path, data := range map[string][]byte{paths.JSON: jsonData, paths.SVG: svgData, paths.Markdown: markdownData} { - if err := writeFileAtomically(path, data); err != nil { - return operationalValueReportArtifactPaths{}, fmt.Errorf("cannot write operational-value report %s: %w", path, err) - } - } - return paths, nil -} - -func renderOperationalValueReportSVG(report operationalValueReport) []byte { //nolint:largefunc // SVG emission preserves deterministic visual element ordering. - const left, right = 120.0, 1160.0 - const outcomeTop = 245.0 - const primaryTop, primaryBottom = 730.0, 840.0 - hasDiagnostics := len(report.Diagnostics) > 0 - outcomeBottom := 555.0 - if !hasDiagnostics { - outcomeBottom = primaryBottom - } - changeExtent := 1.0 - if hasDiagnostics { - changeExtent = operationalValueReportChangeExtent(report) - } - start, _ := time.Parse(time.RFC3339, report.Window.StartAt) - end, _ := time.Parse(time.RFC3339, report.Window.EndAt) - span := end.Sub(start).Seconds() - if span <= 0 { - span = 1 - } - xFor := func(value time.Time) float64 { - position := value.Sub(start).Seconds() / span - return left + max(0, min(1, position))*(right-left) - } - outcomeYFor := func(value float64) float64 { - if hasDiagnostics { - return outcomeTop + (changeExtent-value)/(2*changeExtent)*(outcomeBottom-outcomeTop) - } - return outcomeBottom - value*(outcomeBottom-outcomeTop) - } - primaryYFor := func(value float64) float64 { return primaryBottom - value*(primaryBottom-primaryTop) } - var svg strings.Builder - headlineChange := operationalValueReportHeadlineChange(report) - svg.WriteString(`` + "\n") - fmt.Fprintf(&svg, "%s operational value over time\n", html.EscapeString(report.WorkflowName)) - fmt.Fprintf(&svg, "Outcome changes relative to the first post-adoption observation and a separate weekly per-run attainment trend under evaluator %s.\n", html.EscapeString(shortOperationalValueDigest(report.Evaluator.SHA256))) - svg.WriteString(`` + "\n") - svg.WriteString(`` + "\n") - fmt.Fprintf(&svg, "%s\n", html.EscapeString(report.WorkflowName)) - fmt.Fprintf(&svg, "%s\n", operationalValueReportTrendClass(headlineChange), html.EscapeString(operationalValueReportTrendHeadline(report))) - fmt.Fprintf(&svg, "%d runs · evaluator %s\n", report.Coverage.RunCount, html.EscapeString(shortOperationalValueDigest(report.Evaluator.SHA256))) - for index, diagnostic := range report.Diagnostics { - if index >= 2 || diagnostic.Summary.First == nil || diagnostic.Summary.Latest == nil { - continue - } - x := 120.0 + float64(index)*520 - fmt.Fprintf(&svg, "%s\n", x, html.EscapeString(diagnostic.Metric.Name)) - fmt.Fprintf(&svg, "%s → %s\n", x, formatOperationalValuePercent(*diagnostic.Summary.First), formatOperationalValuePercent(*diagnostic.Summary.Latest)) - if diagnostic.Summary.Change != nil { - fmt.Fprintf(&svg, "%s since adoption\n", x, operationalValueReportTrendClass(diagnostic.Summary.Change), formatOperationalValuePointChange(*diagnostic.Summary.Change)) - } - } - if !hasDiagnostics && report.Summary.First != nil && report.Summary.Latest != nil { - fmt.Fprintf(&svg, "Primary operational attainment\n") - fmt.Fprintf(&svg, "%s → %s\n", formatOperationalValuePercent(*report.Summary.First), formatOperationalValuePercent(*report.Summary.Latest)) - if report.Summary.Change != nil { - fmt.Fprintf(&svg, "%s since adoption\n", operationalValueReportTrendClass(report.Summary.Change), formatOperationalValuePointChange(*report.Summary.Change)) - } - } - sectionTitle := "Outcome change since adoption" - sectionDescription := "Percentage-point change from each metric's first observed value" - if !hasDiagnostics { - sectionTitle = "Operational attainment" - sectionDescription = "Weekly primary mean · higher is better" - } - fmt.Fprintf(&svg, "%s\n", sectionTitle) - fmt.Fprintf(&svg, "%s\n", sectionDescription) - if hasDiagnostics { - zeroY := outcomeYFor(0) - fmt.Fprintf(&svg, "\n", left, outcomeTop, right-left, zeroY-outcomeTop, left, zeroY, right-left, outcomeBottom-zeroY) - } - for index := range 5 { - value := float64(index) / 4 - label := fmt.Sprintf("%.0f%%", value*100) - if hasDiagnostics { - value = changeExtent - float64(index)*changeExtent/2 - label = formatOperationalValueAxisPointChange(value) - } - y := outcomeYFor(value) - fmt.Fprintf(&svg, "%s\n", left, y, right, y, y+5, label) - } - for index := range 7 { - at := start.Add(time.Duration(float64(end.Sub(start)) * float64(index) / 6)) - x := xFor(at) - fmt.Fprintf(&svg, "%s\n", x, outcomeTop, x, outcomeBottom, x, outcomeBottom+27, at.Format("Jan 02")) - } - fmt.Fprintf(&svg, "Adoption\n", left, outcomeTop, left, outcomeBottom, left+8) - if hasDiagnostics { - zeroY := outcomeYFor(0) - fmt.Fprintf(&svg, "0 pts = first observed value\n", left, zeroY, right, zeroY, right-8, zeroY-9) - } - if hasDiagnostics && report.Diagnostics[0].Summary.First != nil { - diagnostic := report.Diagnostics[0] - points := make([]string, 0, len(diagnostic.Weekly)+2) - hasGain, hasLoss := false, false - var firstX, lastX float64 - for _, week := range diagnostic.Weekly { - if week.Value == nil { - continue - } - weekStart, _ := time.Parse(time.RFC3339, week.WeekStart) - weekEnd, _ := time.Parse(time.RFC3339, week.WeekEnd) - x := xFor(weekStart.Add(weekEnd.Sub(weekStart) / 2)) - if len(points) == 0 { - firstX = x - } - lastX = x - change := *week.Value - *diagnostic.Summary.First - hasGain = hasGain || change > 0 - hasLoss = hasLoss || change < 0 - points = append(points, fmt.Sprintf("%.1f,%.1f", x, outcomeYFor(change))) - } - if len(points) > 1 { - zeroY := outcomeYFor(0) - fmt.Fprintf(&svg, "\n", left, outcomeTop, right-left, zeroY-outcomeTop, left, zeroY, right-left, outcomeBottom-zeroY) - areaPoints := fmt.Sprintf("%.1f,%.1f %s %.1f,%.1f", firstX, zeroY, strings.Join(points, " "), lastX, zeroY) - if hasGain { - fmt.Fprintf(&svg, "Gain from adoption for %s\n", areaPoints, html.EscapeString(diagnostic.Metric.Name)) - } - if hasLoss { - fmt.Fprintf(&svg, "Loss from adoption for %s\n", areaPoints, html.EscapeString(diagnostic.Metric.Name)) - } - } - } - for index, diagnostic := range report.Diagnostics { - points := make([]string, 0, len(diagnostic.Weekly)) - var firstX, firstY, lastX, lastY, lastChange float64 - if diagnostic.Summary.First == nil { - continue - } - for _, week := range diagnostic.Weekly { - if week.Value == nil { - continue - } - weekStart, _ := time.Parse(time.RFC3339, week.WeekStart) - weekEnd, _ := time.Parse(time.RFC3339, week.WeekEnd) - x := xFor(weekStart.Add(weekEnd.Sub(weekStart) / 2)) - lastChange = *week.Value - *diagnostic.Summary.First - y := outcomeYFor(lastChange) - if len(points) == 0 { - firstX, firstY = x, y - } - lastX, lastY = x, y - points = append(points, fmt.Sprintf("%.1f,%.1f", x, y)) - } - if len(points) > 1 { - fmt.Fprintf(&svg, "\n", index%4+1, strings.Join(points, " ")) - fmt.Fprintf(&svg, "\n", index%4+1, firstX, firstY, index%4+1, lastX, lastY) - labelY := max(outcomeTop+18, min(outcomeBottom-8, lastY-10)) - fmt.Fprintf(&svg, "%s\n", lastX-10, labelY, index%4+1, formatOperationalValuePointChange(lastChange)) - } - } - if !hasDiagnostics { - points := make([]string, 0, len(report.Weekly)) - for _, week := range report.Weekly { - if week.Mean == nil { - continue - } - weekStart, _ := time.Parse(time.RFC3339, week.WeekStart) - weekEnd, _ := time.Parse(time.RFC3339, week.WeekEnd) - x := xFor(weekStart.Add(weekEnd.Sub(weekStart) / 2)) - points = append(points, fmt.Sprintf("%.1f,%.1f", x, outcomeYFor(*week.Mean))) - } - if len(points) > 1 { - fmt.Fprintf(&svg, "\n", strings.Join(points, " ")) - } - } - for index, diagnostic := range report.Diagnostics { - x := 130.0 + float64(index%2)*530 - fmt.Fprintf(&svg, "%s\n", index%4+1, x, x+36, x+48, html.EscapeString(diagnostic.Metric.Name)) - } - if hasDiagnostics { - fmt.Fprintf(&svg, "Per-run operational attainment\n") - fmt.Fprintf(&svg, "Weekly values (thin) · 4-week rolling mean (bold) · separate from repository health\n") - for index := range 3 { - value := float64(index) / 2 - y := primaryYFor(value) - fmt.Fprintf(&svg, "%.0f%%\n", left, y, right, y, y+5, value*100) - } - primaryPoints := make([]string, 0, len(report.Weekly)) - trendPoints := make([]string, 0, len(report.Weekly)) - var lastTrendX, lastTrendY, lastTrendValue float64 - for weekIndex, week := range report.Weekly { - if week.Mean == nil { - continue - } - weekStart, _ := time.Parse(time.RFC3339, week.WeekStart) - weekEnd, _ := time.Parse(time.RFC3339, week.WeekEnd) - x := xFor(weekStart.Add(weekEnd.Sub(weekStart) / 2)) - primaryPoints = append(primaryPoints, fmt.Sprintf("%.1f,%.1f", x, primaryYFor(*week.Mean))) - windowStart := max(0, weekIndex-3) - total, count := 0.0, 0 - for previousIndex := windowStart; previousIndex <= weekIndex; previousIndex++ { - if report.Weekly[previousIndex].Mean != nil { - total += *report.Weekly[previousIndex].Mean - count++ - } - } - if count > 0 { - lastTrendX = x - lastTrendValue = total / float64(count) - lastTrendY = primaryYFor(lastTrendValue) - trendPoints = append(trendPoints, fmt.Sprintf("%.1f,%.1f", lastTrendX, lastTrendY)) - } - } - if len(primaryPoints) > 1 { - fmt.Fprintf(&svg, "\n", strings.Join(primaryPoints, " ")) - } - if len(trendPoints) > 1 { - fmt.Fprintf(&svg, "\n", strings.Join(trendPoints, " ")) - labelY := max(primaryTop+15, min(primaryBottom-6, lastTrendY-8)) - fmt.Fprintf(&svg, "4-week avg %s\n", lastTrendX-8, labelY, formatOperationalValuePercent(lastTrendValue)) - } - } - fmt.Fprintf(&svg, "Observed association only; the report does not establish that the workflow caused these changes.\n") - svg.WriteString("\n") - return []byte(svg.String()) -} - -func renderOperationalValueReportMarkdown(report operationalValueReport, jsonName, svgName string) []byte { //nolint:largefunc // Markdown emission preserves deterministic report section ordering. - var markdown strings.Builder - fmt.Fprintf(&markdown, "# %s operational value\n\n", sanitizeOperationalValueMarkdown(report.WorkflowName)) - fmt.Fprintf(&markdown, "![%s operational value timeline](%s)\n\n", sanitizeOperationalValueMarkdown(report.WorkflowName), svgName) - markdown.WriteString("## Summary\n\n") - fmt.Fprintf(&markdown, "- **Operational value:** %s\n", sanitizeOperationalValueMarkdown(report.OperationalValue)) - fmt.Fprintf(&markdown, "- **History:** %s through %s\n", report.Window.StartAt, report.Window.EndAt) - fmt.Fprintf(&markdown, "- **Coverage:** %d of %d runs produced numeric values; %d unavailable; %d errors\n", report.Coverage.NumericCount, report.Coverage.RunCount, report.Coverage.UnavailableCount, report.Coverage.ErrorCount) - fmt.Fprintf(&markdown, "- **Current evaluator:** `%s`\n", report.Evaluator.SHA256) - fmt.Fprintf(&markdown, "- **Weekly cache:** %d hits; %d runs evaluated in this invocation\n", report.Coverage.WeeklyCacheHits, report.Coverage.EvaluatedCount) - if report.Summary.Latest != nil { - fmt.Fprintf(&markdown, "- **Latest value:** %s", formatOperationalValue(*report.Summary.Latest)) - if report.Summary.Change != nil { - fmt.Fprintf(&markdown, " (%s from the first numeric observation)", formatSignedOperationalValue(*report.Summary.Change)) - } - markdown.WriteString("\n") - } - if report.Baseline.Value != nil { - fmt.Fprintf(&markdown, "- **Frozen baseline:** %s", formatOperationalValue(*report.Baseline.Value)) - if report.Summary.LatestDeltaFromBaseline != nil { - fmt.Fprintf(&markdown, " (latest delta %s)", formatSignedOperationalValue(*report.Summary.LatestDeltaFromBaseline)) - } - markdown.WriteString("\n") - } - for _, diagnostic := range report.Diagnostics { - if diagnostic.Summary.Latest == nil { - continue - } - fmt.Fprintf(&markdown, "- **Diagnostic, %s:** %s", sanitizeOperationalValueMarkdown(diagnostic.Metric.Name), formatOperationalValue(*diagnostic.Summary.Latest)) - if diagnostic.Summary.Change != nil { - fmt.Fprintf(&markdown, " (%s across observed runs)", formatSignedOperationalValue(*diagnostic.Summary.Change)) - } - markdown.WriteString("\n") - } - fmt.Fprintf(&markdown, "- **Structured report:** [%s](%s)\n\n", jsonName, jsonName) - - markdown.WriteString("## Weekly History\n\n") - markdown.WriteString("| Week | Runs | Distinct opportunities | Primary mean | Primary range") - for _, diagnostic := range report.Diagnostics { - fmt.Fprintf(&markdown, " | %s", sanitizeOperationalValueMarkdown(diagnostic.Metric.Name)) - } - markdown.WriteString(" |\n|---|---:|---:|---:|---:") - for range report.Diagnostics { - markdown.WriteString("|---:") - } - markdown.WriteString("|\n") - for weekIndex, week := range report.Weekly { - mean, valueRange := "missing", "missing" - if week.Mean != nil { - mean = formatOperationalValue(*week.Mean) - valueRange = formatOperationalValue(*week.Minimum) + "-" + formatOperationalValue(*week.Maximum) - } - fmt.Fprintf(&markdown, "| %s | %d | %d | %s | %s", strings.TrimSuffix(week.WeekStart, "T00:00:00Z"), week.RunCount, week.DistinctOpportunityCount, mean, valueRange) - for _, diagnostic := range report.Diagnostics { - value := "missing" - if weekIndex < len(diagnostic.Weekly) && diagnostic.Weekly[weekIndex].Value != nil { - value = formatOperationalValue(*diagnostic.Weekly[weekIndex].Value) - } - fmt.Fprintf(&markdown, " | %s", value) - } - markdown.WriteString(" |\n") - } - - markdown.WriteString("\n## Frozen Contract\n\n") - fmt.Fprintf(&markdown, "- **Opportunity:** %s\n", sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().Evidence.Opportunity)) - fmt.Fprintf(&markdown, "- **Assignment:** %s\n", sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().Evidence.Assignment)) - fmt.Fprintf(&markdown, "- **Accepted evidence:** %s\n", sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().Evidence.Accepted)) - fmt.Fprintf(&markdown, "- **Collection:** %s\n", sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().Evidence.Collection)) - fmt.Fprintf(&markdown, "- **Maturation:** %s\n", sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().Evidence.Maturation)) - fmt.Fprintf(&markdown, "- **Zero rule:** %s\n", sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().Evidence.ZeroRule)) - fmt.Fprintf(&markdown, "- **Missing rule:** %s\n", sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().Evidence.MissingRule)) - fmt.Fprintf(&markdown, "- **Primary metric:** `%s` = %s\n", report.EvaluatorDefinition().PrimaryMetric.ID, sanitizeOperationalValueMarkdown(report.EvaluatorDefinition().PrimaryMetric.Formula)) - for _, metric := range report.EvaluatorDefinition().DiagnosticMetrics { - fmt.Fprintf(&markdown, "- **Diagnostic metric:** `%s` (%s) = %s\n", metric.ID, metric.Aggregation, sanitizeOperationalValueMarkdown(metric.Formula)) - } - - markdown.WriteString("\n## Coverage Notes\n\n") - fmt.Fprintf(&markdown, "%d distinct opportunity keys were observed; %d additional numeric observations repeated a key. Repeated observations remain visible in the plot but are not treated as independent within a weekly mean.\n\n", report.Coverage.DistinctOpportunityCount, report.Coverage.DuplicateOpportunityCount) - if report.Coverage.ErrorCount > 0 { - markdown.WriteString("### Evaluation Errors\n\n") - for _, observation := range report.Observations { - if observation.Status == "error" { - fmt.Fprintf(&markdown, "- Run `%s`: %s\n", observation.Run.ID, sanitizeOperationalValueMarkdown(observation.Message)) - } - } - markdown.WriteString("\n") - } - markdown.WriteString("## Interpretation\n\n") - markdown.WriteString(report.Caveat + " Diagnostic metrics provide context but are not combined with the primary value. Pre-grader runs have no archived case or event payload, so their cases are reconstructed only when the evaluator supports assignment from the run subject. Missing evidence is never treated as zero.\n") - return []byte(markdown.String()) -} - -func (report operationalValueReport) EvaluatorDefinition() operationalValueReportDefinition { - var definition operationalValueReportDefinition - if err := json.Unmarshal(report.Evaluator.Definition, &definition); err != nil { - return operationalValueReportDefinition{} - } - return definition -} - -func sanitizeOperationalValueMarkdown(value string) string { - return strings.TrimSpace(strings.NewReplacer("\r", " ", "\n", " ", "|", "\\|").Replace(value)) -} - -func formatOperationalValue(value float64) string { - return strconv.FormatFloat(math.Round(value*10000)/10000, 'f', -1, 64) -} - -func formatOperationalValuePercent(value float64) string { - return strconv.FormatFloat(math.Round(value*1000)/10, 'f', 1, 64) + "%" -} - -func formatOperationalValuePointChange(value float64) string { - points := math.Round(value*1000) / 10 - if points > 0 { - return "+" + strconv.FormatFloat(points, 'f', 1, 64) + " pts" - } - return strconv.FormatFloat(points, 'f', 1, 64) + " pts" -} - -func formatOperationalValueAxisPointChange(value float64) string { - points := math.Round(value*1000) / 10 - if math.Abs(points) < 0.05 { - return "0 pts" - } - if points > 0 { - return "+" + strconv.FormatFloat(points, 'f', -1, 64) + " pts" - } - return strconv.FormatFloat(points, 'f', -1, 64) + " pts" -} - -func operationalValueReportChangeExtent(report operationalValueReport) float64 { - maximumChange := 0.0 - for _, diagnostic := range report.Diagnostics { - if diagnostic.Summary.First == nil { - continue - } - for _, week := range diagnostic.Weekly { - if week.Value != nil { - maximumChange = max(maximumChange, math.Abs(*week.Value-*diagnostic.Summary.First)) - } - } - } - return max(0.1, min(1, math.Ceil(maximumChange*10)/10)) -} - -func operationalValueReportTrendHeadline(report operationalValueReport) string { - if len(report.Diagnostics) == 0 { - return operationalValueReportTrendStatement("Operational attainment", report.Summary.Change) - } - diagnostic := report.Diagnostics[0] - return operationalValueReportTrendStatement(diagnostic.Metric.Name, diagnostic.Summary.Change) -} - -func operationalValueReportTrendStatement(name string, change *float64) string { - if change == nil { - return name + " since adoption" - } - switch { - case *change > 0.005: - return name + " improved since adoption" - case *change < -0.005: - return name + " declined since adoption" - default: - return name + " held steady since adoption" - } -} - -func operationalValueReportHeadlineChange(report operationalValueReport) *float64 { - if len(report.Diagnostics) > 0 { - return report.Diagnostics[0].Summary.Change - } - return report.Summary.Change -} - -func operationalValueReportTrendClass(change *float64) string { - if change == nil || math.Abs(*change) <= 0.005 { - return "neutral" - } - if *change > 0 { - return "good" - } - return "bad" -} - -func formatSignedOperationalValue(value float64) string { - if value > 0 { - return "+" + formatOperationalValue(value) - } - return formatOperationalValue(value) -} - -func shortOperationalValueDigest(value string) string { - if len(value) <= 12 { - return value - } - return value[:12] -} diff --git a/pkg/cli/graders_operational_value_report_types.go b/pkg/cli/graders_operational_value_report_types.go deleted file mode 100644 index e1f52724d27..00000000000 --- a/pkg/cli/graders_operational_value_report_types.go +++ /dev/null @@ -1,193 +0,0 @@ -package cli - -import ( - "encoding/json" - "strconv" - "time" -) - -const operationalValueReportSchemaVersion = 1 - -type operationalValueReportRun struct { - ID string `json:"id"` - Attempt int `json:"attempt"` - CreatedAt time.Time `json:"createdAt"` - Conclusion string `json:"conclusion"` - URL string `json:"url"` - SHA string `json:"sha"` - Ref string `json:"ref"` - EventName string `json:"eventName"` -} - -type operationalValueReportDefinition struct { - SchemaVersion int `json:"schemaVersion"` - Grader string `json:"grader"` - Repository string `json:"repository"` - WorkflowName string `json:"workflowName"` - SourcePath string `json:"sourcePath"` - Adoption operationalValueReportAdoption `json:"adoption"` - OperationalValue string `json:"operationalValue"` - Evidence operationalValueReportEvidence `json:"evidence"` - PrimaryMetric operationalValueReportMetric `json:"primaryMetric"` - DiagnosticMetrics []operationalValueReportDiagnosticMetric `json:"diagnosticMetrics,omitempty"` - Baseline operationalValueReportBaseline `json:"baseline"` - Raw json.RawMessage `json:"-"` -} - -type operationalValueReportAdoption struct { - Commit string `json:"commit"` - AdoptedAt string `json:"adoptedAt"` -} - -type operationalValueReportEvidence struct { - Opportunity string `json:"opportunity"` - Assignment string `json:"assignment"` - Accepted string `json:"accepted"` - Repositories []string `json:"repositories"` - Collection string `json:"collection"` - Maturation string `json:"maturation"` - ZeroRule string `json:"zeroRule"` - MissingRule string `json:"missingRule"` -} - -type operationalValueReportMetric struct { - ID string `json:"id"` - Formula string `json:"formula"` - Direction string `json:"direction"` -} - -type operationalValueReportDiagnosticMetric struct { - ID string `json:"id"` - Name string `json:"name"` - Formula string `json:"formula"` - Direction string `json:"direction"` - Aggregation string `json:"aggregation"` -} - -type operationalValueReportBaseline struct { - Mode string `json:"mode"` - Value *float64 `json:"value"` - EvidenceCutoff *string `json:"evidenceCutoff"` - Provenance []map[string]any `json:"provenance"` -} - -type operationalValueReportEvaluator struct { - WorkflowID string - WorkflowPath string - EvaluatorRun string - EvaluatorPath string - EvaluatorContent string - EvaluatorDigest string - cleanup func() - Definition operationalValueReportDefinition - GraderName string - GraderUnit string - GraderDirection string - GraderThreshold *float64 - GraderConfig map[string]any -} - -type operationalValueReport struct { - SchemaVersion int `json:"schemaVersion"` - GeneratedAt string `json:"generatedAt"` - Repository string `json:"repository"` - WorkflowID string `json:"workflowId"` - WorkflowName string `json:"workflowName"` - SourcePath string `json:"sourcePath"` - OperationalValue string `json:"operationalValue"` - Window operationalValueReportWindow `json:"window"` - Evaluator operationalValueReportEvaluatorReference `json:"evaluator"` - Baseline operationalValueReportBaseline `json:"baseline"` - Coverage operationalValueReportCoverage `json:"coverage"` - Summary operationalValueReportSummary `json:"summary"` - Weekly []operationalValueReportWeek `json:"weekly"` - Diagnostics []operationalValueReportDiagnosticSeries `json:"diagnostics,omitempty"` - Observations []operationalValueReportObservation `json:"observations"` - Caveat string `json:"caveat"` -} - -type operationalValueReportWindow struct { - StartAt string `json:"startAt"` - EndAt string `json:"endAt"` -} - -type operationalValueReportEvaluatorReference struct { - Path string `json:"path"` - SHA256 string `json:"sha256"` - Definition json.RawMessage `json:"definition"` -} - -type operationalValueReportCoverage struct { - RunCount int `json:"runCount"` - NumericCount int `json:"numericCount"` - MatureCount int `json:"matureCount"` - UnavailableCount int `json:"unavailableCount"` - ErrorCount int `json:"errorCount"` - DistinctOpportunityCount int `json:"distinctOpportunityCount"` - DuplicateOpportunityCount int `json:"duplicateOpportunityCount"` - WeeklyCacheHits int `json:"weeklyCacheHits"` - EvaluatedCount int `json:"evaluatedCount"` -} - -type operationalValueReportSummary struct { - Mean *float64 `json:"mean"` - Median *float64 `json:"median"` - Minimum *float64 `json:"minimum"` - Maximum *float64 `json:"maximum"` - First *float64 `json:"first"` - Latest *float64 `json:"latest"` - Change *float64 `json:"change"` - LatestDeltaFromBaseline *float64 `json:"latestDeltaFromBaseline"` -} - -type operationalValueReportWeek struct { - WeekStart string `json:"weekStart"` - WeekEnd string `json:"weekEnd"` - RunCount int `json:"runCount"` - NumericCount int `json:"numericCount"` - DistinctOpportunityCount int `json:"distinctOpportunityCount"` - Mean *float64 `json:"mean"` - Minimum *float64 `json:"minimum"` - Maximum *float64 `json:"maximum"` -} - -type operationalValueReportDiagnosticSeries struct { - Metric operationalValueReportDiagnosticMetric `json:"metric"` - Summary operationalValueReportSummary `json:"summary"` - Weekly []operationalValueReportDiagnosticWeek `json:"weekly"` -} - -type operationalValueReportDiagnosticWeek struct { - WeekStart string `json:"weekStart"` - WeekEnd string `json:"weekEnd"` - NumericCount int `json:"numericCount"` - Value *float64 `json:"value"` -} - -type operationalValueReportObservation struct { - ID string `json:"id"` - Run operationalValueReportRun `json:"run"` - Value *float64 `json:"value"` - Status string `json:"status"` - Message string `json:"message,omitempty"` - OpportunityKey string `json:"opportunityKey"` - EvidenceAt string `json:"evidenceAt"` - EvidenceCutoff string `json:"evidenceCutoff"` - MaturesAt string `json:"maturesAt"` - Mature bool `json:"mature"` - Case map[string]any `json:"case"` - Provenance []map[string]any `json:"provenance"` - Diagnostics map[string]any `json:"diagnostics,omitempty"` - BaselineValue *float64 `json:"baselineValue"` - DeltaFromBaseline *float64 `json:"deltaFromBaseline"` - EvaluatorDigest string `json:"evaluatorDigest"` - Source string `json:"source"` -} - -func operationalValueReportObservationKey(observation operationalValueReportObservation) string { - return observation.Run.ID + ":" + strconv.Itoa(observation.Run.Attempt) -} - -func operationalValueReportObservationID(repository, workflowID string, observation operationalValueReportObservation) string { - return repository + ":" + workflowID + ":" + operationalValueReportObservationKey(observation) + ":" + observation.EvaluatorDigest -} diff --git a/pkg/cli/graders_run.go b/pkg/cli/graders_run.go index 2233b8874b9..d60c5ba4116 100644 --- a/pkg/cli/graders_run.go +++ b/pkg/cli/graders_run.go @@ -8,13 +8,20 @@ import ( "errors" "fmt" "io" + "net/url" "os" "os/exec" + "path" + "path/filepath" "slices" "strconv" + "strings" "time" + "unicode/utf8" "github.com/github/gh-aw/pkg/constants" + "github.com/github/gh-aw/pkg/fileutil" + "github.com/github/gh-aw/pkg/gitutil" "github.com/github/gh-aw/pkg/parser" "github.com/github/gh-aw/pkg/repoutil" "github.com/github/gh-aw/pkg/stringutil" @@ -22,8 +29,12 @@ import ( ) const ( - maxGraderPayloadBytes = 50 * 1024 * 1024 - graderJSTimeout = 7 * time.Second + maxGraderPayloadBytes = 50 * 1024 * 1024 + maxOperationalValueEvaluatorBytes = 64 * 1024 + maxOperationalValueOutputBytes = 1024 * 1024 + graderJSTimeout = 7 * time.Second + operationalValueEvaluatorTimeout = 2 * time.Minute + operationalValueSyntaxTimeout = 5 * time.Second ) //go:embed graders_run.cjs @@ -46,6 +57,7 @@ type graderRunDefinition struct { Direction string `json:"direction"` Threshold *float64 `json:"threshold"` Config map[string]any `json:"config,omitempty"` + Run string `json:"-"` Script string `json:"script,omitempty"` Digest string `json:"digest,omitempty"` } @@ -55,6 +67,9 @@ func runGrader(ctx context.Context, config graderRunConfig) error { if err != nil { return err } + if grader.Source == "operational-value" && config.RunID != 0 { + return errors.New("operational-value graders require a JSON request on standard input; historical replay is not supported") + } payload, err := loadGraderRunPayload(ctx, config) if err != nil { return err @@ -68,7 +83,7 @@ func runGrader(ctx context.Context, config graderRunConfig) error { evaluatorHost = stringutil.NormalizeGitHubHostURL(host) } } - return runOperationalValuePayload(ctx, config.Workflow, payload, config.Output, evaluatorHost) + return runOperationalValuePayload(ctx, config.Workflow, grader, payload, config.Output, evaluatorHost) } return runJavaScriptGrader(ctx, grader, payload, config.Output) } @@ -112,6 +127,7 @@ func loadGraderRunDefinition(workflowArg, graderID string) (graderRunDefinition, Direction: definition.Direction, Threshold: definition.Threshold, Config: definition.Config, + Run: definition.Run, Script: definition.Script, Digest: definition.ScriptDigest(), }, nil @@ -215,7 +231,7 @@ func runJavaScriptGrader(ctx context.Context, grader graderRunDefinition, payloa cmd := exec.CommandContext(commandCtx, nodePath, scriptPath) cmd.Stdin = bytes.NewReader(input) cmd.Stdout = output - stderr := &boundedCommandBuffer{limit: maxOperationalValueRegradeOutputBytes} + stderr := &boundedCommandBuffer{limit: maxOperationalValueOutputBytes} cmd.Stderr = stderr if err := cmd.Run(); err != nil { if errors.Is(commandCtx.Err(), context.DeadlineExceeded) { @@ -229,24 +245,195 @@ func runJavaScriptGrader(ctx context.Context, grader graderRunDefinition, payloa return nil } -func runOperationalValuePayload(ctx context.Context, workflowArg string, payload json.RawMessage, output io.Writer, evaluatorHost string) error { - evaluator, err := loadOperationalValueReportEvaluator(ctx, workflowArg, evaluatorHost) +func runOperationalValuePayload(ctx context.Context, workflowArg string, grader graderRunDefinition, payload json.RawMessage, output io.Writer, evaluatorHost string) error { + evaluatorContent, err := loadOperationalValueEvaluatorContent(workflowArg, grader) if err != nil { return err } - defer evaluator.cleanup() - result, err := runOperationalValueEvaluatorBash(ctx, "/bin/bash", evaluator.EvaluatorPath, - []string{evaluator.EvaluatorPath, "--grade-run"}, payload, operationalValueEvaluatorTimeout, evaluatorHost) + tempDir, err := os.MkdirTemp("", "gh-aw-operational-value-evaluator-*") + if err != nil { + return fmt.Errorf("failed to stage operational-value evaluator: %w", err) + } + defer os.RemoveAll(tempDir) + evaluatorPath := filepath.Join(tempDir, "operational-value.sh") + if err := os.WriteFile(evaluatorPath, evaluatorContent, constants.FilePermExecutable); err != nil { + return fmt.Errorf("failed to stage operational-value evaluator: %w", err) + } + if _, err := runOperationalValueEvaluatorBash(ctx, evaluatorPath, []string{"-n", evaluatorPath}, nil, operationalValueSyntaxTimeout, evaluatorHost); err != nil { + return fmt.Errorf("operational-value evaluator has invalid Bash syntax: %w", err) + } + result, err := runOperationalValueEvaluatorBash(ctx, evaluatorPath, []string{evaluatorPath}, payload, operationalValueEvaluatorTimeout, evaluatorHost) if err != nil { - return fmt.Errorf("operational-value evaluator --grade-run failed: %w", err) + return fmt.Errorf("operational-value evaluator failed: %w", err) } - if !json.Valid(result) { - return errors.New("operational-value evaluator returned invalid JSON") + if err := validateOperationalValueMetrics(result); err != nil { + return err } _, err = fmt.Fprintln(output, string(result)) return err } +func loadOperationalValueEvaluatorContent(workflowArg string, grader graderRunDefinition) ([]byte, error) { + if grader.Script != "" { + return validateOperationalValueEvaluatorSource([]byte(grader.Script)) + } + workflowPath, err := ResolveWorkflowPath(workflowArg) + if err != nil { + return nil, err + } + repoRoot, err := gitutil.FindGitRootFrom(filepath.Dir(workflowPath)) + if err != nil { + return nil, errors.New("cannot resolve operational-value evaluator outside a Git repository") + } + evaluatorPath := workflow.ResolveOperationalValueEvaluatorPath(repoRoot, workflowPath, grader.Run) + if err := fileutil.ValidatePathWithinBase(repoRoot, evaluatorPath); err != nil { + return nil, errors.New("operational-value evaluator escapes the Git repository") + } + info, err := os.Lstat(evaluatorPath) + if err != nil { + return nil, fmt.Errorf("cannot inspect operational-value evaluator: %w", err) + } + if info.Mode()&os.ModeSymlink != 0 || !info.Mode().IsRegular() { + return nil, errors.New("operational-value evaluator must be a regular file, not a symbolic link") + } + file, err := os.Open(evaluatorPath) + if err != nil { + return nil, fmt.Errorf("cannot read operational-value evaluator: %w", err) + } + defer file.Close() + content, err := io.ReadAll(io.LimitReader(file, maxOperationalValueEvaluatorBytes+1)) + if err != nil { + return nil, fmt.Errorf("cannot read operational-value evaluator: %w", err) + } + return validateOperationalValueEvaluatorSource(content) +} + +func validateOperationalValueEvaluatorSource(content []byte) ([]byte, error) { + if len(content) > maxOperationalValueEvaluatorBytes { + return nil, fmt.Errorf("operational-value evaluator exceeds the %d-byte limit", maxOperationalValueEvaluatorBytes) + } + if !utf8.Valid(content) { + return nil, errors.New("operational-value evaluator must be valid UTF-8") + } + if !bytes.HasPrefix(content, []byte("#!/usr/bin/env bash\n")) && !bytes.HasPrefix(content, []byte("#!/bin/bash\n")) { + return nil, errors.New("operational-value evaluator must start with a Bash shebang") + } + return content, nil +} + +func validateOperationalValueMetrics(data []byte) error { + var metrics []map[string]json.RawMessage + if err := json.Unmarshal(data, &metrics); err != nil || len(metrics) == 0 { + return errors.New("operational-value evaluator must return one non-empty JSON metric array") + } + ids := make(map[string]struct{}, len(metrics)) + for _, metric := range metrics { + if len(metric) != 2 || metric["id"] == nil || metric["value"] == nil { + return errors.New("operational-value evaluator metrics must contain exactly id and value") + } + var id string + if err := json.Unmarshal(metric["id"], &id); err != nil || strings.TrimSpace(id) == "" { + return errors.New("operational-value evaluator metric ids must be non-empty strings") + } + if _, exists := ids[id]; exists { + return errors.New("operational-value evaluator metric ids must be unique") + } + ids[id] = struct{}{} + if string(metric["value"]) == "null" { + continue + } + var value float64 + if err := json.Unmarshal(metric["value"], &value); err != nil || value < 0 || value > 1 { + return errors.New("operational-value evaluator metric values must be null or finite numbers in [0,1]") + } + } + return nil +} + +type boundedCommandBuffer struct { + bytes.Buffer + limit int + exceeded bool +} + +func (buffer *boundedCommandBuffer) Write(data []byte) (int, error) { + written := len(data) + remaining := buffer.limit - buffer.Len() + if remaining > 0 { + remaining = min(len(data), remaining) + _, _ = buffer.Buffer.Write(data[:remaining]) + } + if written > remaining { + buffer.exceeded = true + } + return written, nil +} + +func runOperationalValueEvaluatorBash(ctx context.Context, evaluatorPath string, args []string, input []byte, timeout time.Duration, evaluatorHost string) ([]byte, error) { + commandCtx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + cmd := exec.CommandContext(commandCtx, "/bin/bash", args...) + cmd.Dir = filepath.Dir(evaluatorPath) + cmd.Env = operationalValueEvaluatorEnvironment(os.Environ(), evaluatorHost) + cmd.Stdin = bytes.NewReader(input) + stdout := &boundedCommandBuffer{limit: maxOperationalValueOutputBytes} + stderr := &boundedCommandBuffer{limit: maxOperationalValueOutputBytes} + cmd.Stdout = stdout + cmd.Stderr = stderr + err := cmd.Run() + if errors.Is(commandCtx.Err(), context.DeadlineExceeded) { + return nil, fmt.Errorf("timed out after %s", timeout) + } + if stdout.exceeded || stderr.exceeded { + return nil, fmt.Errorf("output exceeded the %d-byte limit", maxOperationalValueOutputBytes) + } + if err != nil { + if message := strings.TrimSpace(stderr.String()); message != "" { + return nil, errors.New(message) + } + return nil, err + } + return stdout.Bytes(), nil +} + +func operationalValueEvaluatorEnvironment(environ []string, evaluatorHost string) []string { + allowed := map[string]struct{}{ + "PATH": {}, "HOME": {}, "TMPDIR": {}, "TEMP": {}, "TMP": {}, + "SystemRoot": {}, "ComSpec": {}, "GH_TOKEN": {}, "GH_HOST": {}, + "GITHUB_API_URL": {}, "GITHUB_GRAPHQL_URL": {}, "GITHUB_SERVER_URL": {}, + } + values := make(map[string]string) + for _, entry := range environ { + key, value, ok := strings.Cut(entry, "=") + if _, allowedKey := allowed[key]; ok && allowedKey { + values[key] = value + } + } + hostURL, err := url.Parse(evaluatorHost) + if err == nil && hostURL.Scheme != "" && hostURL.Host != "" { + serverURL := strings.TrimSuffix(hostURL.String(), "/") + values["GH_HOST"] = hostURL.Host + values["GITHUB_SERVER_URL"] = serverURL + if strings.EqualFold(hostURL.Hostname(), "github.com") { + values["GITHUB_API_URL"] = "https://api.github.com" + values["GITHUB_GRAPHQL_URL"] = "https://api.github.com/graphql" + } else { + apiURL := *hostURL + apiURL.Path = path.Join(apiURL.Path, "api/v3") + graphqlURL := *hostURL + graphqlURL.Path = path.Join(graphqlURL.Path, "api/graphql") + values["GITHUB_API_URL"] = apiURL.String() + values["GITHUB_GRAPHQL_URL"] = graphqlURL.String() + } + } + result := make([]string, 0, len(values)) + for key, value := range values { + result = append(result, key+"="+value) + } + slices.Sort(result) + return result +} + func parseGraderRunID(value string) (int64, error) { runID, err := strconv.ParseInt(value, 10, 64) if err != nil || runID <= 0 { diff --git a/pkg/cli/graders_run_test.go b/pkg/cli/graders_run_test.go index 32fcd34cda8..d88c38909aa 100644 --- a/pkg/cli/graders_run_test.go +++ b/pkg/cli/graders_run_test.go @@ -90,6 +90,30 @@ graders: }`, output.String()) } +func TestRunInlineOperationalValueGraderFromStdin(t *testing.T) { + workflowID := writeGraderRunWorkflow(t, `--- +graders: + operational-value: + script: | + #!/usr/bin/env bash + set -euo pipefail + [[ $# -eq 0 ]] + request=$(cat) + value=$(printf '%s' "$request" | jq -r '.score') + printf '[{"id":"score","value":%s}]\n' "$value" +--- +`) + var output bytes.Buffer + err := runGrader(context.Background(), graderRunConfig{ + Workflow: workflowID, + GraderID: "operational-value", + Input: bytes.NewBufferString(`{"score":0.75}`), + Output: &output, + }) + require.NoError(t, err) + assert.JSONEq(t, `[{"id":"score","value":0.75}]`, output.String()) +} + func TestRunScriptFileGraderFromStdin(t *testing.T) { workflowID := writeGraderRunWorkflow(t, `--- graders: @@ -101,18 +125,11 @@ graders: require.NoError(t, os.MkdirAll(filepath.Join(".github", "graders"), 0o755)) require.NoError(t, os.WriteFile(filepath.Join(".github", "graders", "test-operational-value.sh"), []byte(`#!/usr/bin/env bash set -euo pipefail -case "${1:-}" in ---definition) - printf '%s\n' '{"schemaVersion":4,"grader":"operational-value","repository":"example/repo","workflowName":"Test","sourcePath":".github/workflows/test.md","adoption":{"commit":"abc","adoptedAt":"2026-01-01T00:00:00Z"},"operationalValue":"Test direct script execution.","evidence":{"opportunity":"test","assignment":"payload","accepted":"stdin","repositories":["example/repo"],"collection":"test","maturation":"immediate","zeroRule":"none","missingRule":"null"},"primaryMetric":{"id":"score","formula":"payload score","direction":"higher_is_better"},"baseline":{"mode":"attainment-only","value":null,"evidenceCutoff":null,"provenance":[]},"validationExamples":{"sample":{"valid":true}}}' - ;; ---grade-run) - [[ "${GH_HOST:-}" == "ghe.example" ]] - payload=$(cat) - [[ "$payload" == '{"score":0.8}' ]] - printf '%s\n' '{"value":0.8,"source":"script-file"}' - ;; -*) exit 1 ;; -esac +[[ $# -eq 0 ]] +[[ "${GH_HOST:-}" == "ghe.example" ]] +payload=$(cat) +[[ "$payload" == '{"score":0.8}' ]] +printf '%s\n' '[{"id":"score","value":0.8},{"id":"evidence-available","value":1}]' `), 0o700)) var output bytes.Buffer @@ -124,7 +141,25 @@ esac Output: &output, }) require.NoError(t, err) - assert.JSONEq(t, `{"value":0.8,"source":"script-file"}`, output.String()) + assert.JSONEq(t, `[{"id":"score","value":0.8},{"id":"evidence-available","value":1}]`, output.String()) +} + +func TestRunOperationalValueGraderRejectsHistoricalPayload(t *testing.T) { + workflowID := writeGraderRunWorkflow(t, `--- +graders: + operational-value: + script: | + #!/usr/bin/env bash + cat +--- +`) + err := runGrader(context.Background(), graderRunConfig{ + Workflow: workflowID, + GraderID: "operational-value", + RunID: 123, + Output: &bytes.Buffer{}, + }) + require.ErrorContains(t, err, "historical replay is not supported") } func TestReadGraderPayloadValidation(t *testing.T) { @@ -134,3 +169,29 @@ func TestReadGraderPayloadValidation(t *testing.T) { _, err = parseGraderRunID("0") require.ErrorContains(t, err, "positive integer") } + +func TestValidateOperationalValueEvaluatorSource(t *testing.T) { + valid := []byte("#!/usr/bin/env bash\nprintf '%s\\n' '[]'\n") + actual, err := validateOperationalValueEvaluatorSource(valid) + require.NoError(t, err) + assert.Equal(t, valid, actual) + + _, err = validateOperationalValueEvaluatorSource([]byte("echo invalid\n")) + require.ErrorContains(t, err, "Bash shebang") + + _, err = validateOperationalValueEvaluatorSource(append([]byte("#!/usr/bin/env bash\n"), bytes.Repeat([]byte("x"), maxOperationalValueEvaluatorBytes)...)) + require.ErrorContains(t, err, "65536-byte limit") +} + +func TestValidateOperationalValueMetrics(t *testing.T) { + require.NoError(t, validateOperationalValueMetrics([]byte(`[{"id":"primary","value":1},{"id":"diagnostic","value":null}]`))) + + for _, invalid := range []string{ + `[]`, + `[{"id":"score","value":1,"message":"invalid"}]`, + `[{"id":"score","value":1},{"id":"score","value":0}]`, + `[{"id":"score","value":2}]`, + } { + require.Error(t, validateOperationalValueMetrics([]byte(invalid)), invalid) + } +} diff --git a/pkg/constants/job_constants.go b/pkg/constants/job_constants.go index 026a24977f1..471f94d8aac 100644 --- a/pkg/constants/job_constants.go +++ b/pkg/constants/job_constants.go @@ -148,7 +148,7 @@ const GraderResultsFilename Filename = "grader_results.json" // GraderPayloadFilename is the filename of the preprocessed trace payload consumed by graders. const GraderPayloadFilename Filename = "grader_payload.json" -// OperationalValueEvaluatorFilename is the filename of the frozen operational-value evaluator archived for replay. +// OperationalValueEvaluatorFilename is the filename of the frozen operational-value evaluator archived with a run. const OperationalValueEvaluatorFilename Filename = "operational_value_evaluator.sh" // GradersDir is the subdirectory under TmpGhAwAgentDir where grader output files are written. diff --git a/pkg/parser/schemas/main_workflow_schema.json b/pkg/parser/schemas/main_workflow_schema.json index e2a47b37582..d4048e7f876 100644 --- a/pkg/parser/schemas/main_workflow_schema.json +++ b/pkg/parser/schemas/main_workflow_schema.json @@ -13413,7 +13413,7 @@ "examples": ["gpt-5.4", "claude-3-5-sonnet-20241022", "gpt-4"] }, "graders": { - "description": "\u26a0\ufe0f Experimental. Deterministic graders for workflow-run observations. Built-in graders use execution artifacts, custom graders use inline scripts, and the operational-value grader uses a repository evaluator.", + "description": "\u26a0\ufe0f Experimental. Deterministic graders for workflow-run observations. Built-in graders use execution artifacts, custom graders use inline JavaScript, and the operational-value grader uses either inline Bash or a repository Bash evaluator.", "type": "object", "propertyNames": { "pattern": "^[a-z][a-z0-9-]{0,63}$", @@ -13470,13 +13470,13 @@ "script": { "type": "string", "minLength": 1, - "maxLength": 4096, - "description": "Custom grader JavaScript script body (trusted workflows only)." + "maxLength": 65536, + "description": "Inline script body. Custom graders use JavaScript (maximum 4096 characters); the reserved operational-value grader uses a complete Bash script with a shebang (maximum 65536 bytes)." }, "run": { "type": "string", "pattern": "^(?:\\./)?(?:[^./\\\\][^/\\\\]*|\\.[^./\\\\][^/\\\\]*|\\.\\.[^/\\\\]+)(?:/(?:[^./\\\\][^/\\\\]*|\\.[^./\\\\][^/\\\\]*|\\.\\.[^/\\\\]+))*\\.sh$", - "description": "Workspace-relative or ./ workflow-local Bash script for the operational-value evaluator. Supported only for the reserved operational-value grader ID." + "description": "Workspace-relative or ./ workflow-local Bash script for the operational-value evaluator. Supported only for the reserved operational-value grader ID and mutually exclusive with script." } } } diff --git a/pkg/workflow/compiler_yaml_graders.go b/pkg/workflow/compiler_yaml_graders.go index 729616efae7..39a912280e1 100644 --- a/pkg/workflow/compiler_yaml_graders.go +++ b/pkg/workflow/compiler_yaml_graders.go @@ -96,6 +96,7 @@ type graderManifestEntry struct { Min *float64 `json:"min,omitempty"` Digest string `json:"digest,omitempty"` // SHA-256 of inline script or operational-value evaluator Run string `json:"run,omitempty"` + Inline string `json:"inline,omitempty"` Config map[string]any `json:"config,omitempty"` } @@ -165,6 +166,7 @@ func buildGraderManifest(cfg *GradersConfig) *graderManifest { //nolint:largefun Min: g.Min, Digest: digest, Run: g.Run, + Inline: g.evaluatorSourcePath, Config: g.Config, }) } diff --git a/pkg/workflow/graders_config.go b/pkg/workflow/graders_config.go index 31f6234360b..2d63b5e5468 100644 --- a/pkg/workflow/graders_config.go +++ b/pkg/workflow/graders_config.go @@ -65,19 +65,20 @@ var builtinGraderMetaByID = func() map[string]*BuiltinGraderMeta { // GraderDefinition represents a single grader entry in the graders map. type GraderDefinition struct { - ID string // grader identifier (must be unique) - Enabled *bool // explicit enable/disable; nil means use default (true for built-ins) - Name string // human-readable name (defaults from registry for built-ins) - Description string // description of the metric - Unit string // e.g. "ratio", "count", "ms", "factor" - Direction string // "higher_is_better" or "lower_is_better" - Threshold *float64 // quality threshold (pass/fail boundary) - Max *float64 // theoretical maximum - Min *float64 // theoretical minimum - Run string // operational-value evaluator script path - Script string // inline JS body for trusted custom graders (built-ins leave empty) - Config map[string]any // arbitrary config passed to grader at runtime - evaluatorContent string + ID string // grader identifier (must be unique) + Enabled *bool // explicit enable/disable; nil means use default (true for built-ins) + Name string // human-readable name (defaults from registry for built-ins) + Description string // description of the metric + Unit string // e.g. "ratio", "count", "ms", "factor" + Direction string // "higher_is_better" or "lower_is_better" + Threshold *float64 // quality threshold (pass/fail boundary) + Max *float64 // theoretical maximum + Min *float64 // theoretical minimum + Run string // operational-value evaluator script path + Script string // inline JS body, or inline Bash for operational-value + Config map[string]any // arbitrary config passed to grader at runtime + evaluatorContent string + evaluatorSourcePath string } // ScriptDigest returns the SHA-256 hex digest of the script, or "" if no script. @@ -249,7 +250,7 @@ func (c *Compiler) parseGradersFromFrontmatter(frontmatter map[string]any) (*Gra _, isBuiltin := builtinSet[id] if entryRaw == nil { if id == "operational-value" { - return nil, errors.New("graders.operational-value requires a 'run' field") + return nil, errors.New("graders.operational-value requires exactly one of 'run' or 'script'") } if !isBuiltin { return nil, fmt.Errorf("graders.%s is not a built-in grader and requires a 'script' field. Built-in graders: %s", id, strings.Join(BuiltinGraderIDs, ", ")) @@ -267,9 +268,9 @@ func (c *Compiler) parseGradersFromFrontmatter(frontmatter map[string]any) (*Gra return nil, err } - // The operational-value grader uses a repository evaluator; other custom graders use inline scripts. - if id == "operational-value" && def.Run == "" && (def.Enabled == nil || *def.Enabled) { - return nil, errors.New("graders.operational-value requires a 'run' field") + // The operational-value grader accepts one committed evaluator source: a file or inline Bash. + if id == "operational-value" && def.Run == "" && def.Script == "" && (def.Enabled == nil || *def.Enabled) { + return nil, errors.New("graders.operational-value requires exactly one of 'run' or 'script'") } if !isBuiltin && id != "operational-value" && def.Script == "" && (def.Enabled == nil || *def.Enabled) { return nil, fmt.Errorf("graders.%s is not a built-in grader and requires a 'script' field. Built-in graders: %s", id, strings.Join(BuiltinGraderIDs, ", ")) @@ -407,16 +408,23 @@ func parseGraderEntryFields(def *GraderDefinition, entry map[string]any, id stri if !ok { return fmt.Errorf("graders.%s.script must be a string, got %T", id, scriptRaw) } - s = strings.TrimSpace(s) - if s == "" { + if strings.TrimSpace(s) == "" { return fmt.Errorf("graders.%s.script must be non-empty when specified", id) } if isBuiltin { return fmt.Errorf("graders.%s is a built-in grader and cannot have a custom script", id) } if id == "operational-value" { - return errors.New("graders.operational-value cannot have an inline script; use 'run'") + if def.Run != "" { + return errors.New("graders.operational-value must specify exactly one of 'run' or 'script'") + } + if len(s) > maxOperationalValueEvaluatorSize { + return fmt.Errorf("graders.operational-value.script exceeds maximum length of %d bytes (%d)", maxOperationalValueEvaluatorSize, len(s)) + } + def.Script = s + return nil } + s = strings.TrimSpace(s) scriptCharCount := utf8.RuneCountInString(s) if scriptCharCount > 4096 { return fmt.Errorf("graders.%s.script exceeds maximum length of 4096 characters (%d)", id, scriptCharCount) diff --git a/pkg/workflow/graders_config_test.go b/pkg/workflow/graders_config_test.go index 6f66e4c54fa..271b9806acc 100644 --- a/pkg/workflow/graders_config_test.go +++ b/pkg/workflow/graders_config_test.go @@ -156,6 +156,26 @@ func TestParseGradersFromFrontmatter_OperationalValueGrader(t *testing.T) { } } +func TestParseGradersFromFrontmatter_InlineOperationalValueGrader(t *testing.T) { + var c Compiler + script := "#!/usr/bin/env bash\nset -euo pipefail\n" + cfg, err := c.parseGradersFromFrontmatter(map[string]any{ + "graders": map[string]any{ + "operational-value": map[string]any{"script": script}, + }, + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + grader := cfg.Graders["operational-value"] + if grader.Script != script { + t.Fatalf("unexpected inline operational-value script: %q", grader.Script) + } + if grader.Run != "" { + t.Fatalf("inline operational-value grader must not have a run path before preparation: %q", grader.Run) + } +} + func TestParseGradersFromFrontmatter_OperationalValueGraderValidation(t *testing.T) { var c Compiler tests := []struct { @@ -163,11 +183,11 @@ func TestParseGradersFromFrontmatter_OperationalValueGraderValidation(t *testing entry map[string]any errText string }{ - {name: "missing run", entry: map[string]any{}, errText: "requires a 'run' field"}, + {name: "missing source", entry: map[string]any{}, errText: "requires exactly one of 'run' or 'script'"}, {name: "path traversal", entry: map[string]any{"run": ".github/workflows/graders/../secret.sh"}, errText: "workspace-relative"}, {name: "absolute path", entry: map[string]any{"run": "/tmp/operational-value.sh"}, errText: "workspace-relative"}, {name: "wrong extension", entry: map[string]any{"run": ".github/workflows/graders/operational-value.js"}, errText: "workspace-relative"}, - {name: "inline script", entry: map[string]any{"run": ".github/workflows/graders/operational-value.sh", "script": "return 1"}, errText: "cannot have an inline script"}, + {name: "run and inline script", entry: map[string]any{"run": ".github/workflows/graders/operational-value.sh", "script": "#!/usr/bin/env bash\n"}, errText: "must specify exactly one of 'run' or 'script'"}, {name: "direction", entry: map[string]any{"run": ".github/workflows/graders/operational-value.sh", "direction": "lower_is_better"}, errText: "direction must be 'higher_is_better'"}, {name: "minimum", entry: map[string]any{"run": ".github/workflows/graders/operational-value.sh", "min": 0.1}, errText: "range must be min: 0 and max: 1"}, {name: "maximum", entry: map[string]any{"run": ".github/workflows/graders/operational-value.sh", "max": 2.0}, errText: "range must be min: 0 and max: 1"}, @@ -433,6 +453,15 @@ func TestParseGradersFromFrontmatter_CustomNullRejected(t *testing.T) { // TestParseGradersFromFrontmatter_ScriptLengthUsesCharacters verifies limits align to character count. func TestParseGradersFromFrontmatter_ScriptLengthUsesCharacters(t *testing.T) { var c Compiler + exactLimitScript := "return '" + strings.Repeat("a", 4096-len("return ''")) + "'" + if _, err := c.parseGradersFromFrontmatter(map[string]any{ + "graders": map[string]any{ + "exact-limit": map[string]any{"script": exactLimitScript}, + }, + }); err != nil { + t.Fatalf("expected script of exactly 4096 characters to pass, got: %v", err) + } + validMultibyteScript := "return '" + strings.Repeat("é", 1366) + "'.length" if _, err := c.parseGradersFromFrontmatter(map[string]any{ "graders": map[string]any{ @@ -442,7 +471,7 @@ func TestParseGradersFromFrontmatter_ScriptLengthUsesCharacters(t *testing.T) { t.Fatalf("expected multibyte script under 4096 characters to pass, got: %v", err) } - tooLongScript := "return '" + strings.Repeat("a", 4097) + "'.length" + tooLongScript := exactLimitScript + "a" _, err := c.parseGradersFromFrontmatter(map[string]any{ "graders": map[string]any{ "too-long": map[string]any{"script": tooLongScript}, @@ -456,6 +485,28 @@ func TestParseGradersFromFrontmatter_ScriptLengthUsesCharacters(t *testing.T) { } } +func TestParseGradersFromFrontmatter_OperationalValueScriptLengthUsesBytes(t *testing.T) { + var c Compiler + prefix := "#!/usr/bin/env bash\n#" + exactLimitScript := prefix + strings.Repeat("x", maxOperationalValueEvaluatorSize-len(prefix)-1) + "\n" + if _, err := c.parseGradersFromFrontmatter(map[string]any{ + "graders": map[string]any{ + "operational-value": map[string]any{"script": exactLimitScript}, + }, + }); err != nil { + t.Fatalf("expected operational-value script of exactly %d bytes to pass, got: %v", maxOperationalValueEvaluatorSize, err) + } + + _, err := c.parseGradersFromFrontmatter(map[string]any{ + "graders": map[string]any{ + "operational-value": map[string]any{"script": exactLimitScript + "x"}, + }, + }) + if err == nil || !strings.Contains(err.Error(), "maximum length of 65536 bytes") { + t.Fatalf("expected operational-value byte-length error, got: %v", err) + } +} + // TestParseGradersFromFrontmatter_InvalidID verifies ID validation. func TestParseGradersFromFrontmatter_InvalidID(t *testing.T) { var c Compiler @@ -606,6 +657,29 @@ func TestBuildGraderManifest_OperationalValueGrader(t *testing.T) { } } +func TestBuildGraderManifest_InlineOperationalValueGrader(t *testing.T) { + grader := &GraderDefinition{ID: "operational-value"} + grader.evaluatorContent = "#!/usr/bin/env bash\necho '[]'\n" + grader.evaluatorSourcePath = ".github/workflows/example.md" + cfg := &GradersConfig{Graders: map[string]*GraderDefinition{"operational-value": grader}} + + manifest := buildGraderManifest(cfg) + if len(manifest.Graders) != 1 { + t.Fatalf("expected one grader, got %d", len(manifest.Graders)) + } + entry := manifest.Graders[0] + if entry.Run != "" || entry.Inline != ".github/workflows/example.md" { + t.Fatalf("unexpected inline evaluator source: run=%q inline=%q", entry.Run, entry.Inline) + } + if entry.Digest != grader.EvaluatorDigest() { + t.Fatalf("expected frozen inline evaluator digest, got %q", entry.Digest) + } + execSpec := buildGraderExecSpec(cfg) + if len(execSpec) != 1 || execSpec[0].Run != grader.evaluatorContent || execSpec[0].Script != "" { + t.Fatalf("expected inline Bash to use the operational-value execution path: %+v", execSpec) + } +} + // TestGenerateGradersStep_Absent verifies no step when graders nil. func TestGenerateGradersStep_Absent(t *testing.T) { c := &Compiler{} diff --git a/pkg/workflow/graders_operational_value.go b/pkg/workflow/graders_operational_value.go index 6c380e548dc..bff4aa5794d 100644 --- a/pkg/workflow/graders_operational_value.go +++ b/pkg/workflow/graders_operational_value.go @@ -23,13 +23,28 @@ func (c *Compiler) prepareOperationalValueGrader(data *WorkflowData, markdownPat if !ok || (grader.Enabled != nil && !*grader.Enabled) { return nil } - if grader.Run == "" { - return errors.New("graders.operational-value requires a 'run' field") + if grader.Run == "" && grader.Script == "" { + return errors.New("graders.operational-value requires exactly one of 'run' or 'script'") + } + if grader.Run != "" && grader.Script != "" { + return errors.New("graders.operational-value must specify exactly one of 'run' or 'script'") } repoRoot, err := gitutil.FindGitRootFrom(filepath.Dir(markdownPath)) if err != nil { - return fmt.Errorf("cannot resolve graders.operational-value.run %q: workflow is not inside a Git repository", grader.Run) + return errors.New("cannot prepare graders.operational-value: workflow is not inside a Git repository") + } + if grader.Script != "" { + if err := validateOperationalValueEvaluatorContent(grader.Script); err != nil { + return fmt.Errorf("graders.operational-value.script %w", err) + } + relativeWorkflowPath, err := filepath.Rel(repoRoot, markdownPath) + if err != nil { + return fmt.Errorf("cannot resolve inline operational-value workflow source: %w", err) + } + grader.evaluatorSourcePath = filepath.ToSlash(relativeWorkflowPath) + grader.evaluatorContent = grader.Script + return nil } evaluatorPath := ResolveOperationalValueEvaluatorPath(repoRoot, markdownPath, grader.Run) if err := fileutil.ValidatePathWithinBase(repoRoot, evaluatorPath); err != nil { @@ -71,14 +86,24 @@ func (c *Compiler) prepareOperationalValueGrader(data *WorkflowData, markdownPat return fmt.Errorf("graders.operational-value.run %q must be valid UTF-8", grader.Run) } evaluatorContent := string(content) + if err := validateOperationalValueEvaluatorContent(evaluatorContent); err != nil { + return fmt.Errorf("graders.operational-value.run %q %w", grader.Run, err) + } + + grader.evaluatorContent = evaluatorContent + return nil +} + +func validateOperationalValueEvaluatorContent(evaluatorContent string) error { + if len(evaluatorContent) > maxOperationalValueEvaluatorSize { + return fmt.Errorf("exceeds the %d-byte limit", maxOperationalValueEvaluatorSize) + } if !strings.HasPrefix(evaluatorContent, "#!/usr/bin/env bash\n") && !strings.HasPrefix(evaluatorContent, "#!/bin/bash\n") { - return fmt.Errorf("graders.operational-value.run %q must start with a Bash shebang", grader.Run) + return errors.New("must start with a Bash shebang") } if err := validateOperationalValueEvaluatorBash(evaluatorContent); err != nil { - return fmt.Errorf("graders.operational-value.run %q has invalid Bash syntax: %w", grader.Run, err) + return fmt.Errorf("has invalid Bash syntax: %w", err) } - - grader.evaluatorContent = evaluatorContent return nil } diff --git a/pkg/workflow/graders_operational_value_test.go b/pkg/workflow/graders_operational_value_test.go index 13680280118..a8d429c7857 100644 --- a/pkg/workflow/graders_operational_value_test.go +++ b/pkg/workflow/graders_operational_value_test.go @@ -63,6 +63,99 @@ func TestPrepareOperationalValueGraderResolvesLocalDotPath(t *testing.T) { } } +func TestPrepareOperationalValueGraderFreezesInlineScript(t *testing.T) { + repoRoot := t.TempDir() + if err := os.Mkdir(filepath.Join(repoRoot, ".git"), 0o755); err != nil { + t.Fatal(err) + } + workflowPath := filepath.Join(repoRoot, ".github", "workflows", "example.md") + if err := os.MkdirAll(filepath.Dir(workflowPath), 0o755); err != nil { + t.Fatal(err) + } + content := "#!/usr/bin/env bash\nset -euo pipefail\n" + data := operationalValueGraderWorkflowData("") + data.Graders.Graders["operational-value"].Script = content + + if err := (&Compiler{}).prepareOperationalValueGrader(data, workflowPath); err != nil { + t.Fatalf("unexpected error: %v", err) + } + grader := data.Graders.Graders["operational-value"] + if grader.evaluatorContent != content { + t.Fatal("expected inline operational-value evaluator content to be frozen") + } + if grader.Run != "" { + t.Fatalf("inline evaluator must not expose a file-backed run path, got %q", grader.Run) + } + if grader.evaluatorSourcePath != ".github/workflows/example.md" { + t.Fatalf("expected inline source workflow path, got %q", grader.evaluatorSourcePath) + } +} + +func TestPrepareOperationalValueGraderAcceptsMaximumFileSize(t *testing.T) { + repoRoot := t.TempDir() + if err := os.Mkdir(filepath.Join(repoRoot, ".git"), 0o755); err != nil { + t.Fatal(err) + } + workflowPath := filepath.Join(repoRoot, ".github", "workflows", "example.md") + evaluatorPath := filepath.Join(repoRoot, ".github", "graders", "example-operational-value.sh") + if err := os.MkdirAll(filepath.Dir(workflowPath), 0o755); err != nil { + t.Fatal(err) + } + if err := os.MkdirAll(filepath.Dir(evaluatorPath), 0o755); err != nil { + t.Fatal(err) + } + prefix := "#!/usr/bin/env bash\n#" + content := prefix + strings.Repeat("x", maxOperationalValueEvaluatorSize-len(prefix)-1) + "\n" + if err := os.WriteFile(evaluatorPath, []byte(content), 0o755); err != nil { + t.Fatal(err) + } + + data := operationalValueGraderWorkflowData(".github/graders/example-operational-value.sh") + if err := (&Compiler{}).prepareOperationalValueGrader(data, workflowPath); err != nil { + t.Fatalf("expected file-backed evaluator of exactly %d bytes to pass, got: %v", maxOperationalValueEvaluatorSize, err) + } +} + +func TestValidateOperationalValueEvaluatorContentRejectsOneByteOverLimit(t *testing.T) { + prefix := "#!/usr/bin/env bash\n#" + content := prefix + strings.Repeat("x", maxOperationalValueEvaluatorSize-len(prefix)) + "\n" + err := validateOperationalValueEvaluatorContent(content) + if err == nil || !strings.Contains(err.Error(), "65536-byte limit") { + t.Fatalf("expected one-byte-over-limit error, got: %v", err) + } +} + +func TestPrepareOperationalValueGraderRejectsInvalidInlineScript(t *testing.T) { + tests := []struct { + name string + content string + errText string + }{ + {name: "not bash", content: "echo operational value\n", errText: "Bash shebang"}, + {name: "invalid bash", content: "#!/usr/bin/env bash\nif true; then\n", errText: "invalid Bash syntax"}, + {name: "oversized", content: "#!/usr/bin/env bash\n" + strings.Repeat("x", maxOperationalValueEvaluatorSize), errText: "exceeds"}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + repoRoot := t.TempDir() + if err := os.Mkdir(filepath.Join(repoRoot, ".git"), 0o755); err != nil { + t.Fatal(err) + } + workflowPath := filepath.Join(repoRoot, ".github", "workflows", "example.md") + if err := os.MkdirAll(filepath.Dir(workflowPath), 0o755); err != nil { + t.Fatal(err) + } + data := operationalValueGraderWorkflowData("") + data.Graders.Graders["operational-value"].Script = test.content + + err := (&Compiler{}).prepareOperationalValueGrader(data, workflowPath) + if err == nil || !strings.Contains(err.Error(), test.errText) { + t.Fatalf("expected error containing %q, got %v", test.errText, err) + } + }) + } +} + func TestPrepareOperationalValueGraderRejectsInvalidFiles(t *testing.T) { tests := []struct { name string diff --git a/pkg/workflow/graders_workflow_integration_test.go b/pkg/workflow/graders_workflow_integration_test.go index a4ed7b0ae59..a34eb54f8eb 100644 --- a/pkg/workflow/graders_workflow_integration_test.go +++ b/pkg/workflow/graders_workflow_integration_test.go @@ -3,9 +3,12 @@ package workflow import ( + "crypto/sha256" "encoding/base64" "encoding/json" + "fmt" "os" + "os/exec" "path/filepath" "regexp" "testing" @@ -108,6 +111,62 @@ experiments: assert.Contains(t, execEntries[0].Script, "helpers.clamp") } +func TestGradersWorkflowIntegration_InlineOperationalValue(t *testing.T) { + tmpDir := testutil.TempDir(t, "graders-inline-operational-value") + gitInit := exec.Command("git", "-C", tmpDir, "init") + output, err := gitInit.CombinedOutput() + require.NoErrorf(t, err, "git init should succeed: %s", output) + workflowPath := filepath.Join(tmpDir, "workflow.md") + evaluator := "#!/usr/bin/env bash\nset -euo pipefail\nrequest=$(cat)\nprintf '%s\\n' '[{\"id\":\"goal-attained\",\"value\":1}]'\n" + + content := `--- +on: workflow_dispatch +engine: copilot +strict: false +permissions: + contents: read +graders: + operational-value: + script: | + #!/usr/bin/env bash + set -euo pipefail + request=$(cat) + printf '%s\n' '[{"id":"goal-attained","value":1}]' +--- + +# Inline operational value +` + require.NoError(t, os.WriteFile(workflowPath, []byte(content), 0o644)) + + compiler := NewCompiler(WithVersion("dev")) + require.NoError(t, compiler.CompileWorkflow(workflowPath)) + + compiled, err := os.ReadFile(stringutil.MarkdownToLockFile(workflowPath)) + require.NoError(t, err) + match := regexp.MustCompile(`await main\('([^']+)', '([^']+)'\);`).FindStringSubmatch(string(compiled)) + require.Len(t, match, 3, "expected encoded manifest and exec spec in generated script") + + manifestJSON, err := base64.StdEncoding.DecodeString(match[1]) + require.NoError(t, err) + var manifest graderManifest + require.NoError(t, json.Unmarshal(manifestJSON, &manifest)) + require.Len(t, manifest.Graders, 1) + entry := manifest.Graders[0] + assert.Equal(t, "operational-value", entry.ID) + assert.Equal(t, "operational-value", entry.Source) + assert.Empty(t, entry.Run) + assert.Equal(t, "workflow.md", entry.Inline) + assert.Equal(t, fmt.Sprintf("%x", sha256.Sum256([]byte(evaluator))), entry.Digest) + + execJSON, err := base64.StdEncoding.DecodeString(match[2]) + require.NoError(t, err) + var execEntries []graderExecEntry + require.NoError(t, json.Unmarshal(execJSON, &execEntries)) + require.Len(t, execEntries, 1) + assert.Equal(t, evaluator, execEntries[0].Run) + assert.Empty(t, execEntries[0].Script) +} + func TestGradersWorkflowIntegration_SchemaRejectsUnknownGraderField(t *testing.T) { tmpDir := testutil.TempDir(t, "graders-schema-rejects-unknown-field") workflowPath := filepath.Join(tmpDir, "workflow.md") diff --git a/reports/operational-value/daily-file-diet-operational-value.json b/reports/operational-value/daily-file-diet-operational-value.json deleted file mode 100644 index 52e2a14bb84..00000000000 --- a/reports/operational-value/daily-file-diet-operational-value.json +++ /dev/null @@ -1,13361 +0,0 @@ -{ - "schemaVersion": 1, - "generatedAt": "2026-09-01T07:29:26Z", - "repository": "github/gh-aw", - "workflowId": "daily-file-diet", - "workflowName": "Daily File Diet", - "sourcePath": ".github/workflows/daily-file-diet.md", - "operationalValue": "Decompose the run's largest oversized non-test Go file toward 500 lines.", - "window": { - "startAt": "2025-11-15T13:36:21Z", - "endAt": "2026-09-01T07:28:51Z" - }, - "evaluator": { - "path": ".github/graders/daily-file-diet-operational-value.sh", - "sha256": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "definition": { - "schemaVersion": 4, - "grader": "operational-value", - "repository": "github/gh-aw", - "workflowName": "Daily File Diet", - "sourcePath": ".github/workflows/daily-file-diet.md", - "adoption": { - "commit": "1186030a620f4113f655c156bedf70cf2c164f79", - "adoptedAt": "2025-11-15T13:36:21Z" - }, - "operationalValue": "Decompose the run's largest oversized non-test Go file toward 500 lines.", - "evidence": { - "opportunity": "Largest non-test pkg/**/*.go blob at the run commit; below 1000 is healthy.", - "assignment": "Greatest wc -l, reverse lexical tie-break. Key: go-file:\u003cpath\u003e or repository-health:non-test-go-under-1000; duplicates repeat.", - "accepted": "Git evidence of assigned-path reduction toward 500 lines or tree-proven absence; issues and traces are excluded.", - "repositories": ["github/gh-aw"], - "collection": "With contents:read, count newlines in the run commit archive for assignment and in the cutoff commit blob for evidence.", - "maturation": "Two days; five pre-adoption issue/PR pairs (#1636-#3564) took 0.04-0.84 days.", - "zeroRule": "No reduction from the initial oversized file scores 0.", - "missingRule": "Invalid, unavailable, or truncated Git evidence scores null; tree-proven path absence is attainment." - }, - "primaryMetric": { - "id": "assigned-go-file-decomposition", - "formula": "initialLines \u003c 1000 =\u003e 1; else clamp((initialLines-currentLines)/(initialLines-500),0,1). Proven absence sets currentLines=0.", - "direction": "higher_is_better" - }, - "diagnosticMetrics": [ - { - "id": "largest-file-health", - "name": "Largest-file health at assignment", - "formula": "min(1, 999 / initialLines) when the assignment archive contains eligible files.", - "direction": "higher_is_better", - "aggregation": "latest" - }, - { - "id": "compliant-line-mass-share", - "name": "Compliant line-mass share at assignment", - "formula": "compliantLines / totalLines when the assignment archive contains eligible files and positive line mass.", - "direction": "higher_is_better", - "aggregation": "latest" - } - ], - "baseline": { - "mode": "attainment-only", - "value": null, - "evidenceCutoff": null, - "provenance": [] - }, - "validationExamples": { - "targetAttained": { - "valid": true, - "initialLines": 1907, - "currentLines": 500, - "thresholdLines": 1000, - "targetLines": 500 - }, - "targetMissed": { - "valid": true, - "initialLines": 1907, - "currentLines": 1907, - "thresholdLines": 1000, - "targetLines": 500 - }, - "missing": { - "valid": false - }, - "malformed": { - "valid": "yes", - "initialLines": "1907" - } - } - } - }, - "baseline": { - "mode": "attainment-only", - "value": null, - "evidenceCutoff": null, - "provenance": [] - }, - "coverage": { - "runCount": 245, - "numericCount": 245, - "matureCount": 244, - "unavailableCount": 0, - "errorCount": 0, - "distinctOpportunityCount": 57, - "duplicateOpportunityCount": 188, - "weeklyCacheHits": 244, - "evaluatedCount": 1 - }, - "summary": { - "mean": 0.2927780830237593, - "median": 0, - "minimum": 0, - "maximum": 1, - "first": 0.527363184079602, - "latest": 0.03418803418803419, - "change": -0.49317514989156785, - "latestDeltaFromBaseline": null - }, - "weekly": [ - { - "weekStart": "2025-11-10T00:00:00Z", - "weekEnd": "2025-11-17T00:00:00Z", - "runCount": 4, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.263681592039801, - "minimum": 0, - "maximum": 0.527363184079602 - }, - { - "weekStart": "2025-11-17T00:00:00Z", - "weekEnd": "2025-11-24T00:00:00Z", - "runCount": 7, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2025-11-24T00:00:00Z", - "weekEnd": "2025-12-01T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2025-12-01T00:00:00Z", - "weekEnd": "2025-12-08T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.8298850574712644, - "minimum": 0.6597701149425287, - "maximum": 1 - }, - { - "weekStart": "2025-12-08T00:00:00Z", - "weekEnd": "2025-12-15T00:00:00Z", - "runCount": 4, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.6258928571428571, - "minimum": 0.2517857142857143, - "maximum": 1 - }, - { - "weekStart": "2025-12-15T00:00:00Z", - "weekEnd": "2025-12-22T00:00:00Z", - "runCount": 7, - "numericCount": 5, - "distinctOpportunityCount": 5, - "mean": 0.7624423963133641, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2025-12-22T00:00:00Z", - "weekEnd": "2025-12-29T00:00:00Z", - "runCount": 15, - "numericCount": 3, - "distinctOpportunityCount": 3, - "mean": 0.6666666666666666, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2025-12-29T00:00:00Z", - "weekEnd": "2026-01-05T00:00:00Z", - "runCount": 9, - "numericCount": 4, - "distinctOpportunityCount": 4, - "mean": 1, - "minimum": 1, - "maximum": 1 - }, - { - "weekStart": "2026-01-05T00:00:00Z", - "weekEnd": "2026-01-12T00:00:00Z", - "runCount": 5, - "numericCount": 4, - "distinctOpportunityCount": 4, - "mean": 0.752770083102493, - "minimum": 0.0110803324099723, - "maximum": 1 - }, - { - "weekStart": "2026-01-12T00:00:00Z", - "weekEnd": "2026-01-19T00:00:00Z", - "runCount": 6, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-01-19T00:00:00Z", - "weekEnd": "2026-01-26T00:00:00Z", - "runCount": 5, - "numericCount": 5, - "distinctOpportunityCount": 5, - "mean": 0.7986301369863014, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-01-26T00:00:00Z", - "weekEnd": "2026-02-02T00:00:00Z", - "runCount": 5, - "numericCount": 4, - "distinctOpportunityCount": 4, - "mean": 0.7120473537604457, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-02-02T00:00:00Z", - "weekEnd": "2026-02-09T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-02-09T00:00:00Z", - "weekEnd": "2026-02-16T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-02-16T00:00:00Z", - "weekEnd": "2026-02-23T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 1, - "minimum": 1, - "maximum": 1 - }, - { - "weekStart": "2026-02-23T00:00:00Z", - "weekEnd": "2026-03-02T00:00:00Z", - "runCount": 8, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 1, - "minimum": 1, - "maximum": 1 - }, - { - "weekStart": "2026-03-02T00:00:00Z", - "weekEnd": "2026-03-09T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.5, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-03-09T00:00:00Z", - "weekEnd": "2026-03-16T00:00:00Z", - "runCount": 8, - "numericCount": 5, - "distinctOpportunityCount": 5, - "mean": 0.762051282051282, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-03-16T00:00:00Z", - "weekEnd": "2026-03-23T00:00:00Z", - "runCount": 14, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-03-23T00:00:00Z", - "weekEnd": "2026-03-30T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-03-30T00:00:00Z", - "weekEnd": "2026-04-06T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-04-06T00:00:00Z", - "weekEnd": "2026-04-13T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0.31971153846153844, - "minimum": 0.31971153846153844, - "maximum": 0.31971153846153844 - }, - { - "weekStart": "2026-04-13T00:00:00Z", - "weekEnd": "2026-04-20T00:00:00Z", - "runCount": 5, - "numericCount": 3, - "distinctOpportunityCount": 3, - "mean": 1, - "minimum": 1, - "maximum": 1 - }, - { - "weekStart": "2026-04-20T00:00:00Z", - "weekEnd": "2026-04-27T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.02815533980582524, - "minimum": 0, - "maximum": 0.05631067961165048 - }, - { - "weekStart": "2026-04-27T00:00:00Z", - "weekEnd": "2026-05-04T00:00:00Z", - "runCount": 5, - "numericCount": 3, - "distinctOpportunityCount": 3, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-05-04T00:00:00Z", - "weekEnd": "2026-05-11T00:00:00Z", - "runCount": 6, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.05954323001631321, - "minimum": 0, - "maximum": 0.11908646003262642 - }, - { - "weekStart": "2026-05-11T00:00:00Z", - "weekEnd": "2026-05-18T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-05-18T00:00:00Z", - "weekEnd": "2026-05-25T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.027496382054992764, - "minimum": 0, - "maximum": 0.05499276410998553 - }, - { - "weekStart": "2026-05-25T00:00:00Z", - "weekEnd": "2026-06-01T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-06-01T00:00:00Z", - "weekEnd": "2026-06-08T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0.6420204978038068, - "minimum": 0.6420204978038068, - "maximum": 0.6420204978038068 - }, - { - "weekStart": "2026-06-08T00:00:00Z", - "weekEnd": "2026-06-15T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-06-15T00:00:00Z", - "weekEnd": "2026-06-22T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-06-22T00:00:00Z", - "weekEnd": "2026-06-29T00:00:00Z", - "runCount": 4, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.5, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-06-29T00:00:00Z", - "weekEnd": "2026-07-06T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0, - "minimum": 0, - "maximum": 0 - }, - { - "weekStart": "2026-07-06T00:00:00Z", - "weekEnd": "2026-07-13T00:00:00Z", - "runCount": 5, - "numericCount": 4, - "distinctOpportunityCount": 4, - "mean": 0.717155612244898, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-07-13T00:00:00Z", - "weekEnd": "2026-07-20T00:00:00Z", - "runCount": 6, - "numericCount": 3, - "distinctOpportunityCount": 3, - "mean": 0.6666666666666666, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-07-20T00:00:00Z", - "weekEnd": "2026-07-27T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.5, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-07-27T00:00:00Z", - "weekEnd": "2026-08-03T00:00:00Z", - "runCount": 6, - "numericCount": 3, - "distinctOpportunityCount": 3, - "mean": 0.3333333333333333, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-08-03T00:00:00Z", - "weekEnd": "2026-08-10T00:00:00Z", - "runCount": 5, - "numericCount": 2, - "distinctOpportunityCount": 2, - "mean": 0.9831029185867896, - "minimum": 0.9662058371735791, - "maximum": 1 - }, - { - "weekStart": "2026-08-10T00:00:00Z", - "weekEnd": "2026-08-17T00:00:00Z", - "runCount": 5, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 1, - "minimum": 1, - "maximum": 1 - }, - { - "weekStart": "2026-08-17T00:00:00Z", - "weekEnd": "2026-08-24T00:00:00Z", - "runCount": 5, - "numericCount": 5, - "distinctOpportunityCount": 5, - "mean": 1, - "minimum": 1, - "maximum": 1 - }, - { - "weekStart": "2026-08-24T00:00:00Z", - "weekEnd": "2026-08-31T00:00:00Z", - "runCount": 5, - "numericCount": 3, - "distinctOpportunityCount": 3, - "mean": 0.34472934472934474, - "minimum": 0, - "maximum": 1 - }, - { - "weekStart": "2026-08-31T00:00:00Z", - "weekEnd": "2026-09-07T00:00:00Z", - "runCount": 1, - "numericCount": 1, - "distinctOpportunityCount": 1, - "mean": 0.03418803418803419, - "minimum": 0.03418803418803419, - "maximum": 0.03418803418803419 - } - ], - "diagnostics": [ - { - "metric": { - "id": "largest-file-health", - "name": "Largest-file health at assignment", - "formula": "min(1, 999 / initialLines) when the assignment archive contains eligible files.", - "direction": "higher_is_better", - "aggregation": "latest" - }, - "summary": { - "mean": 0.8133351891636648, - "median": 0.8545765611633875, - "minimum": 0.523859465128474, - "maximum": 0.999, - "first": 0.523859465128474, - "latest": 0.9207373271889401, - "change": 0.39687786206046605, - "latestDeltaFromBaseline": null - }, - "weekly": [ - { - "weekStart": "2025-11-10T00:00:00Z", - "weekEnd": "2025-11-17T00:00:00Z", - "numericCount": 4, - "value": 0.5546918378678511 - }, - { - "weekStart": "2025-11-17T00:00:00Z", - "weekEnd": "2025-11-24T00:00:00Z", - "numericCount": 7, - "value": 0.5546918378678511 - }, - { - "weekStart": "2025-11-24T00:00:00Z", - "weekEnd": "2025-12-01T00:00:00Z", - "numericCount": 5, - "value": 0.5516289342904472 - }, - { - "weekStart": "2025-12-01T00:00:00Z", - "weekEnd": "2025-12-08T00:00:00Z", - "numericCount": 5, - "value": 0.5721649484536082 - }, - { - "weekStart": "2025-12-08T00:00:00Z", - "weekEnd": "2025-12-15T00:00:00Z", - "numericCount": 4, - "value": 0.6529411764705882 - }, - { - "weekStart": "2025-12-15T00:00:00Z", - "weekEnd": "2025-12-22T00:00:00Z", - "numericCount": 7, - "value": 0.7720247295208655 - }, - { - "weekStart": "2025-12-22T00:00:00Z", - "weekEnd": "2025-12-29T00:00:00Z", - "numericCount": 15, - "value": 0.8560411311053985 - }, - { - "weekStart": "2025-12-29T00:00:00Z", - "weekEnd": "2026-01-05T00:00:00Z", - "numericCount": 9, - "value": 0.950523311132255 - }, - { - "weekStart": "2026-01-05T00:00:00Z", - "weekEnd": "2026-01-12T00:00:00Z", - "numericCount": 5, - "value": 0.8175122749590835 - }, - { - "weekStart": "2026-01-12T00:00:00Z", - "weekEnd": "2026-01-19T00:00:00Z", - "numericCount": 6, - "value": 0.7738187451587917 - }, - { - "weekStart": "2026-01-19T00:00:00Z", - "weekEnd": "2026-01-26T00:00:00Z", - "numericCount": 5, - "value": 0.8864241348713399 - }, - { - "weekStart": "2026-01-26T00:00:00Z", - "weekEnd": "2026-02-02T00:00:00Z", - "numericCount": 5, - "value": 0.999 - }, - { - "weekStart": "2026-02-02T00:00:00Z", - "weekEnd": "2026-02-09T00:00:00Z", - "numericCount": 5, - "value": 0.9353932584269663 - }, - { - "weekStart": "2026-02-09T00:00:00Z", - "weekEnd": "2026-02-16T00:00:00Z", - "numericCount": 5, - "value": 0.7427509293680298 - }, - { - "weekStart": "2026-02-16T00:00:00Z", - "weekEnd": "2026-02-23T00:00:00Z", - "numericCount": 5, - "value": 0.728134110787172 - }, - { - "weekStart": "2026-02-23T00:00:00Z", - "weekEnd": "2026-03-02T00:00:00Z", - "numericCount": 8, - "value": 0.903254972875226 - }, - { - "weekStart": "2026-03-02T00:00:00Z", - "weekEnd": "2026-03-09T00:00:00Z", - "numericCount": 5, - "value": 0.9930417495029821 - }, - { - "weekStart": "2026-03-09T00:00:00Z", - "weekEnd": "2026-03-16T00:00:00Z", - "numericCount": 8, - "value": 0.9661508704061895 - }, - { - "weekStart": "2026-03-16T00:00:00Z", - "weekEnd": "2026-03-23T00:00:00Z", - "numericCount": 14, - "value": 0.8872113676731794 - }, - { - "weekStart": "2026-03-23T00:00:00Z", - "weekEnd": "2026-03-30T00:00:00Z", - "numericCount": 5, - "value": 0.75 - }, - { - "weekStart": "2026-03-30T00:00:00Z", - "weekEnd": "2026-04-06T00:00:00Z", - "numericCount": 5, - "value": 0.75 - }, - { - "weekStart": "2026-04-06T00:00:00Z", - "weekEnd": "2026-04-13T00:00:00Z", - "numericCount": 5, - "value": 0.75 - }, - { - "weekStart": "2026-04-13T00:00:00Z", - "weekEnd": "2026-04-20T00:00:00Z", - "numericCount": 5, - "value": 0.9215867158671587 - }, - { - "weekStart": "2026-04-20T00:00:00Z", - "weekEnd": "2026-04-27T00:00:00Z", - "numericCount": 5, - "value": 0.9842364532019704 - }, - { - "weekStart": "2026-04-27T00:00:00Z", - "weekEnd": "2026-05-04T00:00:00Z", - "numericCount": 5, - "value": 0.9190432382704692 - }, - { - "weekStart": "2026-05-04T00:00:00Z", - "weekEnd": "2026-05-11T00:00:00Z", - "numericCount": 6, - "value": 0.9173553719008265 - }, - { - "weekStart": "2026-05-11T00:00:00Z", - "weekEnd": "2026-05-18T00:00:00Z", - "numericCount": 5, - "value": 0.8523890784982935 - }, - { - "weekStart": "2026-05-18T00:00:00Z", - "weekEnd": "2026-05-25T00:00:00Z", - "numericCount": 5, - "value": 0.8181818181818182 - }, - { - "weekStart": "2026-05-25T00:00:00Z", - "weekEnd": "2026-06-01T00:00:00Z", - "numericCount": 5, - "value": 0.5373856912318451 - }, - { - "weekStart": "2026-06-01T00:00:00Z", - "weekEnd": "2026-06-08T00:00:00Z", - "numericCount": 5, - "value": 0.5353697749196141 - }, - { - "weekStart": "2026-06-08T00:00:00Z", - "weekEnd": "2026-06-15T00:00:00Z", - "numericCount": 5, - "value": 0.6923076923076923 - }, - { - "weekStart": "2026-06-15T00:00:00Z", - "weekEnd": "2026-06-22T00:00:00Z", - "numericCount": 5, - "value": 0.6403846153846153 - }, - { - "weekStart": "2026-06-22T00:00:00Z", - "weekEnd": "2026-06-29T00:00:00Z", - "numericCount": 4, - "value": 0.6478599221789884 - }, - { - "weekStart": "2026-06-29T00:00:00Z", - "weekEnd": "2026-07-06T00:00:00Z", - "numericCount": 5, - "value": 0.6457659987071752 - }, - { - "weekStart": "2026-07-06T00:00:00Z", - "weekEnd": "2026-07-13T00:00:00Z", - "numericCount": 5, - "value": 0.8444632290786137 - }, - { - "weekStart": "2026-07-13T00:00:00Z", - "weekEnd": "2026-07-20T00:00:00Z", - "numericCount": 6, - "value": 0.8311148086522463 - }, - { - "weekStart": "2026-07-20T00:00:00Z", - "weekEnd": "2026-07-27T00:00:00Z", - "numericCount": 5, - "value": 0.8755477651183172 - }, - { - "weekStart": "2026-07-27T00:00:00Z", - "weekEnd": "2026-08-03T00:00:00Z", - "numericCount": 6, - "value": 0.8679409209383145 - }, - { - "weekStart": "2026-08-03T00:00:00Z", - "weekEnd": "2026-08-10T00:00:00Z", - "numericCount": 5, - "value": 0.8702090592334495 - }, - { - "weekStart": "2026-08-10T00:00:00Z", - "weekEnd": "2026-08-17T00:00:00Z", - "numericCount": 5, - "value": 0.8732517482517482 - }, - { - "weekStart": "2026-08-17T00:00:00Z", - "weekEnd": "2026-08-24T00:00:00Z", - "numericCount": 5, - "value": 0.9215867158671587 - }, - { - "weekStart": "2026-08-24T00:00:00Z", - "weekEnd": "2026-08-31T00:00:00Z", - "numericCount": 5, - "value": 0.9207373271889401 - }, - { - "weekStart": "2026-08-31T00:00:00Z", - "weekEnd": "2026-09-07T00:00:00Z", - "numericCount": 1, - "value": 0.9207373271889401 - } - ] - }, - { - "metric": { - "id": "compliant-line-mass-share", - "name": "Compliant line-mass share at assignment", - "formula": "compliantLines / totalLines when the assignment archive contains eligible files and positive line mass.", - "direction": "higher_is_better", - "aggregation": "latest" - }, - "summary": { - "mean": 0.9419885134276278, - "median": 0.9546143576705618, - "minimum": 0.760136928880816, - "maximum": 0.993842372100169, - "first": 0.8486233922829582, - "latest": 0.9713929072193154, - "change": 0.12276951493635713, - "latestDeltaFromBaseline": null - }, - "weekly": [ - { - "weekStart": "2025-11-10T00:00:00Z", - "weekEnd": "2025-11-17T00:00:00Z", - "numericCount": 4, - "value": 0.8618649560434082 - }, - { - "weekStart": "2025-11-17T00:00:00Z", - "weekEnd": "2025-11-24T00:00:00Z", - "numericCount": 7, - "value": 0.8149490983359985 - }, - { - "weekStart": "2025-11-24T00:00:00Z", - "weekEnd": "2025-12-01T00:00:00Z", - "numericCount": 5, - "value": 0.781981850117096 - }, - { - "weekStart": "2025-12-01T00:00:00Z", - "weekEnd": "2025-12-08T00:00:00Z", - "numericCount": 5, - "value": 0.8023688894974668 - }, - { - "weekStart": "2025-12-08T00:00:00Z", - "weekEnd": "2025-12-15T00:00:00Z", - "numericCount": 4, - "value": 0.8205175991153851 - }, - { - "weekStart": "2025-12-15T00:00:00Z", - "weekEnd": "2025-12-22T00:00:00Z", - "numericCount": 7, - "value": 0.9083408460669413 - }, - { - "weekStart": "2025-12-22T00:00:00Z", - "weekEnd": "2025-12-29T00:00:00Z", - "numericCount": 15, - "value": 0.9509946002812577 - }, - { - "weekStart": "2025-12-29T00:00:00Z", - "weekEnd": "2026-01-05T00:00:00Z", - "numericCount": 9, - "value": 0.9689101330686812 - }, - { - "weekStart": "2026-01-05T00:00:00Z", - "weekEnd": "2026-01-12T00:00:00Z", - "numericCount": 5, - "value": 0.9881507626370856 - }, - { - "weekStart": "2026-01-12T00:00:00Z", - "weekEnd": "2026-01-19T00:00:00Z", - "numericCount": 6, - "value": 0.9482633231148794 - }, - { - "weekStart": "2026-01-19T00:00:00Z", - "weekEnd": "2026-01-26T00:00:00Z", - "numericCount": 5, - "value": 0.9627810415654402 - }, - { - "weekStart": "2026-01-26T00:00:00Z", - "weekEnd": "2026-02-02T00:00:00Z", - "numericCount": 5, - "value": 0.9825832520551763 - }, - { - "weekStart": "2026-02-02T00:00:00Z", - "weekEnd": "2026-02-09T00:00:00Z", - "numericCount": 5, - "value": 0.9737351536413205 - }, - { - "weekStart": "2026-02-09T00:00:00Z", - "weekEnd": "2026-02-16T00:00:00Z", - "numericCount": 5, - "value": 0.9720196627384595 - }, - { - "weekStart": "2026-02-16T00:00:00Z", - "weekEnd": "2026-02-23T00:00:00Z", - "numericCount": 5, - "value": 0.9648653287974782 - }, - { - "weekStart": "2026-02-23T00:00:00Z", - "weekEnd": "2026-03-02T00:00:00Z", - "numericCount": 8, - "value": 0.9682411529465027 - }, - { - "weekStart": "2026-03-02T00:00:00Z", - "weekEnd": "2026-03-09T00:00:00Z", - "numericCount": 5, - "value": 0.9919994273944059 - }, - { - "weekStart": "2026-03-09T00:00:00Z", - "weekEnd": "2026-03-16T00:00:00Z", - "numericCount": 8, - "value": 0.9921567437591499 - }, - { - "weekStart": "2026-03-16T00:00:00Z", - "weekEnd": "2026-03-23T00:00:00Z", - "numericCount": 14, - "value": 0.9618098978330664 - }, - { - "weekStart": "2026-03-23T00:00:00Z", - "weekEnd": "2026-03-30T00:00:00Z", - "numericCount": 5, - "value": 0.9554913334196697 - }, - { - "weekStart": "2026-03-30T00:00:00Z", - "weekEnd": "2026-04-06T00:00:00Z", - "numericCount": 5, - "value": 0.9771051739381893 - }, - { - "weekStart": "2026-04-06T00:00:00Z", - "weekEnd": "2026-04-13T00:00:00Z", - "numericCount": 5, - "value": 0.9569036420181458 - }, - { - "weekStart": "2026-04-13T00:00:00Z", - "weekEnd": "2026-04-20T00:00:00Z", - "numericCount": 5, - "value": 0.9870325581395348 - }, - { - "weekStart": "2026-04-20T00:00:00Z", - "weekEnd": "2026-04-27T00:00:00Z", - "numericCount": 5, - "value": 0.9878794070103539 - }, - { - "weekStart": "2026-04-27T00:00:00Z", - "weekEnd": "2026-05-04T00:00:00Z", - "numericCount": 5, - "value": 0.9761683922505247 - }, - { - "weekStart": "2026-05-04T00:00:00Z", - "weekEnd": "2026-05-11T00:00:00Z", - "numericCount": 6, - "value": 0.959350445259298 - }, - { - "weekStart": "2026-05-11T00:00:00Z", - "weekEnd": "2026-05-18T00:00:00Z", - "numericCount": 5, - "value": 0.9541232317178949 - }, - { - "weekStart": "2026-05-18T00:00:00Z", - "weekEnd": "2026-05-25T00:00:00Z", - "numericCount": 5, - "value": 0.9502870478177814 - }, - { - "weekStart": "2026-05-25T00:00:00Z", - "weekEnd": "2026-06-01T00:00:00Z", - "numericCount": 5, - "value": 0.9325868372943327 - }, - { - "weekStart": "2026-06-01T00:00:00Z", - "weekEnd": "2026-06-08T00:00:00Z", - "numericCount": 5, - "value": 0.9219581042232042 - }, - { - "weekStart": "2026-06-08T00:00:00Z", - "weekEnd": "2026-06-15T00:00:00Z", - "numericCount": 5, - "value": 0.926025888185073 - }, - { - "weekStart": "2026-06-15T00:00:00Z", - "weekEnd": "2026-06-22T00:00:00Z", - "numericCount": 5, - "value": 0.9213024556339775 - }, - { - "weekStart": "2026-06-22T00:00:00Z", - "weekEnd": "2026-06-29T00:00:00Z", - "numericCount": 4, - "value": 0.9185062610244678 - }, - { - "weekStart": "2026-06-29T00:00:00Z", - "weekEnd": "2026-07-06T00:00:00Z", - "numericCount": 5, - "value": 0.9212554384257066 - }, - { - "weekStart": "2026-07-06T00:00:00Z", - "weekEnd": "2026-07-13T00:00:00Z", - "numericCount": 5, - "value": 0.9547756738136496 - }, - { - "weekStart": "2026-07-13T00:00:00Z", - "weekEnd": "2026-07-20T00:00:00Z", - "numericCount": 6, - "value": 0.9491611509928213 - }, - { - "weekStart": "2026-07-20T00:00:00Z", - "weekEnd": "2026-07-27T00:00:00Z", - "numericCount": 5, - "value": 0.9547289244895966 - }, - { - "weekStart": "2026-07-27T00:00:00Z", - "weekEnd": "2026-08-03T00:00:00Z", - "numericCount": 6, - "value": 0.947392645621189 - }, - { - "weekStart": "2026-08-03T00:00:00Z", - "weekEnd": "2026-08-10T00:00:00Z", - "numericCount": 5, - "value": 0.9365090074893732 - }, - { - "weekStart": "2026-08-10T00:00:00Z", - "weekEnd": "2026-08-17T00:00:00Z", - "numericCount": 5, - "value": 0.9374191002658858 - }, - { - "weekStart": "2026-08-17T00:00:00Z", - "weekEnd": "2026-08-24T00:00:00Z", - "numericCount": 5, - "value": 0.9585064776338303 - }, - { - "weekStart": "2026-08-24T00:00:00Z", - "weekEnd": "2026-08-31T00:00:00Z", - "numericCount": 5, - "value": 0.9712714734145219 - }, - { - "weekStart": "2026-08-31T00:00:00Z", - "weekEnd": "2026-09-07T00:00:00Z", - "numericCount": 1, - "value": 0.9713929072193154 - } - ] - } - ], - "observations": [ - { - "run": { - "id": "19390621532", - "attempt": 1, - "createdAt": "2025-11-15T13:36:44Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19390621532", - "sha": "1186030a620f4113f655c156bedf70cf2c164f79", - "ref": "refs/heads/main", - "eventName": "workflow_dispatch" - }, - "value": 0.527363184079602, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/frontmatter.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-17T13:36:44Z", - "maturesAt": "2025-11-17T13:36:44Z", - "mature": true, - "case": { - "compliantLines": 50673, - "eligibleFileCount": 216, - "initialLines": 1907, - "path": "pkg/parser/frontmatter.go", - "subjectSha": "1186030a620f4113f655c156bedf70cf2c164f79", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 59712 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "46defeac0d92739fb785ea622793eeaec5e7a3f1", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/frontmatter.go@46defeac0d92739fb785ea622793eeaec5e7a3f1", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8486233922829582, - "currentLines": 1165, - "largest-file-health": 0.523859465128474 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19397085978", - "attempt": 1, - "createdAt": "2025-11-15T23:27:16Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19397085978", - "sha": "2f9b6047ac00e57ce0cf4408ece7abfa68059b15", - "ref": "refs/heads/main", - "eventName": "workflow_dispatch" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-17T23:27:16Z", - "maturesAt": "2025-11-17T23:27:16Z", - "mature": true, - "case": { - "compliantLines": 51750, - "eligibleFileCount": 220, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "2f9b6047ac00e57ce0cf4408ece7abfa68059b15", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 60062 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "fe7706df831f71c5590c920f5ee4fcc6c0364740", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@fe7706df831f71c5590c920f5ee4fcc6c0364740", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8616096700076588, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19397310710", - "attempt": 1, - "createdAt": "2025-11-15T23:48:56Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/19397310710", - "sha": "bb8319a1cdc8265cd1e6ec00454c7393a37fcf66", - "ref": "refs/heads/copilot/update-daily-team-status-workflow", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-17T23:48:56Z", - "maturesAt": "2025-11-17T23:48:56Z", - "mature": true, - "case": { - "compliantLines": 51861, - "eligibleFileCount": 220, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "bb8319a1cdc8265cd1e6ec00454c7393a37fcf66", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 60173 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "74cfd2523e0d6b9937bb5b6d8e13738d7ada3a7b", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@74cfd2523e0d6b9937bb5b6d8e13738d7ada3a7b", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8618649560434082, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19397818146", - "attempt": 1, - "createdAt": "2025-11-16T00:35:56Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/19397818146", - "sha": "f47d79cb6d63558379e6269d5236d10aac76b107", - "ref": "refs/heads/copilot/update-daily-team-status-workflow", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-18T00:35:56Z", - "maturesAt": "2025-11-18T00:35:56Z", - "mature": true, - "case": { - "compliantLines": 51861, - "eligibleFileCount": 220, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "f47d79cb6d63558379e6269d5236d10aac76b107", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 60173 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "a9b12cdfc74a796feb36a7d115c21879e5f6af8e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@a9b12cdfc74a796feb36a7d115c21879e5f6af8e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8618649560434082, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19430961649", - "attempt": 1, - "createdAt": "2025-11-17T13:17:30Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19430961649", - "sha": "46defeac0d92739fb785ea622793eeaec5e7a3f1", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-19T13:17:30Z", - "maturesAt": "2025-11-19T13:17:30Z", - "mature": true, - "case": { - "compliantLines": 52281, - "eligibleFileCount": 223, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "46defeac0d92739fb785ea622793eeaec5e7a3f1", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 60465 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "57f2cb94af26b4c2e5c76a5dc8d89d47ae1b2ccb", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@57f2cb94af26b4c2e5c76a5dc8d89d47ae1b2ccb", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8646489704787894, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19467551355", - "attempt": 1, - "createdAt": "2025-11-18T13:17:01Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19467551355", - "sha": "5605d471e857796243379a8d6d0eaaf44a9de2cb", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-20T13:17:01Z", - "maturesAt": "2025-11-20T13:17:01Z", - "mature": true, - "case": { - "compliantLines": 51455, - "eligibleFileCount": 227, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "5605d471e857796243379a8d6d0eaaf44a9de2cb", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 61762 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "15a5e046be29f91e3281674368c869a160fe4fa3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@15a5e046be29f91e3281674368c869a160fe4fa3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.833117450859752, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19473409411", - "attempt": 1, - "createdAt": "2025-11-18T16:28:15Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/19473409411", - "sha": "29a6e6a81de2df954a4ffdda319fe7bd5585a4b6", - "ref": "refs/heads/copilot/add-skip-if-match-field", - "eventName": "workflow_dispatch" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-20T16:28:15Z", - "maturesAt": "2025-11-20T16:28:15Z", - "mature": true, - "case": { - "compliantLines": 51535, - "eligibleFileCount": 227, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "29a6e6a81de2df954a4ffdda319fe7bd5585a4b6", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 61849 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "67c0ebd17c0cbfb305107db3ea9e0dde2827241f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@67c0ebd17c0cbfb305107db3ea9e0dde2827241f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8332390176073987, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19473876156", - "attempt": 1, - "createdAt": "2025-11-18T16:43:36Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19473876156", - "sha": "b77dc832139dfdf77d6ce4f603efad2922d89301", - "ref": "refs/heads/copilot/add-skip-if-match-field", - "eventName": "workflow_dispatch" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-20T16:43:36Z", - "maturesAt": "2025-11-20T16:43:36Z", - "mature": true, - "case": { - "compliantLines": 51535, - "eligibleFileCount": 227, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "b77dc832139dfdf77d6ce4f603efad2922d89301", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 61849 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "67c0ebd17c0cbfb305107db3ea9e0dde2827241f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@67c0ebd17c0cbfb305107db3ea9e0dde2827241f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8332390176073987, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19502652250", - "attempt": 1, - "createdAt": "2025-11-19T13:17:17Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19502652250", - "sha": "57f2cb94af26b4c2e5c76a5dc8d89d47ae1b2ccb", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-21T13:17:17Z", - "maturesAt": "2025-11-21T13:17:17Z", - "mature": true, - "case": { - "compliantLines": 51764, - "eligibleFileCount": 229, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "57f2cb94af26b4c2e5c76a5dc8d89d47ae1b2ccb", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 62161 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "aec39f5c0616f0c955ac387e5935bff262e2941c", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@aec39f5c0616f0c955ac387e5935bff262e2941c", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8327407860233909, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19538160005", - "attempt": 1, - "createdAt": "2025-11-20T13:16:24Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19538160005", - "sha": "15a5e046be29f91e3281674368c869a160fe4fa3", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-22T13:16:24Z", - "maturesAt": "2025-11-22T13:16:24Z", - "mature": true, - "case": { - "compliantLines": 51987, - "eligibleFileCount": 232, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "15a5e046be29f91e3281674368c869a160fe4fa3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 62469 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "4137d2b58ea85f38be71a2e33185e16d1a337f51", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@4137d2b58ea85f38be71a2e33185e16d1a337f51", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8322047735676896, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19571657852", - "attempt": 1, - "createdAt": "2025-11-21T13:15:11Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19571657852", - "sha": "aec39f5c0616f0c955ac387e5935bff262e2941c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-23T13:15:11Z", - "maturesAt": "2025-11-23T13:15:11Z", - "mature": true, - "case": { - "compliantLines": 51473, - "eligibleFileCount": 233, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "aec39f5c0616f0c955ac387e5935bff262e2941c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 63161 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "2c0f69c161033247e1a973d47b0ebda89cd74093", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@2c0f69c161033247e1a973d47b0ebda89cd74093", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8149490983359985, - "currentLines": 1801, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19635690172", - "attempt": 1, - "createdAt": "2025-11-24T13:17:57Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19635690172", - "sha": "008ca5384883851d6e47fec6149ff4b0a191529b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-26T13:17:57Z", - "maturesAt": "2025-11-26T13:17:57Z", - "mature": true, - "case": { - "compliantLines": 52343, - "eligibleFileCount": 237, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "008ca5384883851d6e47fec6149ff4b0a191529b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 65555 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f8cdb64506fe1656e237d112d74a72aa98e1174b", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@f8cdb64506fe1656e237d112d74a72aa98e1174b", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.7984593089771947, - "currentLines": 1811, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19670866472", - "attempt": 1, - "createdAt": "2025-11-25T13:17:56Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19670866472", - "sha": "af624cc48ae82f8197697d008793e3d61844fb0d", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-27T13:17:56Z", - "maturesAt": "2025-11-27T13:17:56Z", - "mature": true, - "case": { - "compliantLines": 52804, - "eligibleFileCount": 238, - "initialLines": 1801, - "path": "pkg/cli/trial_command.go", - "subjectSha": "af624cc48ae82f8197697d008793e3d61844fb0d", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 65971 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "60cfe786bb64d174365365c7a8f879ccf2fb14af", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@60cfe786bb64d174365365c7a8f879ccf2fb14af", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8004123023752862, - "currentLines": 1811, - "largest-file-health": 0.5546918378678511 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19705088630", - "attempt": 1, - "createdAt": "2025-11-26T13:19:01Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19705088630", - "sha": "f8cdb64506fe1656e237d112d74a72aa98e1174b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-28T13:19:01Z", - "maturesAt": "2025-11-28T13:19:01Z", - "mature": true, - "case": { - "compliantLines": 53013, - "eligibleFileCount": 240, - "initialLines": 1811, - "path": "pkg/cli/trial_command.go", - "subjectSha": "f8cdb64506fe1656e237d112d74a72aa98e1174b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 66269 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "1eafc4dab7c705fb219b8c5103e4ff990e6b5114", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@1eafc4dab7c705fb219b8c5103e4ff990e6b5114", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.7999668019737736, - "currentLines": 1811, - "largest-file-health": 0.5516289342904472 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19737552595", - "attempt": 1, - "createdAt": "2025-11-27T13:16:51Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19737552595", - "sha": "60cfe786bb64d174365365c7a8f879ccf2fb14af", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-29T13:16:51Z", - "maturesAt": "2025-11-29T13:16:51Z", - "mature": true, - "case": { - "compliantLines": 52616, - "eligibleFileCount": 241, - "initialLines": 1811, - "path": "pkg/cli/trial_command.go", - "subjectSha": "60cfe786bb64d174365365c7a8f879ccf2fb14af", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 67375 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "27c3e6e9637da61366e01b4546420f3ea94e7400", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@27c3e6e9637da61366e01b4546420f3ea94e7400", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.7809424860853432, - "currentLines": 1811, - "largest-file-health": 0.5516289342904472 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19764930505", - "attempt": 1, - "createdAt": "2025-11-28T13:16:39Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19764930505", - "sha": "1eafc4dab7c705fb219b8c5103e4ff990e6b5114", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-11-30T13:16:39Z", - "maturesAt": "2025-11-30T13:16:39Z", - "mature": true, - "case": { - "compliantLines": 53425, - "eligibleFileCount": 245, - "initialLines": 1811, - "path": "pkg/cli/trial_command.go", - "subjectSha": "1eafc4dab7c705fb219b8c5103e4ff990e6b5114", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 68320 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0ea3722186e0b6c3168fef0dface291bbc49fbd9", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@0ea3722186e0b6c3168fef0dface291bbc49fbd9", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.781981850117096, - "currentLines": 1811, - "largest-file-health": 0.5516289342904472 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19824047424", - "attempt": 1, - "createdAt": "2025-12-01T13:19:15Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19824047424", - "sha": "adfebdc6362ff576859e8a9da1bbb671f5094151", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.004576659038901602, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-03T13:19:15Z", - "maturesAt": "2025-12-03T13:19:15Z", - "mature": true, - "case": { - "compliantLines": 55273, - "eligibleFileCount": 250, - "initialLines": 1811, - "path": "pkg/cli/trial_command.go", - "subjectSha": "adfebdc6362ff576859e8a9da1bbb671f5094151", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 70374 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8228e168f32f4dfdde38e90a8b3329ac72fead9a", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@8228e168f32f4dfdde38e90a8b3329ac72fead9a", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.7854179100235883, - "currentLines": 1805, - "largest-file-health": 0.5516289342904472 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19860009854", - "attempt": 1, - "createdAt": "2025-12-02T13:19:40Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19860009854", - "sha": "4eb54d8fda6ce3440fafbe7ad338f18f80fcf6fe", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.004576659038901602, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-04T13:19:40Z", - "maturesAt": "2025-12-04T13:19:40Z", - "mature": true, - "case": { - "compliantLines": 54454, - "eligibleFileCount": 251, - "initialLines": 1811, - "path": "pkg/cli/trial_command.go", - "subjectSha": "4eb54d8fda6ce3440fafbe7ad338f18f80fcf6fe", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 70513 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6f97e5b1bd970ac7b6da5cbbd40f9753be99c440", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@6f97e5b1bd970ac7b6da5cbbd40f9753be99c440", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.7722547615333343, - "currentLines": 1805, - "largest-file-health": 0.5516289342904472 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19895238505", - "attempt": 1, - "createdAt": "2025-12-03T13:19:14Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19895238505", - "sha": "8228e168f32f4dfdde38e90a8b3329ac72fead9a", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.6597701149425287, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-05T13:19:14Z", - "maturesAt": "2025-12-05T13:19:14Z", - "mature": true, - "case": { - "compliantLines": 54403, - "eligibleFileCount": 257, - "initialLines": 1805, - "path": "pkg/cli/trial_command.go", - "subjectSha": "8228e168f32f4dfdde38e90a8b3329ac72fead9a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 71570 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "03e7f05f3e62765a05a0d7ca11b36f3735f857a5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@03e7f05f3e62765a05a0d7ca11b36f3735f857a5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.760136928880816, - "currentLines": 944, - "largest-file-health": 0.5534626038781163 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19930389502", - "attempt": 1, - "createdAt": "2025-12-04T13:19:50Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19930389502", - "sha": "6f97e5b1bd970ac7b6da5cbbd40f9753be99c440", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.6597701149425287, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-06T13:19:50Z", - "maturesAt": "2025-12-06T13:19:50Z", - "mature": true, - "case": { - "compliantLines": 54854, - "eligibleFileCount": 259, - "initialLines": 1805, - "path": "pkg/cli/trial_command.go", - "subjectSha": "6f97e5b1bd970ac7b6da5cbbd40f9753be99c440", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 72061 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b4bb6e4399445209f0b1ef641d5a533f20425fb5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@b4bb6e4399445209f0b1ef641d5a533f20425fb5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.761216191837471, - "currentLines": 944, - "largest-file-health": 0.5534626038781163 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "19964153215", - "attempt": 1, - "createdAt": "2025-12-05T13:17:05Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/19964153215", - "sha": "03e7f05f3e62765a05a0d7ca11b36f3735f857a5", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-07T13:17:05Z", - "maturesAt": "2025-12-07T13:17:05Z", - "mature": true, - "case": { - "compliantLines": 58597, - "eligibleFileCount": 264, - "initialLines": 1746, - "path": "pkg/workflow/compiler.go", - "subjectSha": "03e7f05f3e62765a05a0d7ca11b36f3735f857a5", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 73030 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f7ae6d5c9c62bdd98bec70290b64dd9f3b1a860b", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler.go@f7ae6d5c9c62bdd98bec70290b64dd9f3b1a860b", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8023688894974668, - "currentLines": 423, - "largest-file-health": 0.5721649484536082 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20029487165", - "attempt": 1, - "createdAt": "2025-12-08T13:18:58Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20029487165", - "sha": "070b2b0cf6276840e4025f01023ae251108822fd", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-10T13:18:58Z", - "maturesAt": "2025-12-10T13:18:58Z", - "mature": true, - "case": { - "compliantLines": 62430, - "eligibleFileCount": 263, - "initialLines": 1620, - "path": "pkg/cli/logs.go", - "subjectSha": "070b2b0cf6276840e4025f01023ae251108822fd", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 76735 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "1e57bd7fa278ac4ba8886639d7b8edfeede85f78", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs.go@1e57bd7fa278ac4ba8886639d7b8edfeede85f78", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8135792011468039, - "currentLines": 1620, - "largest-file-health": 0.6166666666666667 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20064890300", - "attempt": 1, - "createdAt": "2025-12-09T13:19:21Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20064890300", - "sha": "a0856215d2366338b5919b40089aa626d50e52b9", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.25089285714285714, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-11T13:19:21Z", - "maturesAt": "2025-12-11T13:19:21Z", - "mature": true, - "case": { - "compliantLines": 63552, - "eligibleFileCount": 265, - "initialLines": 1620, - "path": "pkg/cli/logs.go", - "subjectSha": "a0856215d2366338b5919b40089aa626d50e52b9", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 78002 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0f4bcaf1c4b03c5d1f25ae556b3518f19b833cb6", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs.go@0f4bcaf1c4b03c5d1f25ae556b3518f19b833cb6", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8147483397861593, - "currentLines": 1339, - "largest-file-health": 0.6166666666666667 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20100026898", - "attempt": 1, - "createdAt": "2025-12-10T13:20:04Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20100026898", - "sha": "1e57bd7fa278ac4ba8886639d7b8edfeede85f78", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.2517857142857143, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-12T13:20:04Z", - "maturesAt": "2025-12-12T13:20:04Z", - "mature": true, - "case": { - "compliantLines": 64943, - "eligibleFileCount": 271, - "initialLines": 1620, - "path": "pkg/cli/logs.go", - "subjectSha": "1e57bd7fa278ac4ba8886639d7b8edfeede85f78", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 79655 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "dd2fa1404174025842d114278080996479a7dcf9", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs.go@dd2fa1404174025842d114278080996479a7dcf9", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8153034963279141, - "currentLines": 1338, - "largest-file-health": 0.6166666666666667 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20134500365", - "attempt": 1, - "createdAt": "2025-12-11T13:20:34Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20134500365", - "sha": "0f4bcaf1c4b03c5d1f25ae556b3518f19b833cb6", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-13T13:20:34Z", - "maturesAt": "2025-12-13T13:20:34Z", - "mature": true, - "case": { - "compliantLines": 66041, - "eligibleFileCount": 275, - "initialLines": 1530, - "path": "pkg/workflow/safe_outputs.go", - "subjectSha": "0f4bcaf1c4b03c5d1f25ae556b3518f19b833cb6", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 80487 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5fbe5f18769df003c3747fca47e5b735ea891c67", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs.go@5fbe5f18769df003c3747fca47e5b735ea891c67", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8205175991153851, - "currentLines": 8, - "largest-file-health": 0.6529411764705882 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20233713070", - "attempt": 1, - "createdAt": "2025-12-15T13:21:26Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20233713070", - "sha": "5df1c8bdbe917a04f85084ed0c47c4fc42e9bc82", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_jobs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-17T13:21:26Z", - "maturesAt": "2025-12-17T13:21:26Z", - "mature": true, - "case": { - "compliantLines": 72577, - "eligibleFileCount": 299, - "initialLines": 1456, - "path": "pkg/workflow/compiler_jobs.go", - "subjectSha": "5df1c8bdbe917a04f85084ed0c47c4fc42e9bc82", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 84043 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "a3230492af3934a33c210864a334881227c7ff6a", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_jobs.go@a3230492af3934a33c210864a334881227c7ff6a", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8635698392489559, - "currentLines": 1460, - "largest-file-health": 0.6861263736263736 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20323537118", - "attempt": 1, - "createdAt": "2025-12-18T02:05:51Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20323537118", - "sha": "183b122341b1a3a3aea05d3b1369661b6474a05d", - "ref": "refs/heads/main", - "eventName": "workflow_dispatch" - }, - "value": 0.8122119815668203, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-20T02:05:51Z", - "maturesAt": "2025-12-20T02:05:51Z", - "mature": true, - "case": { - "compliantLines": 75270, - "eligibleFileCount": 305, - "initialLines": 1368, - "path": "pkg/workflow/compiler_yaml.go", - "subjectSha": "183b122341b1a3a3aea05d3b1369661b6474a05d", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 86192 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "fb834ae6248f2dc4faa4bf3e8dd10a6b07d414ab", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml.go@fb834ae6248f2dc4faa4bf3e8dd10a6b07d414ab", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8732829032856878, - "currentLines": 663, - "largest-file-health": 0.7302631578947368 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20330678188", - "attempt": 1, - "createdAt": "2025-12-18T08:26:15Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20330678188", - "sha": "be592248104ad8c6c5b28cf7a21ea628df44aa71", - "ref": "refs/heads/main", - "eventName": "workflow_dispatch" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-20T08:26:15Z", - "maturesAt": "2025-12-20T08:26:15Z", - "mature": true, - "case": { - "compliantLines": 76605, - "eligibleFileCount": 309, - "initialLines": 1354, - "path": "pkg/cli/logs.go", - "subjectSha": "be592248104ad8c6c5b28cf7a21ea628df44aa71", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 86159 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "9d4acf9b26bb12b3997dc7e70ed53ddb387bcf01", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs.go@9d4acf9b26bb12b3997dc7e70ed53ddb387bcf01", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.8891119906219895, - "currentLines": 0, - "largest-file-health": 0.7378138847858198 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20338205995", - "attempt": 1, - "createdAt": "2025-12-18T13:15:53Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20338205995", - "sha": "ef76ed58dcf668b846b4c8232d58260ffa09872b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-20T13:15:53Z", - "maturesAt": "2025-12-20T13:15:53Z", - "mature": true, - "case": { - "compliantLines": 78144, - "eligibleFileCount": 314, - "initialLines": 1331, - "path": "pkg/cli/update_command.go", - "subjectSha": "ef76ed58dcf668b846b4c8232d58260ffa09872b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 86372 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "fcb4fe0eb0a9c28db4c3796fe10a8e34a0061075", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_command.go@fcb4fe0eb0a9c28db4c3796fe10a8e34a0061075", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9047376464595007, - "currentLines": 140, - "largest-file-health": 0.7505634861006761 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20349306145", - "attempt": 1, - "createdAt": "2025-12-18T19:46:39Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20349306145", - "sha": "6f33929ceb4c2c2809aaad309242a90e92b9b9b4", - "ref": "refs/heads/main", - "eventName": "workflow_dispatch" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-20T19:46:39Z", - "maturesAt": "2025-12-20T19:46:39Z", - "mature": true, - "case": { - "compliantLines": 78889, - "eligibleFileCount": 316, - "initialLines": 1331, - "path": "pkg/cli/update_command.go", - "subjectSha": "6f33929ceb4c2c2809aaad309242a90e92b9b9b4", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 87177 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "daf6f5e300d88d923f595e4551e5306392ec39f7", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_command.go@daf6f5e300d88d923f595e4551e5306392ec39f7", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9049290523876711, - "currentLines": 140, - "largest-file-health": 0.7505634861006761 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20350654702", - "attempt": 1, - "createdAt": "2025-12-18T20:39:42Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20350654702", - "sha": "5d01007743b745af08b717c5f3887aef7bb64fd1", - "ref": "refs/heads/main", - "eventName": "workflow_dispatch" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-20T20:39:42Z", - "maturesAt": "2025-12-20T20:39:42Z", - "mature": true, - "case": { - "compliantLines": 78890, - "eligibleFileCount": 316, - "initialLines": 1331, - "path": "pkg/cli/update_command.go", - "subjectSha": "5d01007743b745af08b717c5f3887aef7bb64fd1", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 87178 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3fe41c846e45f720196d6df06ddb0f79cae4fc34", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_command.go@3fe41c846e45f720196d6df06ddb0f79cae4fc34", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9049301429259675, - "currentLines": 140, - "largest-file-health": 0.7505634861006761 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20371111055", - "attempt": 1, - "createdAt": "2025-12-19T13:14:35Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20371111055", - "sha": "ad384cd6f7c89ac5b2c454f5a55e04c21f5c9f77", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/frontmatter.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-21T13:14:35Z", - "maturesAt": "2025-12-21T13:14:35Z", - "mature": true, - "case": { - "compliantLines": 79597, - "eligibleFileCount": 324, - "initialLines": 1294, - "path": "pkg/parser/frontmatter.go", - "subjectSha": "ad384cd6f7c89ac5b2c454f5a55e04c21f5c9f77", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 87629 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8b47d13d47980a132c4997a7393cd489c716db06", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/frontmatter.go@8b47d13d47980a132c4997a7393cd489c716db06", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9083408460669413, - "currentLines": 7, - "largest-file-health": 0.7720247295208655 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20432965851", - "attempt": 1, - "createdAt": "2025-12-22T13:14:59Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20432965851", - "sha": "6d718a6fc27f9096d87449aa90ec97356b621914", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_safe_outputs_consolidated.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-24T13:14:59Z", - "maturesAt": "2025-12-24T13:14:59Z", - "mature": true, - "case": { - "compliantLines": 83722, - "eligibleFileCount": 333, - "initialLines": 1368, - "path": "pkg/workflow/compiler_safe_outputs_consolidated.go", - "subjectSha": "6d718a6fc27f9096d87449aa90ec97356b621914", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 90755 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b78384c91c8112f0af4018c5fc61587ee06b8ec3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_safe_outputs_consolidated.go@b78384c91c8112f0af4018c5fc61587ee06b8ec3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9225056470717867, - "currentLines": 0, - "largest-file-health": 0.7302631578947368 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20461590547", - "attempt": 1, - "createdAt": "2025-12-23T13:09:49Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20461590547", - "sha": "d12c5ba1cb47dca62aab39a48135e713370929ff", - "ref": "refs/heads/copilot/convert-safe-outputs-to-require", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-25T13:09:49Z", - "maturesAt": "2025-12-25T13:09:49Z", - "mature": true, - "case": { - "compliantLines": 87666, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "d12c5ba1cb47dca62aab39a48135e713370929ff", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93337 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9392416726485745, - "currentLines": 1169, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20461729243", - "attempt": 1, - "createdAt": "2025-12-23T13:15:51Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20461729243", - "sha": "d15cf7301b9a503d826916248c4d34d645c49065", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-25T13:15:51Z", - "maturesAt": "2025-12-25T13:15:51Z", - "mature": true, - "case": { - "compliantLines": 87262, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "d15cf7301b9a503d826916248c4d34d645c49065", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 92933 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.938977542961058, - "currentLines": 1169, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20461867952", - "attempt": 1, - "createdAt": "2025-12-23T13:21:53Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20461867952", - "sha": "8a24e1eecb4f4bcd3cd7c0013c44ec30e61d92c0", - "ref": "refs/heads/copilot/convert-safe-outputs-to-require", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-25T13:21:53Z", - "maturesAt": "2025-12-25T13:21:53Z", - "mature": true, - "case": { - "compliantLines": 87670, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "8a24e1eecb4f4bcd3cd7c0013c44ec30e61d92c0", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93341 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.939244276363013, - "currentLines": 1169, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20463203435", - "attempt": 1, - "createdAt": "2025-12-23T14:21:39Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20463203435", - "sha": "7214a675061017c2b7b0acbba1e9c6ee0dc39afb", - "ref": "refs/heads/copilot/create-custom-action-setup-activation", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-25T14:21:39Z", - "maturesAt": "2025-12-25T14:21:39Z", - "mature": true, - "case": { - "compliantLines": 87670, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "7214a675061017c2b7b0acbba1e9c6ee0dc39afb", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93341 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.939244276363013, - "currentLines": 1169, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20463430842", - "attempt": 1, - "createdAt": "2025-12-23T14:31:32Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20463430842", - "sha": "5fff659e39916ee360c3ae406282a0287a21c988", - "ref": "refs/heads/copilot/create-custom-action-setup-activation", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-25T14:31:32Z", - "maturesAt": "2025-12-25T14:31:32Z", - "mature": true, - "case": { - "compliantLines": 87657, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "5fff659e39916ee360c3ae406282a0287a21c988", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93328 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9392358134750557, - "currentLines": 1169, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20463741542", - "attempt": 1, - "createdAt": "2025-12-23T14:45:08Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20463741542", - "sha": "d88a156ca145a1b0cb799a7e6a17846637583745", - "ref": "refs/heads/copilot/create-custom-action-setup-activation", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-25T14:45:08Z", - "maturesAt": "2025-12-25T14:45:08Z", - "mature": true, - "case": { - "compliantLines": 87656, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "d88a156ca145a1b0cb799a7e6a17846637583745", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93327 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.939235162386019, - "currentLines": 1169, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20486951241", - "attempt": 1, - "createdAt": "2025-12-24T13:13:46Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20486951241", - "sha": "b78384c91c8112f0af4018c5fc61587ee06b8ec3", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-26T13:13:46Z", - "maturesAt": "2025-12-26T13:13:46Z", - "mature": true, - "case": { - "compliantLines": 87906, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "b78384c91c8112f0af4018c5fc61587ee06b8ec3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93577 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "4a52df7a7ff1edf90ca111779aad9ba01194c6a5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@4a52df7a7ff1edf90ca111779aad9ba01194c6a5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9393975015228101, - "currentLines": 319, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20490551992", - "attempt": 1, - "createdAt": "2025-12-24T16:58:34Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20490551992", - "sha": "302209c093ccf17afe37f16b6dbbe7f93eb00fed", - "ref": "refs/heads/copilot/update-checkout-persist-credentials", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-26T16:58:34Z", - "maturesAt": "2025-12-26T16:58:34Z", - "mature": true, - "case": { - "compliantLines": 87931, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "302209c093ccf17afe37f16b6dbbe7f93eb00fed", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93602 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3069a7727b5fe2531629e7d4ffec5543de27d9e1", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@3069a7727b5fe2531629e7d4ffec5543de27d9e1", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.939413687741715, - "currentLines": 319, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20490847821", - "attempt": 1, - "createdAt": "2025-12-24T17:17:37Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20490847821", - "sha": "36a1ea5f483751c4e255fff00efd0a02a18e0396", - "ref": "refs/heads/copilot/update-checkout-persist-credentials", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-26T17:17:37Z", - "maturesAt": "2025-12-26T17:17:37Z", - "mature": true, - "case": { - "compliantLines": 87889, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "36a1ea5f483751c4e255fff00efd0a02a18e0396", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93560 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d8378794c305260c806abfddd2e528c1ee027a6e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@d8378794c305260c806abfddd2e528c1ee027a6e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9393864899529714, - "currentLines": 319, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20490887667", - "attempt": 1, - "createdAt": "2025-12-24T17:20:14Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20490887667", - "sha": "0b7ff7e11285c45182b5a5d9b153705d1296dcea", - "ref": "refs/heads/main", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-26T17:20:14Z", - "maturesAt": "2025-12-26T17:20:14Z", - "mature": true, - "case": { - "compliantLines": 87929, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "0b7ff7e11285c45182b5a5d9b153705d1296dcea", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93600 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d8378794c305260c806abfddd2e528c1ee027a6e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@d8378794c305260c806abfddd2e528c1ee027a6e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9394123931623931, - "currentLines": 319, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20490995855", - "attempt": 1, - "createdAt": "2025-12-24T17:27:17Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20490995855", - "sha": "8562aea6a857d0c2fc8e3a6c8107b14333bbf398", - "ref": "refs/heads/copilot/add-action-tag-field", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-26T17:27:17Z", - "maturesAt": "2025-12-26T17:27:17Z", - "mature": true, - "case": { - "compliantLines": 87937, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "8562aea6a857d0c2fc8e3a6c8107b14333bbf398", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93608 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "50e10936af5386f8b69f846574469dbd60273a98", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@50e10936af5386f8b69f846574469dbd60273a98", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9394175711477651, - "currentLines": 319, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20491009366", - "attempt": 1, - "createdAt": "2025-12-24T17:28:16Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20491009366", - "sha": "9f37466b43e8566ade680554293383786bbf2570", - "ref": "refs/heads/copilot/fix-syntax-error-lock-file", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-26T17:28:16Z", - "maturesAt": "2025-12-26T17:28:16Z", - "mature": true, - "case": { - "compliantLines": 87929, - "eligibleFileCount": 344, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "9f37466b43e8566ade680554293383786bbf2570", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93600 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "50e10936af5386f8b69f846574469dbd60273a98", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@50e10936af5386f8b69f846574469dbd60273a98", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9394123931623931, - "currentLines": 319, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20505681937", - "attempt": 1, - "createdAt": "2025-12-25T13:17:07Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20505681937", - "sha": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-27T13:17:07Z", - "maturesAt": "2025-12-27T13:17:07Z", - "mature": true, - "case": { - "compliantLines": 88197, - "eligibleFileCount": 345, - "initialLines": 1169, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "cd0863e27fed1a8c5984517376de29ad18d9b1bf", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93868 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "67317018f9a92e6fa1a7b803d77f3aea80b1c331", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@67317018f9a92e6fa1a7b803d77f3aea80b1c331", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9395853752077385, - "currentLines": 319, - "largest-file-health": 0.8545765611633875 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20523085216", - "attempt": 1, - "createdAt": "2025-12-26T13:17:24Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20523085216", - "sha": "4a52df7a7ff1edf90ca111779aad9ba01194c6a5", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/copilot_engine.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-28T13:17:24Z", - "maturesAt": "2025-12-28T13:17:24Z", - "mature": true, - "case": { - "compliantLines": 88588, - "eligibleFileCount": 349, - "initialLines": 1167, - "path": "pkg/workflow/copilot_engine.go", - "subjectSha": "4a52df7a7ff1edf90ca111779aad9ba01194c6a5", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 93153 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "655f3df96e545394721dfc24e3cdbb95d98e6951", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/copilot_engine.go@655f3df96e545394721dfc24e3cdbb95d98e6951", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9509946002812577, - "currentLines": 1167, - "largest-file-health": 0.8560411311053985 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20573850105", - "attempt": 1, - "createdAt": "2025-12-29T13:19:52Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20573850105", - "sha": "eb4c2d56bd481877fadb5d65336593dffb02129e", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/copilot_engine.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2025-12-31T13:19:52Z", - "maturesAt": "2025-12-31T13:19:52Z", - "mature": true, - "case": { - "compliantLines": 89997, - "eligibleFileCount": 358, - "initialLines": 1167, - "path": "pkg/workflow/copilot_engine.go", - "subjectSha": "eb4c2d56bd481877fadb5d65336593dffb02129e", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 94422 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5dec658239a404b25fdcbc4ce3d2e52e1bfb5ff8", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/copilot_engine.go@5dec658239a404b25fdcbc4ce3d2e52e1bfb5ff8", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9531359217131601, - "currentLines": 1172, - "largest-file-health": 0.8560411311053985 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20597447319", - "attempt": 1, - "createdAt": "2025-12-30T13:19:22Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20597447319", - "sha": "480afdab720ba9cd52aa29b044452b3cfac89841", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/compile_orchestrator.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-01T13:19:22Z", - "maturesAt": "2026-01-01T13:19:22Z", - "mature": true, - "case": { - "compliantLines": 90436, - "eligibleFileCount": 359, - "initialLines": 1191, - "path": "pkg/cli/compile_orchestrator.go", - "subjectSha": "480afdab720ba9cd52aa29b044452b3cfac89841", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 94969 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bb23b507f54c7effe3a0d603202271e3ba76e984", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/compile_orchestrator.go@bb23b507f54c7effe3a0d603202271e3ba76e984", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9522686350282724, - "currentLines": 262, - "largest-file-health": 0.8387909319899244 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20610415309", - "attempt": 1, - "createdAt": "2025-12-31T02:19:01Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20610415309", - "sha": "6c2c4ba20042b3e09f4460c4be575c3e438d6282", - "ref": "refs/heads/main", - "eventName": "workflow_dispatch" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/compile_orchestrator.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-02T02:19:01Z", - "maturesAt": "2026-01-02T02:19:01Z", - "mature": true, - "case": { - "compliantLines": 90556, - "eligibleFileCount": 361, - "initialLines": 1200, - "path": "pkg/cli/compile_orchestrator.go", - "subjectSha": "6c2c4ba20042b3e09f4460c4be575c3e438d6282", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 95098 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3f69006e767b824d95930d51af13520c7705433f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/compile_orchestrator.go@3f69006e767b824d95930d51af13520c7705433f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9522387431912344, - "currentLines": 267, - "largest-file-health": 0.8325 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20619788434", - "attempt": 1, - "createdAt": "2025-12-31T13:17:34Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20619788434", - "sha": "5dec658239a404b25fdcbc4ce3d2e52e1bfb5ff8", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/copilot_engine.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-02T13:17:34Z", - "maturesAt": "2026-01-02T13:17:34Z", - "mature": true, - "case": { - "compliantLines": 92356, - "eligibleFileCount": 367, - "initialLines": 1172, - "path": "pkg/workflow/copilot_engine.go", - "subjectSha": "5dec658239a404b25fdcbc4ce3d2e52e1bfb5ff8", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 95705 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6db53cf6074ecec91b73af625a10b4ad0135c181", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/copilot_engine.go@6db53cf6074ecec91b73af625a10b4ad0135c181", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9650070529230448, - "currentLines": 120, - "largest-file-health": 0.8523890784982935 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20639226414", - "attempt": 1, - "createdAt": "2026-01-01T13:18:25Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20639226414", - "sha": "bb23b507f54c7effe3a0d603202271e3ba76e984", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/copilot_engine.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-03T13:18:25Z", - "maturesAt": "2026-01-03T13:18:25Z", - "mature": true, - "case": { - "compliantLines": 92796, - "eligibleFileCount": 368, - "initialLines": 1235, - "path": "pkg/workflow/copilot_engine.go", - "subjectSha": "bb23b507f54c7effe3a0d603202271e3ba76e984", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 96208 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c2f6887aa1a2fe334a2bf51a94744fee38005672", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/copilot_engine.go@c2f6887aa1a2fe334a2bf51a94744fee38005672", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9645351737901214, - "currentLines": 120, - "largest-file-health": 0.8089068825910931 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20658682561", - "attempt": 1, - "createdAt": "2026-01-02T13:17:16Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20658682561", - "sha": "6db53cf6074ecec91b73af625a10b4ad0135c181", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/schema.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-04T13:17:16Z", - "maturesAt": "2026-01-04T13:17:16Z", - "mature": true, - "case": { - "compliantLines": 94861, - "eligibleFileCount": 377, - "initialLines": 1161, - "path": "pkg/parser/schema.go", - "subjectSha": "6db53cf6074ecec91b73af625a10b4ad0135c181", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 98041 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c7fd2f6e5a0f4827499253d1fbd3cd4813d4b1cf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/schema.go@c7fd2f6e5a0f4827499253d1fbd3cd4813d4b1cf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9675645903244561, - "currentLines": 0, - "largest-file-health": 0.8604651162790697 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20685188165", - "attempt": 1, - "createdAt": "2026-01-04T00:40:32Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20685188165", - "sha": "9a63cbd987c041d2f7ea4363107ea23d5f11486a", - "ref": "refs/heads/copilot/rename-detect-repo-visibility", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_safe_outputs_core.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-06T00:40:32Z", - "maturesAt": "2026-01-06T00:40:32Z", - "mature": true, - "case": { - "compliantLines": 95666, - "eligibleFileCount": 389, - "initialLines": 1051, - "path": "pkg/workflow/compiler_safe_outputs_core.go", - "subjectSha": "9a63cbd987c041d2f7ea4363107ea23d5f11486a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 98736 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "acac15963ed026dafda9ae3fa0d46c3e1182e058", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_safe_outputs_core.go@acac15963ed026dafda9ae3fa0d46c3e1182e058", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9689069842813158, - "currentLines": 32, - "largest-file-health": 0.950523311132255 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20685249115", - "attempt": 1, - "createdAt": "2026-01-04T00:45:59Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20685249115", - "sha": "3b8861f120d8a5c4d2e3de71853ba40989c6ab7f", - "ref": "refs/heads/copilot/rename-detect-repo-visibility", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_safe_outputs_core.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-06T00:45:59Z", - "maturesAt": "2026-01-06T00:45:59Z", - "mature": true, - "case": { - "compliantLines": 95666, - "eligibleFileCount": 389, - "initialLines": 1051, - "path": "pkg/workflow/compiler_safe_outputs_core.go", - "subjectSha": "3b8861f120d8a5c4d2e3de71853ba40989c6ab7f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 98736 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "4c52ee139595799c5b24f7229433f443bbc31df3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_safe_outputs_core.go@4c52ee139595799c5b24f7229433f443bbc31df3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9689069842813158, - "currentLines": 32, - "largest-file-health": 0.950523311132255 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20685352229", - "attempt": 1, - "createdAt": "2026-01-04T00:55:42Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/20685352229", - "sha": "3326a21f23a2dce9a9e1e91aacfb0df11f212a41", - "ref": "refs/heads/main", - "eventName": "push" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_safe_outputs_core.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-06T00:55:42Z", - "maturesAt": "2026-01-06T00:55:42Z", - "mature": true, - "case": { - "compliantLines": 95676, - "eligibleFileCount": 389, - "initialLines": 1051, - "path": "pkg/workflow/compiler_safe_outputs_core.go", - "subjectSha": "3326a21f23a2dce9a9e1e91aacfb0df11f212a41", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 98746 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "96fd8cc09692fbcf86b8c186a3dea666b0442eba", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_safe_outputs_core.go@96fd8cc09692fbcf86b8c186a3dea666b0442eba", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9689101330686812, - "currentLines": 32, - "largest-file-health": 0.950523311132255 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20716632453", - "attempt": 1, - "createdAt": "2026-01-05T13:18:36Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20716632453", - "sha": "8c17bd6cb28d1859ee7ef1855c6e54f516cc882b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_safe_outputs_core.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-07T13:18:36Z", - "maturesAt": "2026-01-07T13:18:36Z", - "mature": true, - "case": { - "compliantLines": 97767, - "eligibleFileCount": 394, - "initialLines": 1142, - "path": "pkg/workflow/compiler_safe_outputs_core.go", - "subjectSha": "8c17bd6cb28d1859ee7ef1855c6e54f516cc882b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 100928 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "23ee12e37ee152e8597fa649e292bee974b0d3af", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_safe_outputs_core.go@23ee12e37ee152e8597fa649e292bee974b0d3af", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9686806436271401, - "currentLines": 32, - "largest-file-health": 0.8747810858143608 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20749452757", - "attempt": 1, - "createdAt": "2026-01-06T13:17:02Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20749452757", - "sha": "0b96680be70a72010eca1f2b678ff20a4b8c0028", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/run_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-08T13:17:02Z", - "maturesAt": "2026-01-08T13:17:02Z", - "mature": true, - "case": { - "compliantLines": 100122, - "eligibleFileCount": 405, - "initialLines": 1043, - "path": "pkg/cli/run_command.go", - "subjectSha": "0b96680be70a72010eca1f2b678ff20a4b8c0028", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 102181 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "14edc7f7fff306391961879238c95bc449b84087", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/run_command.go@14edc7f7fff306391961879238c95bc449b84087", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9798494827805561, - "currentLines": 12, - "largest-file-health": 0.9578139980824545 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20782787018", - "attempt": 1, - "createdAt": "2026-01-07T13:17:53Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20782787018", - "sha": "23ee12e37ee152e8597fa649e292bee974b0d3af", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/runtime_setup.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-09T13:17:53Z", - "maturesAt": "2026-01-09T13:17:53Z", - "mature": true, - "case": { - "compliantLines": 100075, - "eligibleFileCount": 409, - "initialLines": 1016, - "path": "pkg/workflow/runtime_setup.go", - "subjectSha": "23ee12e37ee152e8597fa649e292bee974b0d3af", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 101091 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "508f9da34444c185223412fa2fb898a3b0e002cf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/runtime_setup.go@508f9da34444c185223412fa2fb898a3b0e002cf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9899496493258549, - "currentLines": 0, - "largest-file-health": 0.9832677165354331 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20818165287", - "attempt": 1, - "createdAt": "2026-01-08T13:18:16Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20818165287", - "sha": "14edc7f7fff306391961879238c95bc449b84087", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-10T13:18:16Z", - "maturesAt": "2026-01-10T13:18:16Z", - "mature": true, - "case": { - "compliantLines": 101008, - "eligibleFileCount": 415, - "initialLines": 1072, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "14edc7f7fff306391961879238c95bc449b84087", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 102080 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "e486b681b387b6bca6390d84ea23f8d52f65029d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@e486b681b387b6bca6390d84ea23f8d52f65029d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9894984326018809, - "currentLines": 1214, - "largest-file-health": 0.9319029850746269 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20853140701", - "attempt": 1, - "createdAt": "2026-01-09T13:17:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20853140701", - "sha": "508f9da34444c185223412fa2fb898a3b0e002cf", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.0110803324099723, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-11T13:17:20Z", - "maturesAt": "2026-01-11T13:17:20Z", - "mature": true, - "case": { - "compliantLines": 101907, - "eligibleFileCount": 416, - "initialLines": 1222, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "508f9da34444c185223412fa2fb898a3b0e002cf", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 103129 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c41635c7d070558f02ad01bd71bfb6844b8d62ce", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@c41635c7d070558f02ad01bd71bfb6844b8d62ce", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9881507626370856, - "currentLines": 1214, - "largest-file-health": 0.8175122749590835 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20920816416", - "attempt": 1, - "createdAt": "2026-01-12T13:18:50Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20920816416", - "sha": "48b91b559a023c9532b59b4d196f172305a1bcd5", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-14T13:18:50Z", - "maturesAt": "2026-01-14T13:18:50Z", - "mature": true, - "case": { - "compliantLines": 99037, - "eligibleFileCount": 417, - "initialLines": 1214, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "48b91b559a023c9532b59b4d196f172305a1bcd5", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 104455 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "e0d90d919ff04671af20583460c49ba775728fe2", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@e0d90d919ff04671af20583460c49ba775728fe2", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9481307740175196, - "currentLines": 1214, - "largest-file-health": 0.8228995057660626 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20958173458", - "attempt": 1, - "createdAt": "2026-01-13T13:18:35Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20958173458", - "sha": "1afb557495191539532592ec340c2578c09366ac", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-15T13:18:35Z", - "maturesAt": "2026-01-15T13:18:35Z", - "mature": true, - "case": { - "compliantLines": 99995, - "eligibleFileCount": 419, - "initialLines": 1214, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "1afb557495191539532592ec340c2578c09366ac", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 105434 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cf7682f55c49d04641fc9d8d4b8ebcc1d63d0ccc", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@cf7682f55c49d04641fc9d8d4b8ebcc1d63d0ccc", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9484132253352808, - "currentLines": 1214, - "largest-file-health": 0.8228995057660626 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "20995531260", - "attempt": 1, - "createdAt": "2026-01-14T13:18:33Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/20995531260", - "sha": "e0d90d919ff04671af20583460c49ba775728fe2", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.014005602240896359, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-16T13:18:33Z", - "maturesAt": "2026-01-16T13:18:33Z", - "mature": true, - "case": { - "compliantLines": 100464, - "eligibleFileCount": 420, - "initialLines": 1214, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "e0d90d919ff04671af20583460c49ba775728fe2", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 105912 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "ea400a69112f8283743a011c050d6e1465600da4", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@ea400a69112f8283743a011c050d6e1465600da4", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9485610695671879, - "currentLines": 1204, - "largest-file-health": 0.8228995057660626 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21032663218", - "attempt": 1, - "createdAt": "2026-01-15T13:18:04Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21032663218", - "sha": "cf7682f55c49d04641fc9d8d4b8ebcc1d63d0ccc", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-17T13:18:04Z", - "maturesAt": "2026-01-17T13:18:04Z", - "mature": true, - "case": { - "compliantLines": 101476, - "eligibleFileCount": 426, - "initialLines": 1214, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "cf7682f55c49d04641fc9d8d4b8ebcc1d63d0ccc", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 106930 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "4cfc11df47abf69e9d55ce3ecbb5b7501de5c254", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@4cfc11df47abf69e9d55ce3ecbb5b7501de5c254", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9489946694098943, - "currentLines": 1301, - "largest-file-health": 0.8228995057660626 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21067906616", - "attempt": 1, - "createdAt": "2026-01-16T13:17:19Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21067906616", - "sha": "ea400a69112f8283743a011c050d6e1465600da4", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-18T13:17:19Z", - "maturesAt": "2026-01-18T13:17:19Z", - "mature": true, - "case": { - "compliantLines": 102035, - "eligibleFileCount": 426, - "initialLines": 1204, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "ea400a69112f8283743a011c050d6e1465600da4", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 107568 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bf23b0b34511b5e2e4727f1b17e27175f7423546", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@bf23b0b34511b5e2e4727f1b17e27175f7423546", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9485627695969061, - "currentLines": 1301, - "largest-file-health": 0.829734219269103 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21078189318", - "attempt": 1, - "createdAt": "2026-01-16T19:24:25Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/21078189318", - "sha": "dceb0dda62453139ebcad07590ac9f6b071fde0a", - "ref": "refs/heads/copilot/update-docker-image-reference", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-18T19:24:25Z", - "maturesAt": "2026-01-18T19:24:25Z", - "mature": true, - "case": { - "compliantLines": 103007, - "eligibleFileCount": 430, - "initialLines": 1291, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "dceb0dda62453139ebcad07590ac9f6b071fde0a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 108627 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "580f0957f398f4c7bcb552b6a9d34c99ccda8fc6", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@580f0957f398f4c7bcb552b6a9d34c99ccda8fc6", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9482633231148794, - "currentLines": 1301, - "largest-file-health": 0.7738187451587917 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21139020290", - "attempt": 1, - "createdAt": "2026-01-19T13:20:25Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21139020290", - "sha": "b028428423f153d155a0e181548778e697176dd2", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp-config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-21T13:20:25Z", - "maturesAt": "2026-01-21T13:20:25Z", - "mature": true, - "case": { - "compliantLines": 103731, - "eligibleFileCount": 430, - "initialLines": 1301, - "path": "pkg/workflow/mcp-config.go", - "subjectSha": "b028428423f153d155a0e181548778e697176dd2", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 109479 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0aa864e36f0f141556716367ef7686cb209156fb", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp-config.go@0aa864e36f0f141556716367ef7686cb209156fb", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9474967802044227, - "currentLines": 0, - "largest-file-health": 0.7678708685626441 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21173015542", - "attempt": 1, - "createdAt": "2026-01-20T13:20:44Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21173015542", - "sha": "681167574d168bdc84fa8152fab1379ff97247ee", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/fix_codemods.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-22T13:20:44Z", - "maturesAt": "2026-01-22T13:20:44Z", - "mature": true, - "case": { - "compliantLines": 105342, - "eligibleFileCount": 435, - "initialLines": 1183, - "path": "pkg/cli/fix_codemods.go", - "subjectSha": "681167574d168bdc84fa8152fab1379ff97247ee", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 109789 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "7986ef45a3c16fd6692dfc3c4976a5b859444fa3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/fix_codemods.go@7986ef45a3c16fd6692dfc3c4976a5b859444fa3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9594950313783712, - "currentLines": 35, - "largest-file-health": 0.8444632290786137 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21211118946", - "attempt": 1, - "createdAt": "2026-01-21T13:20:15Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21211118946", - "sha": "0aa864e36f0f141556716367ef7686cb209156fb", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp_servers.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-23T13:20:15Z", - "maturesAt": "2026-01-23T13:20:15Z", - "mature": true, - "case": { - "compliantLines": 106385, - "eligibleFileCount": 448, - "initialLines": 1217, - "path": "pkg/workflow/mcp_servers.go", - "subjectSha": "0aa864e36f0f141556716367ef7686cb209156fb", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 110688 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "55c38ca013764d589191046776879fe45a5a24e8", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp_servers.go@55c38ca013764d589191046776879fe45a5a24e8", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.961124963862388, - "currentLines": 0, - "largest-file-health": 0.8208709942481512 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21250026924", - "attempt": 1, - "createdAt": "2026-01-22T13:20:52Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21250026924", - "sha": "7986ef45a3c16fd6692dfc3c4976a5b859444fa3", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.9931506849315068, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/schedule_parser.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-24T13:20:52Z", - "maturesAt": "2026-01-24T13:20:52Z", - "mature": true, - "case": { - "compliantLines": 108211, - "eligibleFileCount": 458, - "initialLines": 1084, - "path": "pkg/parser/schedule_parser.go", - "subjectSha": "7986ef45a3c16fd6692dfc3c4976a5b859444fa3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 112360 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f97a5879ba52e6d3c9ffb565a2ea097b55981aa1", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/schedule_parser.go@f97a5879ba52e6d3c9ffb565a2ea097b55981aa1", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9630740477038092, - "currentLines": 504, - "largest-file-health": 0.9215867158671587 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21287544489", - "attempt": 1, - "createdAt": "2026-01-23T13:19:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21287544489", - "sha": "55c38ca013764d589191046776879fe45a5a24e8", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/init.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-25T13:19:20Z", - "maturesAt": "2026-01-25T13:19:20Z", - "mature": true, - "case": { - "compliantLines": 108982, - "eligibleFileCount": 459, - "initialLines": 1127, - "path": "pkg/cli/init.go", - "subjectSha": "55c38ca013764d589191046776879fe45a5a24e8", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 113195 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6ff866ac09a110b149d89462e279350d617220b2", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/init.go@6ff866ac09a110b149d89462e279350d617220b2", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9627810415654402, - "currentLines": 1135, - "largest-file-health": 0.8864241348713399 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21359144897", - "attempt": 1, - "createdAt": "2026-01-26T13:20:41Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21359144897", - "sha": "37db5cce60a8df849132010045a1239764ebc456", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_inspect.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-28T13:20:41Z", - "maturesAt": "2026-01-28T13:20:41Z", - "mature": true, - "case": { - "compliantLines": 112286, - "eligibleFileCount": 470, - "initialLines": 1011, - "path": "pkg/cli/mcp_inspect.go", - "subjectSha": "37db5cce60a8df849132010045a1239764ebc456", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 115299 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8500e8d46f06208ae2e29d2e786d45de069421d6", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_inspect.go@8500e8d46f06208ae2e29d2e786d45de069421d6", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.973867943347297, - "currentLines": 258, - "largest-file-health": 0.9881305637982196 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21398784064", - "attempt": 1, - "createdAt": "2026-01-27T13:20:54Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21398784064", - "sha": "2ebf4d3bfec7cc49cd85ce448863bebc81b2b48b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.8481894150417827, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/add_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-29T13:20:54Z", - "maturesAt": "2026-01-29T13:20:54Z", - "mature": true, - "case": { - "compliantLines": 112368, - "eligibleFileCount": 476, - "initialLines": 1218, - "path": "pkg/cli/add_command.go", - "subjectSha": "2ebf4d3bfec7cc49cd85ce448863bebc81b2b48b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 116611 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d00e09c1320692ba5b52efcc1dca6dcfe241806c", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/add_command.go@d00e09c1320692ba5b52efcc1dca6dcfe241806c", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9636140672835324, - "currentLines": 609, - "largest-file-health": 0.8201970443349754 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21439877180", - "attempt": 1, - "createdAt": "2026-01-28T13:21:38Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21439877180", - "sha": "8500e8d46f06208ae2e29d2e786d45de069421d6", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.8481894150417827, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/add_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-30T13:21:38Z", - "maturesAt": "2026-01-30T13:21:38Z", - "mature": true, - "case": { - "compliantLines": 113243, - "eligibleFileCount": 483, - "initialLines": 1218, - "path": "pkg/cli/add_command.go", - "subjectSha": "8500e8d46f06208ae2e29d2e786d45de069421d6", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 117486 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "1b90e1274c45a43b0bf202f83cc7e05b1c55ea84", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/add_command.go@1b90e1274c45a43b0bf202f83cc7e05b1c55ea84", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9638850586452854, - "currentLines": 609, - "largest-file-health": 0.8201970443349754 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21479976022", - "attempt": 1, - "createdAt": "2026-01-29T13:27:54Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21479976022", - "sha": "d00e09c1320692ba5b52efcc1dca6dcfe241806c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/add_interactive.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-01-31T13:27:54Z", - "maturesAt": "2026-01-31T13:27:54Z", - "mature": true, - "case": { - "compliantLines": 114818, - "eligibleFileCount": 490, - "initialLines": 1025, - "path": "pkg/cli/add_interactive.go", - "subjectSha": "d00e09c1320692ba5b52efcc1dca6dcfe241806c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 117843 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "ca9702701ab5d17901960676d2c38265fef30549", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/add_interactive.go@ca9702701ab5d17901960676d2c38265fef30549", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.974330252963689, - "currentLines": 0, - "largest-file-health": 0.9746341463414634 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21517385442", - "attempt": 1, - "createdAt": "2026-01-30T13:26:41Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21517385442", - "sha": "1b90e1274c45a43b0bf202f83cc7e05b1c55ea84", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/trial_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-01T13:26:41Z", - "maturesAt": "2026-02-01T13:26:41Z", - "mature": true, - "case": { - "compliantLines": 112832, - "eligibleFileCount": 487, - "initialLines": 1000, - "path": "pkg/cli/trial_command.go", - "subjectSha": "1b90e1274c45a43b0bf202f83cc7e05b1c55ea84", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 114832 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bc19e9ff030bdefadb6720e167583124a900dbd9", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/trial_command.go@bc19e9ff030bdefadb6720e167583124a900dbd9", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9825832520551763, - "currentLines": 1000, - "largest-file-health": 0.999 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21591999156", - "attempt": 1, - "createdAt": "2026-02-02T13:29:37Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21591999156", - "sha": "ee76275455ff44f54c72a42a1fc6c3b4f7a0f1ca", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config_generation.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-04T13:29:37Z", - "maturesAt": "2026-02-04T13:29:37Z", - "mature": true, - "case": { - "compliantLines": 113777, - "eligibleFileCount": 485, - "initialLines": 1023, - "path": "pkg/workflow/safe_outputs_config_generation.go", - "subjectSha": "ee76275455ff44f54c72a42a1fc6c3b4f7a0f1ca", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 116800 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3e2edddc881d2a53bbd495f66226f0ec9c4dd2c4", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config_generation.go@3e2edddc881d2a53bbd495f66226f0ec9c4dd2c4", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9741181506849315, - "currentLines": 1023, - "largest-file-health": 0.9765395894428153 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21632117892", - "attempt": 1, - "createdAt": "2026-02-03T13:29:02Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21632117892", - "sha": "1f704ab8156e996b7554b040ae82453c0b7e2a3f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config_generation.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-05T13:29:02Z", - "maturesAt": "2026-02-05T13:29:02Z", - "mature": true, - "case": { - "compliantLines": 113914, - "eligibleFileCount": 486, - "initialLines": 1023, - "path": "pkg/workflow/safe_outputs_config_generation.go", - "subjectSha": "1f704ab8156e996b7554b040ae82453c0b7e2a3f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 116937 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "9ff2b5d670f7916902f06b7f6b61aaabc6b7f243", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config_generation.go@9ff2b5d670f7916902f06b7f6b61aaabc6b7f243", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9741484731094521, - "currentLines": 1023, - "largest-file-health": 0.9765395894428153 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21673324312", - "attempt": 1, - "createdAt": "2026-02-04T13:29:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21673324312", - "sha": "3e2edddc881d2a53bbd495f66226f0ec9c4dd2c4", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-06T13:29:20Z", - "maturesAt": "2026-02-06T13:29:20Z", - "mature": true, - "case": { - "compliantLines": 114004, - "eligibleFileCount": 486, - "initialLines": 1036, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "3e2edddc881d2a53bbd495f66226f0ec9c4dd2c4", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 117063 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c4e091835c7a94dc7d3acb8ed3ae145afb4995f3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@c4e091835c7a94dc7d3acb8ed3ae145afb4995f3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9738687715161921, - "currentLines": 1068, - "largest-file-health": 0.9642857142857143 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21713397002", - "attempt": 1, - "createdAt": "2026-02-05T13:30:39Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21713397002", - "sha": "9ff2b5d670f7916902f06b7f6b61aaabc6b7f243", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-07T13:30:39Z", - "maturesAt": "2026-02-07T13:30:39Z", - "mature": true, - "case": { - "compliantLines": 114594, - "eligibleFileCount": 488, - "initialLines": 1036, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "9ff2b5d670f7916902f06b7f6b61aaabc6b7f243", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 117669 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "20f99c5f44cfc373a6dc595e8243960c4f9974c2", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@20f99c5f44cfc373a6dc595e8243960c4f9974c2", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9738673737347985, - "currentLines": 1080, - "largest-file-health": 0.9642857142857143 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21752253536", - "attempt": 1, - "createdAt": "2026-02-06T13:28:48Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21752253536", - "sha": "c4e091835c7a94dc7d3acb8ed3ae145afb4995f3", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-08T13:28:48Z", - "maturesAt": "2026-02-08T13:28:48Z", - "mature": true, - "case": { - "compliantLines": 115188, - "eligibleFileCount": 489, - "initialLines": 1068, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "c4e091835c7a94dc7d3acb8ed3ae145afb4995f3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 118295 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "05bd9b6420627ae44d95fc34714e4964ec061d1f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@05bd9b6420627ae44d95fc34714e4964ec061d1f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9737351536413205, - "currentLines": 1088, - "largest-file-health": 0.9353932584269663 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21827150208", - "attempt": 1, - "createdAt": "2026-02-09T13:33:51Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21827150208", - "sha": "9f6666eb9a9de241d799ccd4d4c3cace911f310b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.11054421768707483, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-11T13:33:51Z", - "maturesAt": "2026-02-11T13:33:51Z", - "mature": true, - "case": { - "compliantLines": 116820, - "eligibleFileCount": 498, - "initialLines": 1088, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "9f6666eb9a9de241d799ccd4d4c3cace911f310b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 119947 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "215a84a2d53cdcff49723342c3ce1697efd90e42", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@215a84a2d53cdcff49723342c3ce1697efd90e42", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9739301524840138, - "currentLines": 1023, - "largest-file-health": 0.9181985294117647 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21866997470", - "attempt": 1, - "createdAt": "2026-02-10T13:33:58Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21866997470", - "sha": "c549967b5808d783bc1537cf5687896de4dec7ee", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.10884353741496598, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-12T13:33:58Z", - "maturesAt": "2026-02-12T13:33:58Z", - "mature": true, - "case": { - "compliantLines": 116949, - "eligibleFileCount": 498, - "initialLines": 1088, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "c549967b5808d783bc1537cf5687896de4dec7ee", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 120076 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "620c9904e221605bbf9b4bffc715dc5e741cc4a0", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@620c9904e221605bbf9b4bffc715dc5e741cc4a0", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9739581598321063, - "currentLines": 1024, - "largest-file-health": 0.9181985294117647 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21907155050", - "attempt": 1, - "createdAt": "2026-02-11T13:33:47Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21907155050", - "sha": "215a84a2d53cdcff49723342c3ce1697efd90e42", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config_generation.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-13T13:33:47Z", - "maturesAt": "2026-02-13T13:33:47Z", - "mature": true, - "case": { - "compliantLines": 117109, - "eligibleFileCount": 499, - "initialLines": 1028, - "path": "pkg/workflow/safe_outputs_config_generation.go", - "subjectSha": "215a84a2d53cdcff49723342c3ce1697efd90e42", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 120176 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "484b152d1da08e8668407834a6d821062b5edc02", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config_generation.go@484b152d1da08e8668407834a6d821062b5edc02", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9744790973239249, - "currentLines": 1073, - "largest-file-health": 0.9717898832684825 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21948711923", - "attempt": 1, - "createdAt": "2026-02-12T13:33:24Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21948711923", - "sha": "620c9904e221605bbf9b4bffc715dc5e741cc4a0", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config_generation.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-14T13:33:24Z", - "maturesAt": "2026-02-14T13:33:24Z", - "mature": true, - "case": { - "compliantLines": 118028, - "eligibleFileCount": 500, - "initialLines": 1028, - "path": "pkg/workflow/safe_outputs_config_generation.go", - "subjectSha": "620c9904e221605bbf9b4bffc715dc5e741cc4a0", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 121096 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "823fcf3eff7ae4b2ec1302025202063e2bcd837e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config_generation.go@823fcf3eff7ae4b2ec1302025202063e2bcd837e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9746647288102002, - "currentLines": 1073, - "largest-file-health": 0.9717898832684825 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "21988605819", - "attempt": 1, - "createdAt": "2026-02-13T13:29:19Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/21988605819", - "sha": "484b152d1da08e8668407834a6d821062b5edc02", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-15T13:29:19Z", - "maturesAt": "2026-02-15T13:29:19Z", - "mature": true, - "case": { - "compliantLines": 119434, - "eligibleFileCount": 503, - "initialLines": 1345, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "484b152d1da08e8668407834a6d821062b5edc02", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 122872 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "69ebd7eca4cb025d9bd113378ef1d4a6085e7635", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@69ebd7eca4cb025d9bd113378ef1d4a6085e7635", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9720196627384595, - "currentLines": 1345, - "largest-file-health": 0.7427509293680298 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22064690036", - "attempt": 1, - "createdAt": "2026-02-16T13:31:00Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22064690036", - "sha": "d23716e1fa527464403e05688a11d7879f4de6bf", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.014201183431952662, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-18T13:31:00Z", - "maturesAt": "2026-02-18T13:31:00Z", - "mature": true, - "case": { - "compliantLines": 121201, - "eligibleFileCount": 509, - "initialLines": 1345, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "d23716e1fa527464403e05688a11d7879f4de6bf", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 124656 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "26a0d4fa53459b3e322c5de338f6e931ab815a63", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@26a0d4fa53459b3e322c5de338f6e931ab815a63", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.972283724810679, - "currentLines": 1333, - "largest-file-health": 0.7427509293680298 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22100422522", - "attempt": 1, - "createdAt": "2026-02-17T13:31:03Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22100422522", - "sha": "bcbb10731b1b382622eb543ed7bef9a37456c76d", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-19T13:31:03Z", - "maturesAt": "2026-02-19T13:31:03Z", - "mature": true, - "case": { - "compliantLines": 121554, - "eligibleFileCount": 538, - "initialLines": 1333, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "bcbb10731b1b382622eb543ed7bef9a37456c76d", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 125985 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f5a6c65a740bb4286bfdcb27dea7691bbd7ebc07", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@f5a6c65a740bb4286bfdcb27dea7691bbd7ebc07", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9648291463269437, - "currentLines": 1333, - "largest-file-health": 0.7494373593398349 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22141795030", - "attempt": 1, - "createdAt": "2026-02-18T13:31:53Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/22141795030", - "sha": "26a0d4fa53459b3e322c5de338f6e931ab815a63", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-20T13:31:53Z", - "maturesAt": "2026-02-20T13:31:53Z", - "mature": true, - "case": { - "compliantLines": 120940, - "eligibleFileCount": 541, - "initialLines": 1333, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "26a0d4fa53459b3e322c5de338f6e931ab815a63", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 126501 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "84dee142b05519f8cf70d593cacc8cf664606d51", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@84dee142b05519f8cf70d593cacc8cf664606d51", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9560398732025833, - "currentLines": 1372, - "largest-file-health": 0.7494373593398349 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22183884465", - "attempt": 1, - "createdAt": "2026-02-19T13:32:53Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22183884465", - "sha": "f5a6c65a740bb4286bfdcb27dea7691bbd7ebc07", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-21T13:32:53Z", - "maturesAt": "2026-02-21T13:32:53Z", - "mature": true, - "case": { - "compliantLines": 121237, - "eligibleFileCount": 544, - "initialLines": 1333, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "f5a6c65a740bb4286bfdcb27dea7691bbd7ebc07", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 126793 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0ba5a8b05850d527bc1d45d9dc7d2218900011a4", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@0ba5a8b05850d527bc1d45d9dc7d2218900011a4", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9561805462446665, - "currentLines": 81, - "largest-file-health": 0.7494373593398349 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22225948334", - "attempt": 1, - "createdAt": "2026-02-20T13:28:10Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22225948334", - "sha": "03e2607507b215421fee982cdbd738dacc296c2b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/mcp_server.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-22T13:28:10Z", - "maturesAt": "2026-02-22T13:28:10Z", - "mature": true, - "case": { - "compliantLines": 123661, - "eligibleFileCount": 547, - "initialLines": 1372, - "path": "pkg/cli/mcp_server.go", - "subjectSha": "03e2607507b215421fee982cdbd738dacc296c2b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 128164 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "81342e5343c62414e46c55ca892f7f4bf056706c", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/mcp_server.go@81342e5343c62414e46c55ca892f7f4bf056706c", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9648653287974782, - "currentLines": 81, - "largest-file-health": 0.728134110787172 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22308275991", - "attempt": 1, - "createdAt": "2026-02-23T13:32:09Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22308275991", - "sha": "ef2fa31d80b793b624a645f83aff2ebc7bf7cca6", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-25T13:32:09Z", - "maturesAt": "2026-02-25T13:32:09Z", - "mature": true, - "case": { - "compliantLines": 126408, - "eligibleFileCount": 558, - "initialLines": 1104, - "path": "pkg/parser/import_processor.go", - "subjectSha": "ef2fa31d80b793b624a645f83aff2ebc7bf7cca6", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 130572 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b3c8c22089413cf8cb7b3e254298f822277b3d3e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@b3c8c22089413cf8cb7b3e254298f822277b3d3e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.96810954875471, - "currentLines": 1106, - "largest-file-health": 0.904891304347826 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22340323445", - "attempt": 1, - "createdAt": "2026-02-24T07:04:59Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/22340323445", - "sha": "2e2e452503c441931ffc939b81f5da30698b584a", - "ref": "refs/heads/merged_detection_job", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-26T07:04:59Z", - "maturesAt": "2026-02-26T07:04:59Z", - "mature": true, - "case": { - "compliantLines": 126641, - "eligibleFileCount": 558, - "initialLines": 1104, - "path": "pkg/parser/import_processor.go", - "subjectSha": "2e2e452503c441931ffc939b81f5da30698b584a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 130816 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9680849437377691, - "currentLines": 1106, - "largest-file-health": 0.904891304347826 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22340470018", - "attempt": 1, - "createdAt": "2026-02-24T07:10:27Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/22340470018", - "sha": "389bc350e0c6fc4ae331e7fcbaabcac8e6da3418", - "ref": "refs/heads/merged_detection_job", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-26T07:10:27Z", - "maturesAt": "2026-02-26T07:10:27Z", - "mature": true, - "case": { - "compliantLines": 126641, - "eligibleFileCount": 558, - "initialLines": 1104, - "path": "pkg/parser/import_processor.go", - "subjectSha": "389bc350e0c6fc4ae331e7fcbaabcac8e6da3418", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 130816 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9680849437377691, - "currentLines": 1106, - "largest-file-health": 0.904891304347826 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22340744368", - "attempt": 1, - "createdAt": "2026-02-24T07:20:59Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/22340744368", - "sha": "0b5f03df07605357d1542d4cb345f1e8967f20e3", - "ref": "refs/heads/merged_detection_job", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-26T07:20:59Z", - "maturesAt": "2026-02-26T07:20:59Z", - "mature": true, - "case": { - "compliantLines": 126642, - "eligibleFileCount": 558, - "initialLines": 1104, - "path": "pkg/parser/import_processor.go", - "subjectSha": "0b5f03df07605357d1542d4cb345f1e8967f20e3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 130817 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9680851877049619, - "currentLines": 1106, - "largest-file-health": 0.904891304347826 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22353073728", - "attempt": 1, - "createdAt": "2026-02-24T13:32:43Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22353073728", - "sha": "f1263e844a3510978484d69336e0f9245ebe3962", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-26T13:32:43Z", - "maturesAt": "2026-02-26T13:32:43Z", - "mature": true, - "case": { - "compliantLines": 126654, - "eligibleFileCount": 558, - "initialLines": 1104, - "path": "pkg/parser/import_processor.go", - "subjectSha": "f1263e844a3510978484d69336e0f9245ebe3962", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 130829 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9680881150203701, - "currentLines": 1106, - "largest-file-health": 0.904891304347826 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22399090298", - "attempt": 1, - "createdAt": "2026-02-25T13:32:22Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22399090298", - "sha": "b3c8c22089413cf8cb7b3e254298f822277b3d3e", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-27T13:32:22Z", - "maturesAt": "2026-02-27T13:32:22Z", - "mature": true, - "case": { - "compliantLines": 127996, - "eligibleFileCount": 563, - "initialLines": 1106, - "path": "pkg/parser/import_processor.go", - "subjectSha": "b3c8c22089413cf8cb7b3e254298f822277b3d3e", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 132173 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "86b5ad144ce7a8fb99ebb2ce697b6fe51fc33a83", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@86b5ad144ce7a8fb99ebb2ce697b6fe51fc33a83", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.968397479061533, - "currentLines": 1106, - "largest-file-health": 0.903254972875226 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22444341699", - "attempt": 1, - "createdAt": "2026-02-26T13:32:46Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/22444341699", - "sha": "bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-02-28T13:32:46Z", - "maturesAt": "2026-02-28T13:32:46Z", - "mature": true, - "case": { - "compliantLines": 128110, - "eligibleFileCount": 563, - "initialLines": 1106, - "path": "pkg/parser/import_processor.go", - "subjectSha": "bef7c14b4ae28c11f0730b94d30360cd75bbfc14", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 132294 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3d5916a6b280c9fd7f11c8edd37b6e11a793432c", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@3d5916a6b280c9fd7f11c8edd37b6e11a793432c", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9683734712080668, - "currentLines": 1106, - "largest-file-health": 0.903254972875226 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22488102624", - "attempt": 1, - "createdAt": "2026-02-27T13:27:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22488102624", - "sha": "2909018d91c4c737222183e78ce03f17eecf1fea", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_processor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-01T13:27:20Z", - "maturesAt": "2026-03-01T13:27:20Z", - "mature": true, - "case": { - "compliantLines": 128321, - "eligibleFileCount": 563, - "initialLines": 1106, - "path": "pkg/parser/import_processor.go", - "subjectSha": "2909018d91c4c737222183e78ce03f17eecf1fea", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 132530 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5fa65dd15a71cec00f2d14c664467154d343d875", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_processor.go@5fa65dd15a71cec00f2d14c664467154d343d875", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9682411529465027, - "currentLines": 98, - "largest-file-health": 0.903254972875226 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22578126726", - "attempt": 1, - "createdAt": "2026-03-02T13:28:46Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22578126726", - "sha": "b6f802b2eb89d23fdd91209a2ddf3b5fb0d2c7e7", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_activation_jobs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-04T13:28:46Z", - "maturesAt": "2026-03-04T13:28:46Z", - "mature": true, - "case": { - "compliantLines": 122726, - "eligibleFileCount": 551, - "initialLines": 1052, - "path": "pkg/workflow/compiler_activation_jobs.go", - "subjectSha": "b6f802b2eb89d23fdd91209a2ddf3b5fb0d2c7e7", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 125799 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6502173c86039158ce65fa9625fc89e3c007336c", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_activation_jobs.go@6502173c86039158ce65fa9625fc89e3c007336c", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9755721428628209, - "currentLines": 0, - "largest-file-health": 0.9496197718631179 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22625108583", - "attempt": 1, - "createdAt": "2026-03-03T13:27:41Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/22625108583", - "sha": "a86e657586e4ac5f549a790628971ec02f6a4a8f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp_renderer.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-05T13:27:41Z", - "maturesAt": "2026-03-05T13:27:41Z", - "mature": true, - "case": { - "compliantLines": 124480, - "eligibleFileCount": 554, - "initialLines": 1006, - "path": "pkg/workflow/mcp_renderer.go", - "subjectSha": "a86e657586e4ac5f549a790628971ec02f6a4a8f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 125486 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b2d8af7543ec40f72bb3b8fea5148c2d3ee401c7", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp_renderer.go@b2d8af7543ec40f72bb3b8fea5148c2d3ee401c7", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9919831694372281, - "currentLines": 1006, - "largest-file-health": 0.9930417495029821 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22671382998", - "attempt": 1, - "createdAt": "2026-03-04T13:27:05Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22671382998", - "sha": "6502173c86039158ce65fa9625fc89e3c007336c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp_renderer.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-06T13:27:05Z", - "maturesAt": "2026-03-06T13:27:05Z", - "mature": true, - "case": { - "compliantLines": 124870, - "eligibleFileCount": 554, - "initialLines": 1006, - "path": "pkg/workflow/mcp_renderer.go", - "subjectSha": "6502173c86039158ce65fa9625fc89e3c007336c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 125876 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "956f874e40e831c08a8b01ec76f5d49ae3fe8387", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp_renderer.go@956f874e40e831c08a8b01ec76f5d49ae3fe8387", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9920080078807716, - "currentLines": 1006, - "largest-file-health": 0.9930417495029821 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22720164203", - "attempt": 1, - "createdAt": "2026-03-05T13:29:32Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22720164203", - "sha": "b2d8af7543ec40f72bb3b8fea5148c2d3ee401c7", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp_renderer.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-07T13:29:32Z", - "maturesAt": "2026-03-07T13:29:32Z", - "mature": true, - "case": { - "compliantLines": 124718, - "eligibleFileCount": 554, - "initialLines": 1006, - "path": "pkg/workflow/mcp_renderer.go", - "subjectSha": "b2d8af7543ec40f72bb3b8fea5148c2d3ee401c7", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 125724 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "a359a3b50cc2c71e46e36cb9da5d4df7ce4cf943", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp_renderer.go@a359a3b50cc2c71e46e36cb9da5d4df7ce4cf943", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9919983455823869, - "currentLines": 1006, - "largest-file-health": 0.9930417495029821 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22765384896", - "attempt": 1, - "createdAt": "2026-03-06T13:25:38Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22765384896", - "sha": "956f874e40e831c08a8b01ec76f5d49ae3fe8387", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp_renderer.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-08T13:25:38Z", - "maturesAt": "2026-03-08T13:25:38Z", - "mature": true, - "case": { - "compliantLines": 124735, - "eligibleFileCount": 552, - "initialLines": 1006, - "path": "pkg/workflow/mcp_renderer.go", - "subjectSha": "956f874e40e831c08a8b01ec76f5d49ae3fe8387", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 125741 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "cdda009b70a9cbca13ff940a7f6a07b81b86f104", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp_renderer.go@cdda009b70a9cbca13ff940a7f6a07b81b86f104", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9919994273944059, - "currentLines": 1006, - "largest-file-health": 0.9930417495029821 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22855865903", - "attempt": 1, - "createdAt": "2026-03-09T13:31:40Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22855865903", - "sha": "e7a6f19f0c20526b98c3a7f2b642f5eee068cf51", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_generation.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-11T13:31:40Z", - "maturesAt": "2026-03-11T13:31:40Z", - "mature": true, - "case": { - "compliantLines": 121355, - "eligibleFileCount": 546, - "initialLines": 1549, - "path": "pkg/workflow/safe_outputs_generation.go", - "subjectSha": "e7a6f19f0c20526b98c3a7f2b642f5eee068cf51", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 127251 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "2b18793c034db7f5cad9b8e680f5546932fa2aa0", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_generation.go@2b18793c034db7f5cad9b8e680f5546932fa2aa0", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9536663759027434, - "currentLines": 7, - "largest-file-health": 0.644932214331827 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22904892817", - "attempt": 1, - "createdAt": "2026-03-10T13:30:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22904892817", - "sha": "aee512b1a4c638ed043831a5c6e8a733bac0b76d", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/remote_workflow.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-12T13:30:20Z", - "maturesAt": "2026-03-12T13:30:20Z", - "mature": true, - "case": { - "compliantLines": 124385, - "eligibleFileCount": 552, - "initialLines": 1255, - "path": "pkg/cli/remote_workflow.go", - "subjectSha": "aee512b1a4c638ed043831a5c6e8a733bac0b76d", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 127709 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d64fc1dee1eff5a5e05858e0842febd433f606d1", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/remote_workflow.go@d64fc1dee1eff5a5e05858e0842febd433f606d1", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9739720771441324, - "currentLines": 0, - "largest-file-health": 0.7960159362549801 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "22955041823", - "attempt": 1, - "createdAt": "2026-03-11T13:30:26Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/22955041823", - "sha": "2b18793c034db7f5cad9b8e680f5546932fa2aa0", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.8180242634315424, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-13T13:30:26Z", - "maturesAt": "2026-03-13T13:30:26Z", - "mature": true, - "case": { - "compliantLines": 126536, - "eligibleFileCount": 557, - "initialLines": 1077, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "2b18793c034db7f5cad9b8e680f5546932fa2aa0", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 128619 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d60d644d771b71677f707a1b106046f666f5adf8", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@d60d644d771b71677f707a1b106046f666f5adf8", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9838048810828882, - "currentLines": 605, - "largest-file-health": 0.9275766016713092 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23004394031", - "attempt": 1, - "createdAt": "2026-03-12T13:29:55Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23004394031", - "sha": "d64fc1dee1eff5a5e05858e0842febd433f606d1", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.8102564102564103, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-14T13:29:55Z", - "maturesAt": "2026-03-14T13:29:55Z", - "mature": true, - "case": { - "compliantLines": 126218, - "eligibleFileCount": 560, - "initialLines": 1085, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "d64fc1dee1eff5a5e05858e0842febd433f606d1", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 129368 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d9f56e6004da91a3ba9888446802fd9efb5bda06", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@d9f56e6004da91a3ba9888446802fd9efb5bda06", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9756508564714612, - "currentLines": 611, - "largest-file-health": 0.9207373271889401 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23053038268", - "attempt": 1, - "createdAt": "2026-03-13T13:28:25Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23053038268", - "sha": "d60d644d771b71677f707a1b106046f666f5adf8", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/mcp_renderer.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-15T13:28:25Z", - "maturesAt": "2026-03-15T13:28:25Z", - "mature": true, - "case": { - "compliantLines": 128062, - "eligibleFileCount": 567, - "initialLines": 1053, - "path": "pkg/workflow/mcp_renderer.go", - "subjectSha": "d60d644d771b71677f707a1b106046f666f5adf8", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 130141 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0bfb9d5ebb638db035cc5b10ccc3c8164e50ea49", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/mcp_renderer.go@0bfb9d5ebb638db035cc5b10ccc3c8164e50ea49", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9840250190178345, - "currentLines": 215, - "largest-file-health": 0.9487179487179487 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23073877757", - "attempt": 1, - "createdAt": "2026-03-13T22:59:28Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23073877757", - "sha": "b0a4edde0bebf5ef0174e41686fe8043c5540533", - "ref": "refs/heads/copilot/update-action-files-location", - "eventName": "push" - }, - "value": 0.00749063670411985, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-15T22:59:28Z", - "maturesAt": "2026-03-15T22:59:28Z", - "mature": true, - "case": { - "compliantLines": 130132, - "eligibleFileCount": 574, - "initialLines": 1034, - "path": "pkg/constants/constants.go", - "subjectSha": "b0a4edde0bebf5ef0174e41686fe8043c5540533", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 131166 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6d9b06037f8f033f1cb246ade85a3476589288d6", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@6d9b06037f8f033f1cb246ade85a3476589288d6", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.992116859552018, - "currentLines": 1030, - "largest-file-health": 0.9661508704061895 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23089446270", - "attempt": 1, - "createdAt": "2026-03-14T14:02:56Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23089446270", - "sha": "e1eddb98f5fed55253931552c81a55a2e989d06c", - "ref": "refs/heads/copilot/update-action-files-location", - "eventName": "push" - }, - "value": 0.0056179775280898875, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-16T14:02:56Z", - "maturesAt": "2026-03-16T14:02:56Z", - "mature": true, - "case": { - "compliantLines": 130248, - "eligibleFileCount": 574, - "initialLines": 1034, - "path": "pkg/constants/constants.go", - "subjectSha": "e1eddb98f5fed55253931552c81a55a2e989d06c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 131282 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f522815b3d88d36a92442802b32c3bf7113faf79", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@f522815b3d88d36a92442802b32c3bf7113faf79", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9921238250483692, - "currentLines": 1031, - "largest-file-health": 0.9661508704061895 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23113738237", - "attempt": 1, - "createdAt": "2026-03-15T15:47:47Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23113738237", - "sha": "489d820c71bfc3d93ddd77aa67c9a60b44f5f1d5", - "ref": "refs/heads/copilot/recreate-pr-for-current-main", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-17T15:47:47Z", - "maturesAt": "2026-03-17T15:47:47Z", - "mature": true, - "case": { - "compliantLines": 130799, - "eligibleFileCount": 578, - "initialLines": 1034, - "path": "pkg/constants/constants.go", - "subjectSha": "489d820c71bfc3d93ddd77aa67c9a60b44f5f1d5", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 131833 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "fb7d3e808e18be2903b6c089f9997cdc11bb7399", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@fb7d3e808e18be2903b6c089f9997cdc11bb7399", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9921567437591499, - "currentLines": 1039, - "largest-file-health": 0.9661508704061895 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23146381503", - "attempt": 1, - "createdAt": "2026-03-16T13:34:54Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23146381503", - "sha": "f522815b3d88d36a92442802b32c3bf7113faf79", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-18T13:34:54Z", - "maturesAt": "2026-03-18T13:34:54Z", - "mature": true, - "case": { - "compliantLines": 131662, - "eligibleFileCount": 581, - "initialLines": 1031, - "path": "pkg/constants/constants.go", - "subjectSha": "f522815b3d88d36a92442802b32c3bf7113faf79", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 132693 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "80e649fdbdbf5bb58d4ac662183623c5ad79bc0b", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@80e649fdbdbf5bb58d4ac662183623c5ad79bc0b", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.992230185465699, - "currentLines": 1054, - "largest-file-health": 0.9689621726479146 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23162316172", - "attempt": 1, - "createdAt": "2026-03-16T19:35:26Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23162316172", - "sha": "7fd3eb8b5baaab68a4573f417e3c0f2b4b49df10", - "ref": "refs/heads/copilot/recreate-pr-for-current-main", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-18T19:35:26Z", - "maturesAt": "2026-03-18T19:35:26Z", - "mature": true, - "case": { - "compliantLines": 131979, - "eligibleFileCount": 582, - "initialLines": 1035, - "path": "pkg/constants/constants.go", - "subjectSha": "7fd3eb8b5baaab68a4573f417e3c0f2b4b49df10", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133014 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c6a885209726a3ab40cdb89ae739e37fc69a6a4d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@c6a885209726a3ab40cdb89ae739e37fc69a6a4d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9922188641797104, - "currentLines": 1054, - "largest-file-health": 0.9652173913043478 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23162366585", - "attempt": 1, - "createdAt": "2026-03-16T19:36:42Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23162366585", - "sha": "ec101110ed6ca1636a1b0156651097927368e5b1", - "ref": "refs/heads/copilot/recreate-pr-for-current-main", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-18T19:36:42Z", - "maturesAt": "2026-03-18T19:36:42Z", - "mature": true, - "case": { - "compliantLines": 131979, - "eligibleFileCount": 582, - "initialLines": 1035, - "path": "pkg/constants/constants.go", - "subjectSha": "ec101110ed6ca1636a1b0156651097927368e5b1", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133014 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c6a885209726a3ab40cdb89ae739e37fc69a6a4d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@c6a885209726a3ab40cdb89ae739e37fc69a6a4d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9922188641797104, - "currentLines": 1054, - "largest-file-health": 0.9652173913043478 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23196822119", - "attempt": 1, - "createdAt": "2026-03-17T13:34:05Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23196822119", - "sha": "c942baa88222271ac35ad1f8c34cde55d596bdee", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T13:34:05Z", - "maturesAt": "2026-03-19T13:34:05Z", - "mature": true, - "case": { - "compliantLines": 132695, - "eligibleFileCount": 583, - "initialLines": 1039, - "path": "pkg/constants/constants.go", - "subjectSha": "c942baa88222271ac35ad1f8c34cde55d596bdee", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133734 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "026f66e878d1ecdd6fdcfaba68a4e915b5e3f284", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@026f66e878d1ecdd6fdcfaba68a4e915b5e3f284", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9922308463068479, - "currentLines": 1054, - "largest-file-health": 0.9615014436958614 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23201718070", - "attempt": 1, - "createdAt": "2026-03-17T15:19:48Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23201718070", - "sha": "70ff74e24e2784aebcb8ac22ca8f85ad8ef22a07", - "ref": "refs/heads/copilot/recreate-pr-for-current-main", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T15:19:48Z", - "maturesAt": "2026-03-19T15:19:48Z", - "mature": true, - "case": { - "compliantLines": 132742, - "eligibleFileCount": 583, - "initialLines": 1043, - "path": "pkg/constants/constants.go", - "subjectSha": "70ff74e24e2784aebcb8ac22ca8f85ad8ef22a07", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133785 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c0053c68eda89238dd044ca8477e4d2562122f0e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@c0053c68eda89238dd044ca8477e4d2562122f0e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9922039092573905, - "currentLines": 1055, - "largest-file-health": 0.9578139980824545 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23201843522", - "attempt": 1, - "createdAt": "2026-03-17T15:22:27Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23201843522", - "sha": "98405d185ee725e31b02e6c63a73c6b36e8fb335", - "ref": "refs/heads/copilot/recreate-pr-for-current-main", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T15:22:27Z", - "maturesAt": "2026-03-19T15:22:27Z", - "mature": true, - "case": { - "compliantLines": 132742, - "eligibleFileCount": 583, - "initialLines": 1043, - "path": "pkg/constants/constants.go", - "subjectSha": "98405d185ee725e31b02e6c63a73c6b36e8fb335", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133785 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c0053c68eda89238dd044ca8477e4d2562122f0e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@c0053c68eda89238dd044ca8477e4d2562122f0e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9922039092573905, - "currentLines": 1055, - "largest-file-health": 0.9578139980824545 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23215790432", - "attempt": 1, - "createdAt": "2026-03-17T20:49:47Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23215790432", - "sha": "9cc5215a6591475d245658391b51b4c721323ba1", - "ref": "refs/heads/copilot/fix-copilot-access-azure-apis", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T20:49:47Z", - "maturesAt": "2026-03-19T20:49:47Z", - "mature": true, - "case": { - "compliantLines": 132759, - "eligibleFileCount": 583, - "initialLines": 1045, - "path": "pkg/constants/constants.go", - "subjectSha": "9cc5215a6591475d245658391b51b4c721323ba1", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133804 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3d45ff0f698ade62e959c2e15562de63c1914b6e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@3d45ff0f698ade62e959c2e15562de63c1914b6e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9921900690562315, - "currentLines": 1061, - "largest-file-health": 0.9559808612440192 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23216124617", - "attempt": 1, - "createdAt": "2026-03-17T20:58:26Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23216124617", - "sha": "6ed36b2849ff85f6684ae4faee40d7daddddc434", - "ref": "refs/heads/copilot/fix-copilot-access-azure-apis", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T20:58:26Z", - "maturesAt": "2026-03-19T20:58:26Z", - "mature": true, - "case": { - "compliantLines": 132759, - "eligibleFileCount": 583, - "initialLines": 1045, - "path": "pkg/constants/constants.go", - "subjectSha": "6ed36b2849ff85f6684ae4faee40d7daddddc434", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133804 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3d45ff0f698ade62e959c2e15562de63c1914b6e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@3d45ff0f698ade62e959c2e15562de63c1914b6e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9921900690562315, - "currentLines": 1061, - "largest-file-health": 0.9559808612440192 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23217102684", - "attempt": 1, - "createdAt": "2026-03-17T21:25:08Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23217102684", - "sha": "d129c57f30a819d84d0a13016785ee711f8653ff", - "ref": "refs/heads/copilot/fix-copilot-access-azure-apis", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T21:25:08Z", - "maturesAt": "2026-03-19T21:25:08Z", - "mature": true, - "case": { - "compliantLines": 132771, - "eligibleFileCount": 583, - "initialLines": 1045, - "path": "pkg/constants/constants.go", - "subjectSha": "d129c57f30a819d84d0a13016785ee711f8653ff", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133816 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3d45ff0f698ade62e959c2e15562de63c1914b6e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@3d45ff0f698ade62e959c2e15562de63c1914b6e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9921907694147187, - "currentLines": 1061, - "largest-file-health": 0.9559808612440192 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23217810168", - "attempt": 1, - "createdAt": "2026-03-17T21:43:56Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23217810168", - "sha": "b92e3ba34fc8e6c7c53bdbc7aef733cfdab55f9e", - "ref": "refs/heads/copilot/fix-copilot-access-azure-apis", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T21:43:56Z", - "maturesAt": "2026-03-19T21:43:56Z", - "mature": true, - "case": { - "compliantLines": 132780, - "eligibleFileCount": 583, - "initialLines": 1054, - "path": "pkg/constants/constants.go", - "subjectSha": "b92e3ba34fc8e6c7c53bdbc7aef733cfdab55f9e", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133834 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "759d1461747a3fa7e7f2a5b6c86ae96ee2f84667", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@759d1461747a3fa7e7f2a5b6c86ae96ee2f84667", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9921245722312716, - "currentLines": 1061, - "largest-file-health": 0.9478178368121443 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23219499513", - "attempt": 1, - "createdAt": "2026-03-17T22:32:06Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23219499513", - "sha": "58b00a7f19a1aaf5a74c6fdb5b67a3c40c1f40b8", - "ref": "refs/heads/copilot/fix-copilot-access-azure-apis", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-19T22:32:06Z", - "maturesAt": "2026-03-19T22:32:06Z", - "mature": true, - "case": { - "compliantLines": 132780, - "eligibleFileCount": 583, - "initialLines": 1054, - "path": "pkg/constants/constants.go", - "subjectSha": "58b00a7f19a1aaf5a74c6fdb5b67a3c40c1f40b8", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 133834 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "759d1461747a3fa7e7f2a5b6c86ae96ee2f84667", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@759d1461747a3fa7e7f2a5b6c86ae96ee2f84667", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9921245722312716, - "currentLines": 1061, - "largest-file-health": 0.9478178368121443 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23247328902", - "attempt": 1, - "createdAt": "2026-03-18T13:34:45Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23247328902", - "sha": "80e649fdbdbf5bb58d4ac662183623c5ad79bc0b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/constants/constants.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-20T13:34:45Z", - "maturesAt": "2026-03-20T13:34:45Z", - "mature": true, - "case": { - "compliantLines": 132791, - "eligibleFileCount": 592, - "initialLines": 1054, - "path": "pkg/constants/constants.go", - "subjectSha": "80e649fdbdbf5bb58d4ac662183623c5ad79bc0b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 134870 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0b578fbf96602fdc0b5c566585ec5d57cfd34fd0", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/constants/constants.go@0b578fbf96602fdc0b5c566585ec5d57cfd34fd0", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9845851560762215, - "currentLines": 1061, - "largest-file-health": 0.9478178368121443 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23297393909", - "attempt": 1, - "createdAt": "2026-03-19T13:32:39Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/23297393909", - "sha": "026f66e878d1ecdd6fdcfaba68a4e915b5e3f284", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-21T13:32:39Z", - "maturesAt": "2026-03-21T13:32:39Z", - "mature": true, - "case": { - "compliantLines": 132415, - "eligibleFileCount": 593, - "initialLines": 1126, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "026f66e878d1ecdd6fdcfaba68a4e915b5e3f284", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 135621 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "69d40fed61df15414d2e60121b082dc7667ebc85", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@69d40fed61df15414d2e60121b082dc7667ebc85", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9763605931234838, - "currentLines": 1126, - "largest-file-health": 0.8872113676731794 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23344981242", - "attempt": 1, - "createdAt": "2026-03-20T13:28:42Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23344981242", - "sha": "6ab2e0ba4adb93cc7e82586646e5c31b5b2b5938", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-22T13:28:42Z", - "maturesAt": "2026-03-22T13:28:42Z", - "mature": true, - "case": { - "compliantLines": 131515, - "eligibleFileCount": 596, - "initialLines": 1126, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "6ab2e0ba4adb93cc7e82586646e5c31b5b2b5938", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 136737 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "debeacb843da469451f575aa6103d1a4d97d46a4", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@debeacb843da469451f575aa6103d1a4d97d46a4", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9618098978330664, - "currentLines": 1138, - "largest-file-health": 0.8872113676731794 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23439978141", - "attempt": 1, - "createdAt": "2026-03-23T13:34:09Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23439978141", - "sha": "ce7acb255799856e0d08a971b4b3a7f3cc0cbc1c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-25T13:34:09Z", - "maturesAt": "2026-03-25T13:34:09Z", - "mature": true, - "case": { - "compliantLines": 133961, - "eligibleFileCount": 601, - "initialLines": 1127, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "ce7acb255799856e0d08a971b4b3a7f3cc0cbc1c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 138205 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5626426d25eab5baf5c4a2c1bb154c740556b519", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@5626426d25eab5baf5c4a2c1bb154c740556b519", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9692919937773598, - "currentLines": 1127, - "largest-file-health": 0.8864241348713399 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23492172073", - "attempt": 1, - "createdAt": "2026-03-24T13:33:52Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23492172073", - "sha": "5fe53c0a8502459257d97092c5031142fa44968a", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-26T13:33:52Z", - "maturesAt": "2026-03-26T13:33:52Z", - "mature": true, - "case": { - "compliantLines": 136186, - "eligibleFileCount": 607, - "initialLines": 1127, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "5fe53c0a8502459257d97092c5031142fa44968a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 140450 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "4cf9de0e682f0a41d06804a196bda0aaf057ad55", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@4cf9de0e682f0a41d06804a196bda0aaf057ad55", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9696404414382342, - "currentLines": 1332, - "largest-file-health": 0.8864241348713399 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23543735251", - "attempt": 1, - "createdAt": "2026-03-25T13:33:48Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23543735251", - "sha": "5626426d25eab5baf5c4a2c1bb154c740556b519", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-27T13:33:48Z", - "maturesAt": "2026-03-27T13:33:48Z", - "mature": true, - "case": { - "compliantLines": 138014, - "eligibleFileCount": 614, - "initialLines": 1127, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "5626426d25eab5baf5c4a2c1bb154c740556b519", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 143289 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "e4a7c883cf12265be930e4c387d2ff06edd533cf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@e4a7c883cf12265be930e4c387d2ff06edd533cf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9631862878518239, - "currentLines": 1332, - "largest-file-health": 0.8864241348713399 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23597112359", - "attempt": 1, - "createdAt": "2026-03-26T13:33:48Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23597112359", - "sha": "4cf9de0e682f0a41d06804a196bda0aaf057ad55", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-28T13:33:48Z", - "maturesAt": "2026-03-28T13:33:48Z", - "mature": true, - "case": { - "compliantLines": 139619, - "eligibleFileCount": 619, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "4cf9de0e682f0a41d06804a196bda0aaf057ad55", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 146150 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3239a61ef60615fab86261b74ffbb014f5330ca3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@3239a61ef60615fab86261b74ffbb014f5330ca3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9553130345535409, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23648662967", - "attempt": 1, - "createdAt": "2026-03-27T13:32:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23648662967", - "sha": "e4a7c883cf12265be930e4c387d2ff06edd533cf", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-03-29T13:32:20Z", - "maturesAt": "2026-03-29T13:32:20Z", - "mature": true, - "case": { - "compliantLines": 140183, - "eligibleFileCount": 622, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "e4a7c883cf12265be930e4c387d2ff06edd533cf", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 146713 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "7a91ad396dfe21b7c462b59b6aecd4680815c419", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@7a91ad396dfe21b7c462b59b6aecd4680815c419", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9554913334196697, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23747516792", - "attempt": 1, - "createdAt": "2026-03-30T13:35:01Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23747516792", - "sha": "e4eade4acf4b858799abcaf06bc1aae51c20fee6", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-01T13:35:01Z", - "maturesAt": "2026-04-01T13:35:01Z", - "mature": true, - "case": { - "compliantLines": 143000, - "eligibleFileCount": 623, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "e4eade4acf4b858799abcaf06bc1aae51c20fee6", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 148482 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0b6fa97d732b9422d34a80a2a10e9050ab9c0a58", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@0b6fa97d732b9422d34a80a2a10e9050ab9c0a58", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9630796998962837, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23800156553", - "attempt": 1, - "createdAt": "2026-03-31T13:35:06Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23800156553", - "sha": "1450719730bb4ff74a19ef5312b2bee348678ac7", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-02T13:35:06Z", - "maturesAt": "2026-04-02T13:35:06Z", - "mature": true, - "case": { - "compliantLines": 142499, - "eligibleFileCount": 621, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "1450719730bb4ff74a19ef5312b2bee348678ac7", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 147977 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5815bfc116b84798e6e19da3df26822255c89665", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@5815bfc116b84798e6e19da3df26822255c89665", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.962980733492367, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23851351591", - "attempt": 1, - "createdAt": "2026-04-01T13:34:37Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23851351591", - "sha": "0b6fa97d732b9422d34a80a2a10e9050ab9c0a58", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-03T13:34:37Z", - "maturesAt": "2026-04-03T13:34:37Z", - "mature": true, - "case": { - "compliantLines": 142088, - "eligibleFileCount": 622, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "0b6fa97d732b9422d34a80a2a10e9050ab9c0a58", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 148571 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "2470e6f41d8c0ac1f0f44e6d9fa783d48b4410b5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@2470e6f41d8c0ac1f0f44e6d9fa783d48b4410b5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9563642972047035, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23903049085", - "attempt": 1, - "createdAt": "2026-04-02T13:34:08Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23903049085", - "sha": "5815bfc116b84798e6e19da3df26822255c89665", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-04T13:34:08Z", - "maturesAt": "2026-04-04T13:34:08Z", - "mature": true, - "case": { - "compliantLines": 146165, - "eligibleFileCount": 641, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "5815bfc116b84798e6e19da3df26822255c89665", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 149603 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "252ebf68a2d28b23c0b572c45d4a376522f508d2", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@252ebf68a2d28b23c0b572c45d4a376522f508d2", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9770191774229127, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "23946829409", - "attempt": 1, - "createdAt": "2026-04-03T12:52:36Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/23946829409", - "sha": "f2bf5c6a483a7efbccc433d5f16e3bdd5c2792a8", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-05T12:52:36Z", - "maturesAt": "2026-04-05T12:52:36Z", - "mature": true, - "case": { - "compliantLines": 146983, - "eligibleFileCount": 644, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "f2bf5c6a483a7efbccc433d5f16e3bdd5c2792a8", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 150427 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b513c07a712d5c0a27d6fbe798529054e0f42f62", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@b513c07a712d5c0a27d6fbe798529054e0f42f62", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9771051739381893, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24032532181", - "attempt": 1, - "createdAt": "2026-04-06T12:53:05Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24032532181", - "sha": "9f949b2105c428511b5db50d1bd5a6f00ec0a659", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-08T12:53:05Z", - "maturesAt": "2026-04-08T12:53:05Z", - "mature": true, - "case": { - "compliantLines": 149018, - "eligibleFileCount": 659, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "9f949b2105c428511b5db50d1bd5a6f00ec0a659", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 153597 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "adff49069f6fe1b7acb8e30fd52a1885cb7d5b55", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@adff49069f6fe1b7acb8e30fd52a1885cb7d5b55", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9701882198220018, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24082391438", - "attempt": 1, - "createdAt": "2026-04-07T12:54:13Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24082391438", - "sha": "8da1051d1509bf4d8009eb2cf0b3f2e2d5bdd6dc", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-09T12:54:13Z", - "maturesAt": "2026-04-09T12:54:13Z", - "mature": true, - "case": { - "compliantLines": 147637, - "eligibleFileCount": 659, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "8da1051d1509bf4d8009eb2cf0b3f2e2d5bdd6dc", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 153248 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "e212d9d0947823c77658a089d7cdee6c05688aa1", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@e212d9d0947823c77658a089d7cdee6c05688aa1", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9633861453330549, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24136401453", - "attempt": 1, - "createdAt": "2026-04-08T12:54:07Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24136401453", - "sha": "adff49069f6fe1b7acb8e30fd52a1885cb7d5b55", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-10T12:54:07Z", - "maturesAt": "2026-04-10T12:54:07Z", - "mature": true, - "case": { - "compliantLines": 148332, - "eligibleFileCount": 665, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "adff49069f6fe1b7acb8e30fd52a1885cb7d5b55", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 155039 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c144ee305128b669dd28068e0c33869c26e5b499", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@c144ee305128b669dd28068e0c33869c26e5b499", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9567399170531286, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24191255065", - "attempt": 1, - "createdAt": "2026-04-09T12:54:23Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24191255065", - "sha": "e212d9d0947823c77658a089d7cdee6c05688aa1", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-11T12:54:23Z", - "maturesAt": "2026-04-11T12:54:23Z", - "mature": true, - "case": { - "compliantLines": 148900, - "eligibleFileCount": 666, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "e212d9d0947823c77658a089d7cdee6c05688aa1", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 155606 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "87085b3477d30beea73e9e5668ff9a9b3224a6d5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@87085b3477d30beea73e9e5668ff9a9b3224a6d5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9569039754251122, - "currentLines": 1332, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24243877161", - "attempt": 1, - "createdAt": "2026-04-10T12:53:08Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24243877161", - "sha": "c144ee305128b669dd28068e0c33869c26e5b499", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.31971153846153844, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/gateway_logs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-12T12:53:08Z", - "maturesAt": "2026-04-12T12:53:08Z", - "mature": true, - "case": { - "compliantLines": 148921, - "eligibleFileCount": 666, - "initialLines": 1332, - "path": "pkg/cli/gateway_logs.go", - "subjectSha": "c144ee305128b669dd28068e0c33869c26e5b499", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 155628 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "273d8c4206f6256efbd3a2a5a1b240fdf841ee84", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/gateway_logs.go@273d8c4206f6256efbd3a2a5a1b240fdf841ee84", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9569036420181458, - "currentLines": 1066, - "largest-file-health": 0.75 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24344446924", - "attempt": 1, - "createdAt": "2026-04-13T12:54:09Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24344446924", - "sha": "d1c210e8581deb8ab71d26a678876a3e45065465", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/audit_report_render.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-15T12:54:09Z", - "maturesAt": "2026-04-15T12:54:09Z", - "mature": true, - "case": { - "compliantLines": 150510, - "eligibleFileCount": 668, - "initialLines": 1139, - "path": "pkg/cli/audit_report_render.go", - "subjectSha": "d1c210e8581deb8ab71d26a678876a3e45065465", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 156954 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "19bf79422be0314ba557ea87eb432a34d884b8a7", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/audit_report_render.go@19bf79422be0314ba557ea87eb432a34d884b8a7", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.958943384685959, - "currentLines": 287, - "largest-file-health": 0.8770851624231782 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24400051020", - "attempt": 1, - "createdAt": "2026-04-14T12:54:15Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24400051020", - "sha": "e3bef41f75139b368b42ee795106e7f10d7357c3", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/audit_report_render.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-16T12:54:15Z", - "maturesAt": "2026-04-16T12:54:15Z", - "mature": true, - "case": { - "compliantLines": 151043, - "eligibleFileCount": 668, - "initialLines": 1139, - "path": "pkg/cli/audit_report_render.go", - "subjectSha": "e3bef41f75139b368b42ee795106e7f10d7357c3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 157525 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f42052bdb131bfe34e7766677bf1a5672e2892ee", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/audit_report_render.go@f42052bdb131bfe34e7766677bf1a5672e2892ee", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9588509760355499, - "currentLines": 287, - "largest-file-health": 0.8770851624231782 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24455630160", - "attempt": 1, - "createdAt": "2026-04-15T12:54:12Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24455630160", - "sha": "19bf79422be0314ba557ea87eb432a34d884b8a7", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_orchestrator_workflow.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-17T12:54:12Z", - "maturesAt": "2026-04-17T12:54:12Z", - "mature": true, - "case": { - "compliantLines": 156160, - "eligibleFileCount": 687, - "initialLines": 1125, - "path": "pkg/workflow/compiler_orchestrator_workflow.go", - "subjectSha": "19bf79422be0314ba557ea87eb432a34d884b8a7", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 158362 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "74d8068b73ba81c67d00d9e3559614ab7cd31a65", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_orchestrator_workflow.go@74d8068b73ba81c67d00d9e3559614ab7cd31a65", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9860951490887966, - "currentLines": 443, - "largest-file-health": 0.888 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24511404989", - "attempt": 1, - "createdAt": "2026-04-16T12:55:25Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24511404989", - "sha": "f42052bdb131bfe34e7766677bf1a5672e2892ee", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_activation_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-18T12:55:25Z", - "maturesAt": "2026-04-18T12:55:25Z", - "mature": true, - "case": { - "compliantLines": 159281, - "eligibleFileCount": 701, - "initialLines": 1027, - "path": "pkg/workflow/compiler_activation_job.go", - "subjectSha": "f42052bdb131bfe34e7766677bf1a5672e2892ee", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 160308 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "395fb25ee80fc80976cb83e107b090fd4af675d5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_activation_job.go@395fb25ee80fc80976cb83e107b090fd4af675d5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9935935823539687, - "currentLines": 497, - "largest-file-health": 0.9727361246348588 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24566083756", - "attempt": 1, - "createdAt": "2026-04-17T12:53:37Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24566083756", - "sha": "74d8068b73ba81c67d00d9e3559614ab7cd31a65", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_activation_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-19T12:53:37Z", - "maturesAt": "2026-04-19T12:53:37Z", - "mature": true, - "case": { - "compliantLines": 159159, - "eligibleFileCount": 710, - "initialLines": 1084, - "path": "pkg/workflow/compiler_activation_job.go", - "subjectSha": "74d8068b73ba81c67d00d9e3559614ab7cd31a65", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 161250 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f7e399203631953ca947cf04842edb738d832fe5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_activation_job.go@f7e399203631953ca947cf04842edb738d832fe5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9870325581395348, - "currentLines": 497, - "largest-file-health": 0.9215867158671587 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24667701334", - "attempt": 1, - "createdAt": "2026-04-20T12:55:31Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24667701334", - "sha": "c130716b503a52db6a0a9efe76c51a46a125970f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/cache.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-22T12:55:31Z", - "maturesAt": "2026-04-22T12:55:31Z", - "mature": true, - "case": { - "compliantLines": 161723, - "eligibleFileCount": 711, - "initialLines": 1002, - "path": "pkg/workflow/cache.go", - "subjectSha": "c130716b503a52db6a0a9efe76c51a46a125970f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 162725 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "27e6b35be97ce425c58c63cfc64889e114ed1eff", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/cache.go@27e6b35be97ce425c58c63cfc64889e114ed1eff", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.993842372100169, - "currentLines": 1002, - "largest-file-health": 0.9970059880239521 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24723468455", - "attempt": 1, - "createdAt": "2026-04-21T12:54:02Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24723468455", - "sha": "03a893df0d7ef9f073476d02eb06ba831bd85a7c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-23T12:54:02Z", - "maturesAt": "2026-04-23T12:54:02Z", - "mature": true, - "case": { - "compliantLines": 162158, - "eligibleFileCount": 717, - "initialLines": 1015, - "path": "pkg/workflow/domains.go", - "subjectSha": "03a893df0d7ef9f073476d02eb06ba831bd85a7c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 164175 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "626601e71f8e6206748fc9b027837720a901ee0e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@626601e71f8e6206748fc9b027837720a901ee0e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9877143292218669, - "currentLines": 1015, - "largest-file-health": 0.9842364532019704 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24779381944", - "attempt": 1, - "createdAt": "2026-04-22T12:54:04Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24779381944", - "sha": "27e6b35be97ce425c58c63cfc64889e114ed1eff", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-24T12:54:04Z", - "maturesAt": "2026-04-24T12:54:04Z", - "mature": true, - "case": { - "compliantLines": 163033, - "eligibleFileCount": 720, - "initialLines": 1015, - "path": "pkg/workflow/domains.go", - "subjectSha": "27e6b35be97ce425c58c63cfc64889e114ed1eff", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 165050 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0775d65c9572ac16c5fa3bd72df9c39db939e5b3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@0775d65c9572ac16c5fa3bd72df9c39db939e5b3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9877794607694638, - "currentLines": 1015, - "largest-file-health": 0.9842364532019704 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24836360535", - "attempt": 1, - "createdAt": "2026-04-23T12:54:00Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24836360535", - "sha": "626601e71f8e6206748fc9b027837720a901ee0e", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-25T12:54:00Z", - "maturesAt": "2026-04-25T12:54:00Z", - "mature": true, - "case": { - "compliantLines": 164189, - "eligibleFileCount": 725, - "initialLines": 1015, - "path": "pkg/workflow/domains.go", - "subjectSha": "626601e71f8e6206748fc9b027837720a901ee0e", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 166206 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "14ace4d41d59a9ff93f17cd987b900b01a4252bd", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@14ace4d41d59a9ff93f17cd987b900b01a4252bd", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9878644573601434, - "currentLines": 1015, - "largest-file-health": 0.9842364532019704 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24890547522", - "attempt": 1, - "createdAt": "2026-04-24T12:54:06Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24890547522", - "sha": "0775d65c9572ac16c5fa3bd72df9c39db939e5b3", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.05631067961165048, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-26T12:54:06Z", - "maturesAt": "2026-04-26T12:54:06Z", - "mature": true, - "case": { - "compliantLines": 164394, - "eligibleFileCount": 726, - "initialLines": 1015, - "path": "pkg/workflow/domains.go", - "subjectSha": "0775d65c9572ac16c5fa3bd72df9c39db939e5b3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 166411 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0d4ec0e28727edfcd3517b42dbe91f2d6422b529", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@0d4ec0e28727edfcd3517b42dbe91f2d6422b529", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9878794070103539, - "currentLines": 986, - "largest-file-health": 0.9842364532019704 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "24996759284", - "attempt": 1, - "createdAt": "2026-04-27T13:05:55Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/24996759284", - "sha": "6dea27ee7256ea8d27e910e2b275e2b11ece4830", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/audit_diff.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-29T13:05:55Z", - "maturesAt": "2026-04-29T13:05:55Z", - "mature": true, - "case": { - "compliantLines": 165938, - "eligibleFileCount": 727, - "initialLines": 1009, - "path": "pkg/cli/audit_diff.go", - "subjectSha": "6dea27ee7256ea8d27e910e2b275e2b11ece4830", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 167951 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "e34029340a065ed7091d3c98449fa02b6c6ebc18", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/audit_diff.go@e34029340a065ed7091d3c98449fa02b6c6ebc18", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9880143613315788, - "currentLines": 1009, - "largest-file-health": 0.9900891972249752 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25054673683", - "attempt": 1, - "createdAt": "2026-04-28T13:08:24Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25054673683", - "sha": "2feb08e234a1f46124f0fb0b3a507655561ae703", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-04-30T13:08:24Z", - "maturesAt": "2026-04-30T13:08:24Z", - "mature": true, - "case": { - "compliantLines": 165509, - "eligibleFileCount": 728, - "initialLines": 1011, - "path": "pkg/workflow/domains.go", - "subjectSha": "2feb08e234a1f46124f0fb0b3a507655561ae703", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 168533 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "a5a0353f29fb846deb179843b03ee3d5266f3f30", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@a5a0353f29fb846deb179843b03ee3d5266f3f30", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9820569265366427, - "currentLines": 1011, - "largest-file-health": 0.9881305637982196 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25110649608", - "attempt": 1, - "createdAt": "2026-04-29T13:07:02Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25110649608", - "sha": "7f977f17bd6948b45209fab4719566b435f8ecc5", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-01T13:07:02Z", - "maturesAt": "2026-05-01T13:07:02Z", - "mature": true, - "case": { - "compliantLines": 166343, - "eligibleFileCount": 730, - "initialLines": 1011, - "path": "pkg/workflow/domains.go", - "subjectSha": "7f977f17bd6948b45209fab4719566b435f8ecc5", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 169367 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "a4873952268de9b402dc4bcc57e4003575bb05b7", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@a4873952268de9b402dc4bcc57e4003575bb05b7", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9821452821387874, - "currentLines": 1011, - "largest-file-health": 0.9881305637982196 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25167059982", - "attempt": 1, - "createdAt": "2026-04-30T13:06:18Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25167059982", - "sha": "a5a0353f29fb846deb179843b03ee3d5266f3f30", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-02T13:06:18Z", - "maturesAt": "2026-05-02T13:06:18Z", - "mature": true, - "case": { - "compliantLines": 166316, - "eligibleFileCount": 733, - "initialLines": 1087, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "a5a0353f29fb846deb179843b03ee3d5266f3f30", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 170427 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "20ed6d74a03c3dd94e02550e4ea2231fa449d5fd", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@20ed6d74a03c3dd94e02550e4ea2231fa449d5fd", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9758782352561507, - "currentLines": 1087, - "largest-file-health": 0.9190432382704692 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25214967567", - "attempt": 1, - "createdAt": "2026-05-01T12:53:30Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25214967567", - "sha": "a4873952268de9b402dc4bcc57e4003575bb05b7", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-03T12:53:30Z", - "maturesAt": "2026-05-03T12:53:30Z", - "mature": true, - "case": { - "compliantLines": 168391, - "eligibleFileCount": 743, - "initialLines": 1087, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "a4873952268de9b402dc4bcc57e4003575bb05b7", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 172502 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "15b7dd5cf3fbd2e58e465c140bf0450a9659e95f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@15b7dd5cf3fbd2e58e465c140bf0450a9659e95f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9761683922505247, - "currentLines": 1087, - "largest-file-health": 0.9190432382704692 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25297161815", - "attempt": 1, - "createdAt": "2026-05-04T01:49:12Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/25297161815", - "sha": "bc15a8b66abfa11ad5ab925e54519e1a0fb54bb2", - "ref": "refs/heads/copilot/review-api-proxy-provider-extension", - "eventName": "push" - }, - "value": 0.11908646003262642, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-06T01:49:12Z", - "maturesAt": "2026-05-06T01:49:12Z", - "mature": true, - "case": { - "compliantLines": 172029, - "eligibleFileCount": 758, - "initialLines": 1113, - "path": "pkg/workflow/domains.go", - "subjectSha": "bc15a8b66abfa11ad5ab925e54519e1a0fb54bb2", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 178349 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bcacdc7ac34b247d9b38f0e95ffeeb6c18da737a", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@bcacdc7ac34b247d9b38f0e95ffeeb6c18da737a", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9645638607449439, - "currentLines": 1040, - "largest-file-health": 0.8975741239892183 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25320735246", - "attempt": 1, - "createdAt": "2026-05-04T13:06:45Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25320735246", - "sha": "ff0acb2ee8535c83a40653e363362aa0354f3407", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.11908646003262642, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/domains.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-06T13:06:45Z", - "maturesAt": "2026-05-06T13:06:45Z", - "mature": true, - "case": { - "compliantLines": 172614, - "eligibleFileCount": 759, - "initialLines": 1113, - "path": "pkg/workflow/domains.go", - "subjectSha": "ff0acb2ee8535c83a40653e363362aa0354f3407", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 178934 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "50f54ee529216f69241e33c2205c33b6a3d0d2ac", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/domains.go@50f54ee529216f69241e33c2205c33b6a3d0d2ac", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9646797143080689, - "currentLines": 1040, - "largest-file-health": 0.8975741239892183 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25377737019", - "attempt": 1, - "createdAt": "2026-05-05T12:57:38Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25377737019", - "sha": "e8eec7cbaa29113d4594561a19c19268954a23da", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.001694915254237288, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml_main_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-07T12:57:38Z", - "maturesAt": "2026-05-07T12:57:38Z", - "mature": true, - "case": { - "compliantLines": 172203, - "eligibleFileCount": 760, - "initialLines": 1090, - "path": "pkg/workflow/compiler_yaml_main_job.go", - "subjectSha": "e8eec7cbaa29113d4594561a19c19268954a23da", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 179466 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3d1140a649b51f67e67f9e902dbd78dd643a3c19", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml_main_job.go@3d1140a649b51f67e67f9e902dbd78dd643a3c19", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9595299388184949, - "currentLines": 1089, - "largest-file-health": 0.9165137614678899 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25437225560", - "attempt": 1, - "createdAt": "2026-05-06T13:08:58Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25437225560", - "sha": "50f54ee529216f69241e33c2205c33b6a3d0d2ac", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.00338409475465313, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml_main_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-08T13:08:58Z", - "maturesAt": "2026-05-08T13:08:58Z", - "mature": true, - "case": { - "compliantLines": 172407, - "eligibleFileCount": 760, - "initialLines": 1091, - "path": "pkg/workflow/compiler_yaml_main_job.go", - "subjectSha": "50f54ee529216f69241e33c2205c33b6a3d0d2ac", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 179671 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "2a6bc9d82e741bbfd56c0fe35b82e533fd551fb6", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml_main_job.go@2a6bc9d82e741bbfd56c0fe35b82e533fd551fb6", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9595705483912261, - "currentLines": 1089, - "largest-file-health": 0.9156736938588451 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25497887394", - "attempt": 1, - "createdAt": "2026-05-07T13:11:00Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25497887394", - "sha": "3d1140a649b51f67e67f9e902dbd78dd643a3c19", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml_main_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-09T13:11:00Z", - "maturesAt": "2026-05-09T13:11:00Z", - "mature": true, - "case": { - "compliantLines": 173199, - "eligibleFileCount": 764, - "initialLines": 1089, - "path": "pkg/workflow/compiler_yaml_main_job.go", - "subjectSha": "3d1140a649b51f67e67f9e902dbd78dd643a3c19", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 180512 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8363dfc8b7570480ed9245f7f61f8dfc4531ed07", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml_main_job.go@8363dfc8b7570480ed9245f7f61f8dfc4531ed07", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9594874578975359, - "currentLines": 1089, - "largest-file-health": 0.9173553719008265 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25556873104", - "attempt": 1, - "createdAt": "2026-05-08T12:58:42Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25556873104", - "sha": "2a6bc9d82e741bbfd56c0fe35b82e533fd551fb6", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml_main_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-10T12:58:42Z", - "maturesAt": "2026-05-10T12:58:42Z", - "mature": true, - "case": { - "compliantLines": 173983, - "eligibleFileCount": 766, - "initialLines": 1089, - "path": "pkg/workflow/compiler_yaml_main_job.go", - "subjectSha": "2a6bc9d82e741bbfd56c0fe35b82e533fd551fb6", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 181355 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "7423d160515654a470ecf4d2229709b3cf061ee4", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml_main_job.go@7423d160515654a470ecf4d2229709b3cf061ee4", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.959350445259298, - "currentLines": 1089, - "largest-file-health": 0.9173553719008265 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25673364533", - "attempt": 1, - "createdAt": "2026-05-11T13:32:09Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25673364533", - "sha": "5e766fc4e22afb4814d4b81f38c51fdde7a7ad34", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-13T13:32:09Z", - "maturesAt": "2026-05-13T13:32:09Z", - "mature": true, - "case": { - "compliantLines": 175615, - "eligibleFileCount": 772, - "initialLines": 1127, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "5e766fc4e22afb4814d4b81f38c51fdde7a7ad34", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 184113 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8dd02fbec752cc5bab3841ec6937447b59fbc718", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@8dd02fbec752cc5bab3841ec6937447b59fbc718", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9538435634637423, - "currentLines": 1127, - "largest-file-health": 0.8864241348713399 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25737068483", - "attempt": 1, - "createdAt": "2026-05-12T13:18:28Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25737068483", - "sha": "3092b95b606fec8ee1ea8077047872679b4cdbb0", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-14T13:18:28Z", - "maturesAt": "2026-05-14T13:18:28Z", - "mature": true, - "case": { - "compliantLines": 176013, - "eligibleFileCount": 772, - "initialLines": 1127, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "3092b95b606fec8ee1ea8077047872679b4cdbb0", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 184511 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6027ae110ad085e13b40af37a6121a8955562128", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@6027ae110ad085e13b40af37a6121a8955562128", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9539431253421206, - "currentLines": 1172, - "largest-file-health": 0.8864241348713399 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25801774116", - "attempt": 1, - "createdAt": "2026-05-13T13:20:51Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25801774116", - "sha": "8dd02fbec752cc5bab3841ec6937447b59fbc718", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-15T13:20:51Z", - "maturesAt": "2026-05-15T13:20:51Z", - "mature": true, - "case": { - "compliantLines": 179478, - "eligibleFileCount": 786, - "initialLines": 1146, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "8dd02fbec752cc5bab3841ec6937447b59fbc718", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 188011 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "123318fdc3786cffcbb152b87d1891897ecccc36", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@123318fdc3786cffcbb152b87d1891897ecccc36", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9546143576705618, - "currentLines": 1153, - "largest-file-health": 0.8717277486910995 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25861845312", - "attempt": 1, - "createdAt": "2026-05-14T13:10:15Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25861845312", - "sha": "6027ae110ad085e13b40af37a6121a8955562128", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-16T13:10:15Z", - "maturesAt": "2026-05-16T13:10:15Z", - "mature": true, - "case": { - "compliantLines": 180198, - "eligibleFileCount": 789, - "initialLines": 1172, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "6027ae110ad085e13b40af37a6121a8955562128", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 188921 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d7852a7596cb37116a36acbfd056c966eb567c48", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@d7852a7596cb37116a36acbfd056c966eb567c48", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9538272611303137, - "currentLines": 1172, - "largest-file-health": 0.8523890784982935 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "25919572727", - "attempt": 1, - "createdAt": "2026-05-15T13:09:50Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/25919572727", - "sha": "d21a90a7867125533c64d73fd18a40d1d19d607c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-17T13:09:50Z", - "maturesAt": "2026-05-17T13:09:50Z", - "mature": true, - "case": { - "compliantLines": 181500, - "eligibleFileCount": 792, - "initialLines": 1172, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "d21a90a7867125533c64d73fd18a40d1d19d607c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 190227 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "160fcc5e4884708a8f953c53463699c9fd2eef39", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@160fcc5e4884708a8f953c53463699c9fd2eef39", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9541232317178949, - "currentLines": 1172, - "largest-file-health": 0.8523890784982935 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26037784605", - "attempt": 1, - "createdAt": "2026-05-18T13:51:14Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26037784605", - "sha": "6d33189dd02de85c897c1fda676a11159f06229f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-20T13:51:14Z", - "maturesAt": "2026-05-20T13:51:14Z", - "mature": true, - "case": { - "compliantLines": 182235, - "eligibleFileCount": 805, - "initialLines": 1172, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "6d33189dd02de85c897c1fda676a11159f06229f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 192052 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8c2c89ffa00af3d2988d2fd93a2d4ebcdf03c900", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@8c2c89ffa00af3d2988d2fd93a2d4ebcdf03c900", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9488836356820028, - "currentLines": 1172, - "largest-file-health": 0.8523890784982935 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26100919545", - "attempt": 1, - "createdAt": "2026-05-19T13:38:33Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26100919545", - "sha": "d66f68b108de503d496007bb624bad1a81021c71", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-21T13:38:33Z", - "maturesAt": "2026-05-21T13:38:33Z", - "mature": true, - "case": { - "compliantLines": 183865, - "eligibleFileCount": 812, - "initialLines": 1172, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "d66f68b108de503d496007bb624bad1a81021c71", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 193675 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d19111c321d25441d33d8aa3a82718a53043c8dc", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@d19111c321d25441d33d8aa3a82718a53043c8dc", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9493481347618433, - "currentLines": 1172, - "largest-file-health": 0.8523890784982935 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26165547945", - "attempt": 1, - "createdAt": "2026-05-20T13:25:59Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26165547945", - "sha": "ba9062d968527f2249ca9a269b3a4cae79b12bb7", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.05499276410998553, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-22T13:25:59Z", - "maturesAt": "2026-05-22T13:25:59Z", - "mature": true, - "case": { - "compliantLines": 186256, - "eligibleFileCount": 813, - "initialLines": 1191, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "ba9062d968527f2249ca9a269b3a4cae79b12bb7", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 196104 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "ae678e23f7a4cf0761f4fd5fd16882084ec8b0aa", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@ae678e23f7a4cf0761f4fd5fd16882084ec8b0aa", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9497817484600009, - "currentLines": 1153, - "largest-file-health": 0.8387909319899244 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26229580176", - "attempt": 1, - "createdAt": "2026-05-21T13:39:02Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26229580176", - "sha": "d19111c321d25441d33d8aa3a82718a53043c8dc", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.05499276410998553, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-23T13:39:02Z", - "maturesAt": "2026-05-23T13:39:02Z", - "mature": true, - "case": { - "compliantLines": 187759, - "eligibleFileCount": 821, - "initialLines": 1191, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "d19111c321d25441d33d8aa3a82718a53043c8dc", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 197607 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "ee5ec5aa0ca12672dcd062ed12a215c05b17b3d4", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@ee5ec5aa0ca12672dcd062ed12a215c05b17b3d4", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9501637087754988, - "currentLines": 1153, - "largest-file-health": 0.8387909319899244 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26290387865", - "attempt": 1, - "createdAt": "2026-05-22T13:23:44Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26290387865", - "sha": "ae678e23f7a4cf0761f4fd5fd16882084ec8b0aa", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-24T13:23:44Z", - "maturesAt": "2026-05-24T13:23:44Z", - "mature": true, - "case": { - "compliantLines": 188536, - "eligibleFileCount": 828, - "initialLines": 1221, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "ae678e23f7a4cf0761f4fd5fd16882084ec8b0aa", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 198399 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5a74d3d9f9a09e292f1f07d712363e36f1174ee6", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@5a74d3d9f9a09e292f1f07d712363e36f1174ee6", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9502870478177814, - "currentLines": 1282, - "largest-file-health": 0.8181818181818182 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26403578678", - "attempt": 1, - "createdAt": "2026-05-25T13:43:12Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26403578678", - "sha": "209fa60c6f4a3b21fcc6d7bbc1a0f8bf5b6ca2a7", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-27T13:43:12Z", - "maturesAt": "2026-05-27T13:43:12Z", - "mature": true, - "case": { - "compliantLines": 190502, - "eligibleFileCount": 839, - "initialLines": 1282, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "209fa60c6f4a3b21fcc6d7bbc1a0f8bf5b6ca2a7", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 200444 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6c41e78387be5fde62255807e834c6f658e91785", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@6c41e78387be5fde62255807e834c6f658e91785", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9504001117519107, - "currentLines": 1282, - "largest-file-health": 0.7792511700468019 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26451337019", - "attempt": 1, - "createdAt": "2026-05-26T13:35:00Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26451337019", - "sha": "8074cc0de163f0dda0896288ed1ef1fc70fea6eb", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-28T13:35:00Z", - "maturesAt": "2026-05-28T13:35:00Z", - "mature": true, - "case": { - "compliantLines": 192977, - "eligibleFileCount": 853, - "initialLines": 1282, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "8074cc0de163f0dda0896288ed1ef1fc70fea6eb", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 202863 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bb96b56cbf0561a7405743e57f2cdc54b28f6f34", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@bb96b56cbf0561a7405743e57f2cdc54b28f6f34", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9512676042452295, - "currentLines": 1316, - "largest-file-health": 0.7792511700468019 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26515130897", - "attempt": 1, - "createdAt": "2026-05-27T13:46:27Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26515130897", - "sha": "6c41e78387be5fde62255807e834c6f658e91785", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-29T13:46:27Z", - "maturesAt": "2026-05-29T13:46:27Z", - "mature": true, - "case": { - "compliantLines": 189537, - "eligibleFileCount": 855, - "initialLines": 1859, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "6c41e78387be5fde62255807e834c6f658e91785", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 203326 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3b359004673a890ae73f01d25f9755dbb3829850", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@3b359004673a890ae73f01d25f9755dbb3829850", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9321828000354111, - "currentLines": 1859, - "largest-file-health": 0.5373856912318451 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26578944997", - "attempt": 1, - "createdAt": "2026-05-28T13:51:57Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26578944997", - "sha": "7bf24c8bddb84b530802bb9585354f9ca0980c6f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-30T13:51:57Z", - "maturesAt": "2026-05-30T13:51:57Z", - "mature": true, - "case": { - "compliantLines": 191477, - "eligibleFileCount": 862, - "initialLines": 1859, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "7bf24c8bddb84b530802bb9585354f9ca0980c6f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 205319 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "715d8a2403e3bd2f52687cfc8345442ad46c95c8", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@715d8a2403e3bd2f52687cfc8345442ad46c95c8", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9325829562777921, - "currentLines": 1859, - "largest-file-health": 0.5373856912318451 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26640618380", - "attempt": 1, - "createdAt": "2026-05-29T13:39:59Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26640618380", - "sha": "3b359004673a890ae73f01d25f9755dbb3829850", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-05-31T13:39:59Z", - "maturesAt": "2026-05-31T13:39:59Z", - "mature": true, - "case": { - "compliantLines": 191807, - "eligibleFileCount": 865, - "initialLines": 1859, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "3b359004673a890ae73f01d25f9755dbb3829850", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 205672 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "858e06449ae4c8d05e08b49bd0db7a6154a2433d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@858e06449ae4c8d05e08b49bd0db7a6154a2433d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9325868372943327, - "currentLines": 1859, - "largest-file-health": 0.5373856912318451 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26761696809", - "attempt": 1, - "createdAt": "2026-06-01T14:36:24Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26761696809", - "sha": "a97e4ec12b182dd98c149cdf383c952328593e44", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-03T14:36:24Z", - "maturesAt": "2026-06-03T14:36:24Z", - "mature": true, - "case": { - "compliantLines": 193234, - "eligibleFileCount": 871, - "initialLines": 1859, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "a97e4ec12b182dd98c149cdf383c952328593e44", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 208479 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3d22f38b6f5548657d164f6828f611dc81991960", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@3d22f38b6f5548657d164f6828f611dc81991960", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9268751289098662, - "currentLines": 1860, - "largest-file-health": 0.5373856912318451 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26824386634", - "attempt": 1, - "createdAt": "2026-06-02T13:53:45Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26824386634", - "sha": "bc370170038bf812436f20f03167a11f9faa3034", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-04T13:53:45Z", - "maturesAt": "2026-06-04T13:53:45Z", - "mature": true, - "case": { - "compliantLines": 193730, - "eligibleFileCount": 875, - "initialLines": 1859, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "bc370170038bf812436f20f03167a11f9faa3034", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 209041 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f9c40ded58fea616fb8a9e14fb79480b6aafe26f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@f9c40ded58fea616fb8a9e14fb79480b6aafe26f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9267559952353844, - "currentLines": 1866, - "largest-file-health": 0.5373856912318451 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26890406922", - "attempt": 1, - "createdAt": "2026-06-03T14:10:47Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26890406922", - "sha": "ce5a735588b58d9cf2aeea08a321b7d297dd0baa", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-05T14:10:47Z", - "maturesAt": "2026-06-05T14:10:47Z", - "mature": true, - "case": { - "compliantLines": 193263, - "eligibleFileCount": 879, - "initialLines": 1860, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "ce5a735588b58d9cf2aeea08a321b7d297dd0baa", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 209578 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c2f24a066f38cc7a45a153c2c740586a03b0f2d2", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@c2f24a066f38cc7a45a153c2c740586a03b0f2d2", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9221530885875426, - "currentLines": 1866, - "largest-file-health": 0.5370967741935484 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "26955289756", - "attempt": 1, - "createdAt": "2026-06-04T13:37:36Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/26955289756", - "sha": "e10b9ce45979e75c62476694c4fcdd79bc48f97c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.678623718887262, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-06T13:37:36Z", - "maturesAt": "2026-06-06T13:37:36Z", - "mature": true, - "case": { - "compliantLines": 193927, - "eligibleFileCount": 879, - "initialLines": 1866, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "e10b9ce45979e75c62476694c4fcdd79bc48f97c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 210404 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "27a462bc93132da324f9f7be01933ea514b5dc5b", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@27a462bc93132da324f9f7be01933ea514b5dc5b", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9216887511644265, - "currentLines": 939, - "largest-file-health": 0.5353697749196141 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27018073756", - "attempt": 1, - "createdAt": "2026-06-05T13:35:57Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27018073756", - "sha": "f5426ea52fea6dd65629625b2ae6c06654e5017f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.6420204978038068, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_config.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-07T13:35:57Z", - "maturesAt": "2026-06-07T13:35:57Z", - "mature": true, - "case": { - "compliantLines": 194665, - "eligibleFileCount": 880, - "initialLines": 1866, - "path": "pkg/workflow/safe_outputs_config.go", - "subjectSha": "f5426ea52fea6dd65629625b2ae6c06654e5017f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 211143 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "e2663a816af92827ee835a7d34a168c569762b1d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_config.go@e2663a816af92827ee835a7d34a168c569762b1d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9219581042232042, - "currentLines": 989, - "largest-file-health": 0.5353697749196141 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27142578117", - "attempt": 1, - "createdAt": "2026-06-08T13:54:48Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27142578117", - "sha": "491b5c1556798b0b0a5c103bfb59e4792433703d", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-10T13:54:48Z", - "maturesAt": "2026-06-10T13:54:48Z", - "mature": true, - "case": { - "compliantLines": 198959, - "eligibleFileCount": 891, - "initialLines": 1420, - "path": "pkg/cli/forecast.go", - "subjectSha": "491b5c1556798b0b0a5c103bfb59e4792433703d", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 213976 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "006a5af94534c220284890b178294bcd29a02439", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@006a5af94534c220284890b178294bcd29a02439", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.929819232063409, - "currentLines": 1443, - "largest-file-health": 0.7035211267605633 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27209667059", - "attempt": 1, - "createdAt": "2026-06-09T13:31:08Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27209667059", - "sha": "336c2896328c9cb79bf004c77cf8e20bf353d026", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-11T13:31:08Z", - "maturesAt": "2026-06-11T13:31:08Z", - "mature": true, - "case": { - "compliantLines": 199443, - "eligibleFileCount": 896, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "336c2896328c9cb79bf004c77cf8e20bf353d026", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 214483 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "288fd9f93a0189bfe995bc0e533b6bd567f9f8e6", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@288fd9f93a0189bfe995bc0e533b6bd567f9f8e6", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9298778924203783, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27280878811", - "attempt": 1, - "createdAt": "2026-06-10T13:47:39Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27280878811", - "sha": "006a5af94534c220284890b178294bcd29a02439", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-12T13:47:39Z", - "maturesAt": "2026-06-12T13:47:39Z", - "mature": true, - "case": { - "compliantLines": 201670, - "eligibleFileCount": 904, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "006a5af94534c220284890b178294bcd29a02439", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 216710 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "07acf6ca70509c76b7bdff5f9906846f37e12640", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@07acf6ca70509c76b7bdff5f9906846f37e12640", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9305984956854783, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27351791652", - "attempt": 1, - "createdAt": "2026-06-11T13:53:13Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27351791652", - "sha": "1a95104f389d3f3f0d06af0b89fd7c1d1dbee104", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-13T13:53:13Z", - "maturesAt": "2026-06-13T13:53:13Z", - "mature": true, - "case": { - "compliantLines": 201194, - "eligibleFileCount": 905, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "1a95104f389d3f3f0d06af0b89fd7c1d1dbee104", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 217296 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "7c17f179e8272186c20a169e3bcc8cdaadf44d19", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@7c17f179e8272186c20a169e3bcc8cdaadf44d19", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.925898313820779, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27419552025", - "attempt": 1, - "createdAt": "2026-06-12T13:43:27Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27419552025", - "sha": "07acf6ca70509c76b7bdff5f9906846f37e12640", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-14T13:43:27Z", - "maturesAt": "2026-06-14T13:43:27Z", - "mature": true, - "case": { - "compliantLines": 201744, - "eligibleFileCount": 910, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "07acf6ca70509c76b7bdff5f9906846f37e12640", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 217860 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "79d43a9e415e5a1adc7b7a3207ae41e3257ee216", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@79d43a9e415e5a1adc7b7a3207ae41e3257ee216", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.926025888185073, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27554075354", - "attempt": 1, - "createdAt": "2026-06-15T14:39:18Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27554075354", - "sha": "cb89a18cc061f65dcc0e8781f39d6b8a78f687ad", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-17T14:39:18Z", - "maturesAt": "2026-06-17T14:39:18Z", - "mature": true, - "case": { - "compliantLines": 202046, - "eligibleFileCount": 917, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "cb89a18cc061f65dcc0e8781f39d6b8a78f687ad", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 219174 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "abd280f78350f3f21792dbad7cc0bd4facb67fd2", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@abd280f78350f3f21792dbad7cc0bd4facb67fd2", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9218520444943287, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27624346952", - "attempt": 1, - "createdAt": "2026-06-16T14:20:48Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27624346952", - "sha": "859047890ce4fcbe8d96acfb28391a562723b8a1", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-18T14:20:48Z", - "maturesAt": "2026-06-18T14:20:48Z", - "mature": true, - "case": { - "compliantLines": 202046, - "eligibleFileCount": 917, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "859047890ce4fcbe8d96acfb28391a562723b8a1", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 219174 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5c9d0f8a9e6ceab3c4863456a8e7c915a2552e7a", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@5c9d0f8a9e6ceab3c4863456a8e7c915a2552e7a", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9218520444943287, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27693868099", - "attempt": 1, - "createdAt": "2026-06-17T13:50:10Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27693868099", - "sha": "fcb005d16aad3ddaa184158a493e4cbd95211553", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-19T13:50:10Z", - "maturesAt": "2026-06-19T13:50:10Z", - "mature": true, - "case": { - "compliantLines": 202634, - "eligibleFileCount": 920, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "fcb005d16aad3ddaa184158a493e4cbd95211553", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 219822 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "2e59910549274c6ddc6da8034509dd0a08a27f4d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@2e59910549274c6ddc6da8034509dd0a08a27f4d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9218094640208896, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27763773760", - "attempt": 1, - "createdAt": "2026-06-18T13:43:21Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27763773760", - "sha": "5bea59a8c35f29b6ccf0a7ae553c04b3a7f7a4da", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/forecast.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-20T13:43:21Z", - "maturesAt": "2026-06-20T13:43:21Z", - "mature": true, - "case": { - "compliantLines": 204270, - "eligibleFileCount": 933, - "initialLines": 1443, - "path": "pkg/cli/forecast.go", - "subjectSha": "5bea59a8c35f29b6ccf0a7ae553c04b3a7f7a4da", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 221505 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "e1d2f30e59a8beae8c5a6c97cd9eedd5fc573753", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/forecast.go@e1d2f30e59a8beae8c5a6c97cd9eedd5fc573753", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9221913726552448, - "currentLines": 1443, - "largest-file-health": 0.6923076923076923 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "27829528464", - "attempt": 1, - "createdAt": "2026-06-19T13:47:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/27829528464", - "sha": "2e59910549274c6ddc6da8034509dd0a08a27f4d", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-21T13:47:20Z", - "maturesAt": "2026-06-21T13:47:20Z", - "mature": true, - "case": { - "compliantLines": 204285, - "eligibleFileCount": 933, - "initialLines": 1560, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "2e59910549274c6ddc6da8034509dd0a08a27f4d", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 221735 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "78b22dc58e8ebe9d877c9e34b24e6a0488cf1c30", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@78b22dc58e8ebe9d877c9e34b24e6a0488cf1c30", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9213024556339775, - "currentLines": 1560, - "largest-file-health": 0.6403846153846153 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28029846668", - "attempt": 1, - "createdAt": "2026-06-23T13:29:29Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28029846668", - "sha": "709febe6be94f5506e285c40ceebeacf47d9376a", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.016981132075471698, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-25T13:29:29Z", - "maturesAt": "2026-06-25T13:29:29Z", - "mature": true, - "case": { - "compliantLines": 206707, - "eligibleFileCount": 944, - "initialLines": 1560, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "709febe6be94f5506e285c40ceebeacf47d9376a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 225742 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b36c12896ace923dfb463fd00ef02b541226c8dc", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@b36c12896ace923dfb463fd00ef02b541226c8dc", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9156780749705415, - "currentLines": 1542, - "largest-file-health": 0.6403846153846153 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28101588784", - "attempt": 1, - "createdAt": "2026-06-24T13:21:22Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28101588784", - "sha": "6fb7896d9550488a5beb3a951c20baf0c5698c41", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/threat_detection.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-26T13:21:22Z", - "maturesAt": "2026-06-26T13:21:22Z", - "mature": true, - "case": { - "compliantLines": 206066, - "eligibleFileCount": 947, - "initialLines": 1542, - "path": "pkg/workflow/threat_detection.go", - "subjectSha": "6fb7896d9550488a5beb3a951c20baf0c5698c41", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 226191 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8120031f0287b51f2cd4a36939a6bffcf245ce7f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/threat_detection.go@8120031f0287b51f2cd4a36939a6bffcf245ce7f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9110265218333179, - "currentLines": 0, - "largest-file-health": 0.6478599221789884 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28173147331", - "attempt": 1, - "createdAt": "2026-06-25T13:20:53Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28173147331", - "sha": "9f29265e3628e6dfb3441224fdb0ae3635d29f32", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-27T13:20:53Z", - "maturesAt": "2026-06-27T13:20:53Z", - "mature": true, - "case": { - "compliantLines": 209009, - "eligibleFileCount": 957, - "initialLines": 1542, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "9f29265e3628e6dfb3441224fdb0ae3635d29f32", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 227658 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0956abe81cc5f7ecc0b6ec0441dd585a65101e12", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@0956abe81cc5f7ecc0b6ec0441dd585a65101e12", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9180832652487503, - "currentLines": 1542, - "largest-file-health": 0.6478599221789884 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28240588056", - "attempt": 1, - "createdAt": "2026-06-26T13:17:49Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28240588056", - "sha": "8120031f0287b51f2cd4a36939a6bffcf245ce7f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-06-28T13:17:49Z", - "maturesAt": "2026-06-28T13:17:49Z", - "mature": true, - "case": { - "compliantLines": 210371, - "eligibleFileCount": 961, - "initialLines": 1542, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "8120031f0287b51f2cd4a36939a6bffcf245ce7f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 229036 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b2bb9598eaa79f6927039cc916a1ccd53559cd73", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@b2bb9598eaa79f6927039cc916a1ccd53559cd73", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9185062610244678, - "currentLines": 1542, - "largest-file-health": 0.6478599221789884 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28377307007", - "attempt": 1, - "createdAt": "2026-06-29T13:55:25Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28377307007", - "sha": "97705fd1ffcf55d6873300714c14ac42318b0e5b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-01T13:55:25Z", - "maturesAt": "2026-07-01T13:55:25Z", - "mature": true, - "case": { - "compliantLines": 213160, - "eligibleFileCount": 974, - "initialLines": 1542, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "97705fd1ffcf55d6873300714c14ac42318b0e5b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 230616 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "9a8a121a6412d5bdbd33312254d46e07c53ec500", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@9a8a121a6412d5bdbd33312254d46e07c53ec500", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.924307073229958, - "currentLines": 1547, - "largest-file-health": 0.6478599221789884 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28447102836", - "attempt": 1, - "createdAt": "2026-06-30T13:14:34Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/28447102836", - "sha": "f819aec555c8651b80846c09bd866f19e32cf7df", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-02T13:14:34Z", - "maturesAt": "2026-07-02T13:14:34Z", - "mature": true, - "case": { - "compliantLines": 215645, - "eligibleFileCount": 983, - "initialLines": 1542, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "f819aec555c8651b80846c09bd866f19e32cf7df", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 231782 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "281d68aca7d8c96c26582454c5962e4f9bb07b6d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@281d68aca7d8c96c26582454c5962e4f9bb07b6d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9303785453572754, - "currentLines": 1547, - "largest-file-health": 0.6478599221789884 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28521028309", - "attempt": 1, - "createdAt": "2026-07-01T13:26:59Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28521028309", - "sha": "9a8a121a6412d5bdbd33312254d46e07c53ec500", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-03T13:26:59Z", - "maturesAt": "2026-07-03T13:26:59Z", - "mature": true, - "case": { - "compliantLines": 214570, - "eligibleFileCount": 986, - "initialLines": 1547, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "9a8a121a6412d5bdbd33312254d46e07c53ec500", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 232744 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "46a13452c1e07c4f00cc86b60a9814e266ba7c11", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@46a13452c1e07c4f00cc86b60a9814e266ba7c11", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9219142061664318, - "currentLines": 1547, - "largest-file-health": 0.6457659987071752 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28592648430", - "attempt": 1, - "createdAt": "2026-07-02T13:11:02Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28592648430", - "sha": "281d68aca7d8c96c26582454c5962e4f9bb07b6d", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-04T13:11:02Z", - "maturesAt": "2026-07-04T13:11:02Z", - "mature": true, - "case": { - "compliantLines": 214951, - "eligibleFileCount": 989, - "initialLines": 1547, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "281d68aca7d8c96c26582454c5962e4f9bb07b6d", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 233177 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0f1f3a21f0b6ee560dc49038a82fca45d15d5e0d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@0f1f3a21f0b6ee560dc49038a82fca45d15d5e0d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9218362016836995, - "currentLines": 1553, - "largest-file-health": 0.6457659987071752 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28662832475", - "attempt": 1, - "createdAt": "2026-07-03T13:12:28Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28662832475", - "sha": "46a13452c1e07c4f00cc86b60a9814e266ba7c11", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-05T13:12:28Z", - "maturesAt": "2026-07-05T13:12:28Z", - "mature": true, - "case": { - "compliantLines": 215770, - "eligibleFileCount": 997, - "initialLines": 1547, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "46a13452c1e07c4f00cc86b60a9814e266ba7c11", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 234213 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "69cbea050cb78dfd624c3e072074bbc4379b6bf8", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@69cbea050cb78dfd624c3e072074bbc4379b6bf8", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9212554384257066, - "currentLines": 1553, - "largest-file-health": 0.6457659987071752 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28796537677", - "attempt": 1, - "createdAt": "2026-07-06T13:50:24Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28796537677", - "sha": "fd4e4470bc4987337788d2c198f478e3b4c1b3db", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/remote_fetch.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-08T13:50:24Z", - "maturesAt": "2026-07-08T13:50:24Z", - "mature": true, - "case": { - "compliantLines": 218071, - "eligibleFileCount": 1011, - "initialLines": 1553, - "path": "pkg/parser/remote_fetch.go", - "subjectSha": "fd4e4470bc4987337788d2c198f478e3b4c1b3db", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 236743 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "9c0ce8fcde9f1851a0a072bc0c2dd4e63f43a4df", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/remote_fetch.go@9c0ce8fcde9f1851a0a072bc0c2dd4e63f43a4df", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9211296638126576, - "currentLines": 0, - "largest-file-health": 0.6432710882163555 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28869415585", - "attempt": 1, - "createdAt": "2026-07-07T13:20:57Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28869415585", - "sha": "afad433c8081160f52c27dd324bf208c194a2717", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.8686224489795918, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs_orchestrator.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-09T13:20:57Z", - "maturesAt": "2026-07-09T13:20:57Z", - "mature": true, - "case": { - "compliantLines": 222445, - "eligibleFileCount": 1026, - "initialLines": 1284, - "path": "pkg/cli/logs_orchestrator.go", - "subjectSha": "afad433c8081160f52c27dd324bf208c194a2717", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 236944 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b143f58e63fdc76da318db76872cd63bd02ef212", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs_orchestrator.go@b143f58e63fdc76da318db76872cd63bd02ef212", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.938808326017962, - "currentLines": 603, - "largest-file-health": 0.7780373831775701 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "28944904611", - "attempt": 1, - "createdAt": "2026-07-08T13:05:43Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/28944904611", - "sha": "adb344b16f741da11a367e06d099653147eadc43", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml_main_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-10T13:05:43Z", - "maturesAt": "2026-07-10T13:05:43Z", - "mature": true, - "case": { - "compliantLines": 225277, - "eligibleFileCount": 1034, - "initialLines": 1265, - "path": "pkg/workflow/compiler_yaml_main_job.go", - "subjectSha": "adb344b16f741da11a367e06d099653147eadc43", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 238626 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "66c9b2f72f293d83a1efcfa5ea6a1167e6d821c2", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml_main_job.go@66c9b2f72f293d83a1efcfa5ea6a1167e6d821c2", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9440589038914452, - "currentLines": 42, - "largest-file-health": 0.7897233201581028 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29021814573", - "attempt": 1, - "createdAt": "2026-07-09T13:33:45Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29021814573", - "sha": "b143f58e63fdc76da318db76872cd63bd02ef212", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml_main_job.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-11T13:33:45Z", - "maturesAt": "2026-07-11T13:33:45Z", - "mature": true, - "case": { - "compliantLines": 227120, - "eligibleFileCount": 1041, - "initialLines": 1265, - "path": "pkg/workflow/compiler_yaml_main_job.go", - "subjectSha": "b143f58e63fdc76da318db76872cd63bd02ef212", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 239215 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "79c42da5f2ecd8c892b96ffb64b7d9aab3326db7", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml_main_job.go@79c42da5f2ecd8c892b96ffb64b7d9aab3326db7", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9494387893735761, - "currentLines": 42, - "largest-file-health": 0.7897233201581028 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29095520039", - "attempt": 1, - "createdAt": "2026-07-10T13:17:33Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29095520039", - "sha": "66c9b2f72f293d83a1efcfa5ea6a1167e6d821c2", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-12T13:17:33Z", - "maturesAt": "2026-07-12T13:17:33Z", - "mature": true, - "case": { - "compliantLines": 228664, - "eligibleFileCount": 1048, - "initialLines": 1183, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "66c9b2f72f293d83a1efcfa5ea6a1167e6d821c2", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 239495 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d5ded81997db9154fe302c222042a89e2dd936ff", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@d5ded81997db9154fe302c222042a89e2dd936ff", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9547756738136496, - "currentLines": 1183, - "largest-file-health": 0.8444632290786137 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29253457998", - "attempt": 1, - "createdAt": "2026-07-13T13:21:27Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/29253457998", - "sha": "4e612686b887a78ef35529372cc2d62e2d05d5fe", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-15T13:21:27Z", - "maturesAt": "2026-07-15T13:21:27Z", - "mature": true, - "case": { - "compliantLines": 232126, - "eligibleFileCount": 1061, - "initialLines": 1183, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "4e612686b887a78ef35529372cc2d62e2d05d5fe", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 241876 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "7badff05e4cb8c772a8d9f363f7cbc0ee873816f", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@7badff05e4cb8c772a8d9f363f7cbc0ee873816f", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9596900891365824, - "currentLines": 1221, - "largest-file-health": 0.8444632290786137 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29259392613", - "attempt": 1, - "createdAt": "2026-07-13T14:46:41Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/29259392613", - "sha": "65bfd424ad3a765a98a7264a7f9564a460cfe9a9", - "ref": "refs/heads/copilot/cli-version-updates", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-15T14:46:41Z", - "maturesAt": "2026-07-15T14:46:41Z", - "mature": true, - "case": { - "compliantLines": 232367, - "eligibleFileCount": 1063, - "initialLines": 1205, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "65bfd424ad3a765a98a7264a7f9564a460cfe9a9", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 242139 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "a81cd1f28a92f77afbcb07632494e00338a07982", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@a81cd1f28a92f77afbcb07632494e00338a07982", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9596430149624803, - "currentLines": 1221, - "largest-file-health": 0.829045643153527 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29334428759", - "attempt": 1, - "createdAt": "2026-07-14T12:56:13Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29334428759", - "sha": "65cbbe439488aca7835b1e6eec10ceba0e517359", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-16T12:56:13Z", - "maturesAt": "2026-07-16T12:56:13Z", - "mature": true, - "case": { - "compliantLines": 233729, - "eligibleFileCount": 1072, - "initialLines": 1262, - "path": "pkg/workflow/compiler_yaml.go", - "subjectSha": "65cbbe439488aca7835b1e6eec10ceba0e517359", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 243617 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b981f99fc8c95c15714ce096f0482cb26d3005cb", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_yaml.go@b981f99fc8c95c15714ce096f0482cb26d3005cb", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9594116995119388, - "currentLines": 221, - "largest-file-health": 0.7916006339144216 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29417320094", - "attempt": 1, - "createdAt": "2026-07-15T12:58:52Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29417320094", - "sha": "6fe8f3d8f294e30a8c56a3cb220f54dfc78bef4f", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/frontmatter_extraction_yaml.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-17T12:58:52Z", - "maturesAt": "2026-07-17T12:58:52Z", - "mature": true, - "case": { - "compliantLines": 237736, - "eligibleFileCount": 1088, - "initialLines": 1221, - "path": "pkg/workflow/frontmatter_extraction_yaml.go", - "subjectSha": "6fe8f3d8f294e30a8c56a3cb220f54dfc78bef4f", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 247443 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "da9762a7085932f0136f7f396bb34d65a02a598a", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/frontmatter_extraction_yaml.go@da9762a7085932f0136f7f396bb34d65a02a598a", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.960770763367725, - "currentLines": 332, - "largest-file-health": 0.8181818181818182 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29500681351", - "attempt": 1, - "createdAt": "2026-07-16T13:04:34Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29500681351", - "sha": "b981f99fc8c95c15714ce096f0482cb26d3005cb", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/bootstrap_profile_runner.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-18T13:04:34Z", - "maturesAt": "2026-07-18T13:04:34Z", - "mature": true, - "case": { - "compliantLines": 238711, - "eligibleFileCount": 1099, - "initialLines": 1145, - "path": "pkg/cli/bootstrap_profile_runner.go", - "subjectSha": "b981f99fc8c95c15714ce096f0482cb26d3005cb", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 249238 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "1f9d0a95f6011c848b86fcea575d4f45863b6df3", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/bootstrap_profile_runner.go@1f9d0a95f6011c848b86fcea575d4f45863b6df3", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.957763262423868, - "currentLines": 1259, - "largest-file-health": 0.8724890829694323 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29582040955", - "attempt": 1, - "createdAt": "2026-07-17T12:55:48Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29582040955", - "sha": "da9762a7085932f0136f7f396bb34d65a02a598a", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/bootstrap_profile_runner.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-19T12:55:48Z", - "maturesAt": "2026-07-19T12:55:48Z", - "mature": true, - "case": { - "compliantLines": 237333, - "eligibleFileCount": 1102, - "initialLines": 1202, - "path": "pkg/cli/bootstrap_profile_runner.go", - "subjectSha": "da9762a7085932f0136f7f396bb34d65a02a598a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 250045 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3d1b5e831e5a6bf9b98d0af4e7a5be61aa3306ec", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/bootstrap_profile_runner.go@3d1b5e831e5a6bf9b98d0af4e7a5be61aa3306ec", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9491611509928213, - "currentLines": 1259, - "largest-file-health": 0.8311148086522463 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29745552264", - "attempt": 1, - "createdAt": "2026-07-20T13:16:30Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29745552264", - "sha": "f9ecca568eb8b90bc4a6d75fe68fd90cd033f597", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/bootstrap_profile_runner.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-22T13:16:30Z", - "maturesAt": "2026-07-22T13:16:30Z", - "mature": true, - "case": { - "compliantLines": 239098, - "eligibleFileCount": 1112, - "initialLines": 1259, - "path": "pkg/cli/bootstrap_profile_runner.go", - "subjectSha": "f9ecca568eb8b90bc4a6d75fe68fd90cd033f597", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 251890 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "4711259b7ee50000a7365839d6d5d824842b766b", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/bootstrap_profile_runner.go@4711259b7ee50000a7365839d6d5d824842b766b", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.949215927587439, - "currentLines": 241, - "largest-file-health": 0.7934868943606036 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29832725845", - "attempt": 1, - "createdAt": "2026-07-21T13:03:13Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29832725845", - "sha": "a1a75aa762dec0cd38d3baa69becf5263bf8b1f3", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/token_usage.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-23T13:03:13Z", - "maturesAt": "2026-07-23T13:03:13Z", - "mature": true, - "case": { - "compliantLines": 241475, - "eligibleFileCount": 1126, - "initialLines": 1141, - "path": "pkg/cli/token_usage.go", - "subjectSha": "a1a75aa762dec0cd38d3baa69becf5263bf8b1f3", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 253069 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3e9015b17ea47d3c19bd522762d3d20ce08590bd", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/token_usage.go@3e9015b17ea47d3c19bd522762d3d20ce08590bd", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9541864076595711, - "currentLines": 1141, - "largest-file-health": 0.8755477651183172 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "29922407626", - "attempt": 1, - "createdAt": "2026-07-22T13:05:56Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/29922407626", - "sha": "4711259b7ee50000a7365839d6d5d824842b766b", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/token_usage.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-24T13:05:56Z", - "maturesAt": "2026-07-24T13:05:56Z", - "mature": true, - "case": { - "compliantLines": 242542, - "eligibleFileCount": 1128, - "initialLines": 1141, - "path": "pkg/cli/token_usage.go", - "subjectSha": "4711259b7ee50000a7365839d6d5d824842b766b", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 253140 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "6e6860cce13c4eff003828de391f7db980e60920", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/token_usage.go@6e6860cce13c4eff003828de391f7db980e60920", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9581338389823812, - "currentLines": 1141, - "largest-file-health": 0.8755477651183172 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30009783992", - "attempt": 1, - "createdAt": "2026-07-23T13:06:36Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30009783992", - "sha": "3e9015b17ea47d3c19bd522762d3d20ce08590bd", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/token_usage.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-25T13:06:36Z", - "maturesAt": "2026-07-25T13:06:36Z", - "mature": true, - "case": { - "compliantLines": 244519, - "eligibleFileCount": 1137, - "initialLines": 1141, - "path": "pkg/cli/token_usage.go", - "subjectSha": "3e9015b17ea47d3c19bd522762d3d20ce08590bd", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 255095 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "1242de1b6d2b04c93a3d81e53dbcf51b23d69939", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/token_usage.go@1242de1b6d2b04c93a3d81e53dbcf51b23d69939", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9585409357298261, - "currentLines": 1141, - "largest-file-health": 0.8755477651183172 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30095453692", - "attempt": 1, - "createdAt": "2026-07-24T13:04:28Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30095453692", - "sha": "6e6860cce13c4eff003828de391f7db980e60920", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/token_usage.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-26T13:04:28Z", - "maturesAt": "2026-07-26T13:04:28Z", - "mature": true, - "case": { - "compliantLines": 244339, - "eligibleFileCount": 1140, - "initialLines": 1141, - "path": "pkg/cli/token_usage.go", - "subjectSha": "6e6860cce13c4eff003828de391f7db980e60920", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 255925 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "bf2fffc89e0415ac92f747b4b8381f86a0f5ad10", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/token_usage.go@bf2fffc89e0415ac92f747b4b8381f86a0f5ad10", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9547289244895966, - "currentLines": 1141, - "largest-file-health": 0.8755477651183172 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30270526830", - "attempt": 1, - "createdAt": "2026-07-27T13:29:37Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30270526830", - "sha": "55b5181bb855f566b2401823884270d16669c064", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/token_usage.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-29T13:29:37Z", - "maturesAt": "2026-07-29T13:29:37Z", - "mature": true, - "case": { - "compliantLines": 244881, - "eligibleFileCount": 1152, - "initialLines": 1141, - "path": "pkg/cli/token_usage.go", - "subjectSha": "55b5181bb855f566b2401823884270d16669c064", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 258560 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "a5a84b69be33d7c3ba08459b4291d4c9670fcfbf", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/token_usage.go@a5a84b69be33d7c3ba08459b4291d4c9670fcfbf", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9470954517326733, - "currentLines": 0, - "largest-file-health": 0.8755477651183172 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30362113607", - "attempt": 1, - "createdAt": "2026-07-28T13:08:38Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30362113607", - "sha": "e5a95dace1455c0a6c73fecfacb74fd9574f7745", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/awf_helpers.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-30T13:08:38Z", - "maturesAt": "2026-07-30T13:08:38Z", - "mature": true, - "case": { - "compliantLines": 246649, - "eligibleFileCount": 1160, - "initialLines": 1131, - "path": "pkg/workflow/awf_helpers.go", - "subjectSha": "e5a95dace1455c0a6c73fecfacb74fd9574f7745", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 259187 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "81bc299686b8cd605ea022a21f9ec9b3c12727e5", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/awf_helpers.go@81bc299686b8cd605ea022a21f9ec9b3c12727e5", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9516256602375891, - "currentLines": 1131, - "largest-file-health": 0.883289124668435 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30454859691", - "attempt": 1, - "createdAt": "2026-07-29T13:11:09Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30454859691", - "sha": "a5a84b69be33d7c3ba08459b4291d4c9670fcfbf", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/awf_helpers.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-07-31T13:11:09Z", - "maturesAt": "2026-07-31T13:11:09Z", - "mature": true, - "case": { - "compliantLines": 247719, - "eligibleFileCount": 1163, - "initialLines": 1131, - "path": "pkg/workflow/awf_helpers.go", - "subjectSha": "a5a84b69be33d7c3ba08459b4291d4c9670fcfbf", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 260319 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "409bbd1e8cad15c894ebe723af6c51f7706aa0e4", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/awf_helpers.go@409bbd1e8cad15c894ebe723af6c51f7706aa0e4", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9515978472566351, - "currentLines": 1137, - "largest-file-health": 0.883289124668435 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30545488231", - "attempt": 1, - "createdAt": "2026-07-30T13:07:16Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30545488231", - "sha": "81bc299686b8cd605ea022a21f9ec9b3c12727e5", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs_download.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-01T13:07:16Z", - "maturesAt": "2026-08-01T13:07:16Z", - "mature": true, - "case": { - "compliantLines": 248809, - "eligibleFileCount": 1168, - "initialLines": 1151, - "path": "pkg/cli/logs_download.go", - "subjectSha": "81bc299686b8cd605ea022a21f9ec9b3c12727e5", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 261508 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "594778a52e97a6cfc6a7648d50bc79b0981cc7ae", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs_download.go@594778a52e97a6cfc6a7648d50bc79b0981cc7ae", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9514393441118436, - "currentLines": 1151, - "largest-file-health": 0.8679409209383145 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30606894789", - "attempt": 1, - "createdAt": "2026-07-31T05:28:24Z", - "conclusion": "failure", - "url": "https://github.com/github/gh-aw/actions/runs/30606894789", - "sha": "794abcfef846ac6a4230668236175fda4a42f8bb", - "ref": "refs/heads/copilot/eslint-monster-setup-js-replace-unsafe-error-forma", - "eventName": "push" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs_download.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-02T05:28:24Z", - "maturesAt": "2026-08-02T05:28:24Z", - "mature": true, - "case": { - "compliantLines": 248840, - "eligibleFileCount": 1171, - "initialLines": 1151, - "path": "pkg/cli/logs_download.go", - "subjectSha": "794abcfef846ac6a4230668236175fda4a42f8bb", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 262639 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "d647f2f83985e23c7ad8eb0015e0e66d95d64ed0", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs_download.go@d647f2f83985e23c7ad8eb0015e0e66d95d64ed0", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9474602020263556, - "currentLines": 1151, - "largest-file-health": 0.8679409209383145 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30633411703", - "attempt": 1, - "createdAt": "2026-07-31T13:10:36Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30633411703", - "sha": "409bbd1e8cad15c894ebe723af6c51f7706aa0e4", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs_download.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-02T13:10:36Z", - "maturesAt": "2026-08-02T13:10:36Z", - "mature": true, - "case": { - "compliantLines": 249061, - "eligibleFileCount": 1171, - "initialLines": 1151, - "path": "pkg/cli/logs_download.go", - "subjectSha": "409bbd1e8cad15c894ebe723af6c51f7706aa0e4", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 262891 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "8015865983a6e7f40cebb57663f08da6f7b3e754", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs_download.go@8015865983a6e7f40cebb57663f08da6f7b3e754", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.947392645621189, - "currentLines": 1151, - "largest-file-health": 0.8679409209383145 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30818255093", - "attempt": 1, - "createdAt": "2026-08-03T13:30:19Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30818255093", - "sha": "dd3a2662924c0669acc210f7d014900e7de37d72", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.9662058371735791, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/logs_download.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-05T13:30:19Z", - "maturesAt": "2026-08-05T13:30:19Z", - "mature": true, - "case": { - "compliantLines": 248081, - "eligibleFileCount": 1179, - "initialLines": 1151, - "path": "pkg/cli/logs_download.go", - "subjectSha": "dd3a2662924c0669acc210f7d014900e7de37d72", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 265055 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "fb136c8e53cab01aed88fecc9fa7772c8a215c2e", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/logs_download.go@fb136c8e53cab01aed88fecc9fa7772c8a215c2e", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9359604610363886, - "currentLines": 522, - "largest-file-health": 0.8679409209383145 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "30912688155", - "attempt": 1, - "createdAt": "2026-08-04T13:12:36Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/30912688155", - "sha": "28ef1c20a20bb0314c66fb1c7bfd6e011b38ef4e", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/awf_helpers.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-06T13:12:36Z", - "maturesAt": "2026-08-06T13:12:36Z", - "mature": true, - "case": { - "compliantLines": 250034, - "eligibleFileCount": 1184, - "initialLines": 1148, - "path": "pkg/workflow/awf_helpers.go", - "subjectSha": "28ef1c20a20bb0314c66fb1c7bfd6e011b38ef4e", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 265947 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "67a21723c70f511561232ba62d9b0cf0bec57f67", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/awf_helpers.go@67a21723c70f511561232ba62d9b0cf0bec57f67", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9401647696721527, - "currentLines": 1148, - "largest-file-health": 0.8702090592334495 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31008878441", - "attempt": 1, - "createdAt": "2026-08-05T13:09:26Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31008878441", - "sha": "9eb6731f56ffc7a67c5be495332de07c13b35d59", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/awf_helpers.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-07T13:09:26Z", - "maturesAt": "2026-08-07T13:09:26Z", - "mature": true, - "case": { - "compliantLines": 250168, - "eligibleFileCount": 1181, - "initialLines": 1148, - "path": "pkg/workflow/awf_helpers.go", - "subjectSha": "9eb6731f56ffc7a67c5be495332de07c13b35d59", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 266067 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "69c6ca4a0238b869a27e833f5760e4f56769057c", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/awf_helpers.go@69c6ca4a0238b869a27e833f5760e4f56769057c", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9402443745372406, - "currentLines": 1148, - "largest-file-health": 0.8702090592334495 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31104565537", - "attempt": 1, - "createdAt": "2026-08-06T13:08:56Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31104565537", - "sha": "67a21723c70f511561232ba62d9b0cf0bec57f67", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/awf_helpers.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-08T13:08:56Z", - "maturesAt": "2026-08-08T13:08:56Z", - "mature": true, - "case": { - "compliantLines": 250111, - "eligibleFileCount": 1184, - "initialLines": 1148, - "path": "pkg/workflow/awf_helpers.go", - "subjectSha": "67a21723c70f511561232ba62d9b0cf0bec57f67", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 266044 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "ef11208896d169916726da0011b4712ade36bd8d", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/awf_helpers.go@ef11208896d169916726da0011b4712ade36bd8d", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9401114101426832, - "currentLines": 138, - "largest-file-health": 0.8702090592334495 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31180156016", - "attempt": 1, - "createdAt": "2026-08-07T12:53:45Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31180156016", - "sha": "69c6ca4a0238b869a27e833f5760e4f56769057c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/awf_helpers.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-09T12:53:45Z", - "maturesAt": "2026-08-09T12:53:45Z", - "mature": true, - "case": { - "compliantLines": 249840, - "eligibleFileCount": 1186, - "initialLines": 1148, - "path": "pkg/workflow/awf_helpers.go", - "subjectSha": "69c6ca4a0238b869a27e833f5760e4f56769057c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 266778 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "94216fa66b416e64d02b846650137879dbe30281", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/awf_helpers.go@94216fa66b416e64d02b846650137879dbe30281", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9365090074893732, - "currentLines": 143, - "largest-file-health": 0.8702090592334495 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31390212511", - "attempt": 1, - "createdAt": "2026-08-10T12:54:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31390212511", - "sha": "ad411fd66ade8dc6407e1b874b86dbda58357911", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_actions.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-12T12:54:20Z", - "maturesAt": "2026-08-12T12:54:20Z", - "mature": true, - "case": { - "compliantLines": 253332, - "eligibleFileCount": 1204, - "initialLines": 1144, - "path": "pkg/cli/update_actions.go", - "subjectSha": "ad411fd66ade8dc6407e1b874b86dbda58357911", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 269155 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "f791e7b0b934118f8e5ae5378d17f58fdf18f842", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_actions.go@f791e7b0b934118f8e5ae5378d17f58fdf18f842", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9412123126079768, - "currentLines": 1144, - "largest-file-health": 0.8732517482517482 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31493450865", - "attempt": 1, - "createdAt": "2026-08-11T12:53:56Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31493450865", - "sha": "d268658f31276f29657433ed15ce6d1924c1018c", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_actions.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-13T12:53:56Z", - "maturesAt": "2026-08-13T12:53:56Z", - "mature": true, - "case": { - "compliantLines": 253990, - "eligibleFileCount": 1205, - "initialLines": 1144, - "path": "pkg/cli/update_actions.go", - "subjectSha": "d268658f31276f29657433ed15ce6d1924c1018c", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 269815 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "b2ef1f3e80c8cd4853c672a8390d8feb3f308b39", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_actions.go@b2ef1f3e80c8cd4853c672a8390d8feb3f308b39", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9413487018883309, - "currentLines": 1144, - "largest-file-health": 0.8732517482517482 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31598724529", - "attempt": 1, - "createdAt": "2026-08-12T12:54:23Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31598724529", - "sha": "f791e7b0b934118f8e5ae5378d17f58fdf18f842", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_actions.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-14T12:54:23Z", - "maturesAt": "2026-08-14T12:54:23Z", - "mature": true, - "case": { - "compliantLines": 254738, - "eligibleFileCount": 1213, - "initialLines": 1144, - "path": "pkg/cli/update_actions.go", - "subjectSha": "f791e7b0b934118f8e5ae5378d17f58fdf18f842", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 270584 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "9052088f5f61a79fd454dbcb4d6ab2add261676a", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_actions.go@9052088f5f61a79fd454dbcb4d6ab2add261676a", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9414377790261065, - "currentLines": 1144, - "largest-file-health": 0.8732517482517482 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31702260834", - "attempt": 1, - "createdAt": "2026-08-13T12:54:14Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31702260834", - "sha": "b2ef1f3e80c8cd4853c672a8390d8feb3f308b39", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_actions.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-15T12:54:14Z", - "maturesAt": "2026-08-15T12:54:14Z", - "mature": true, - "case": { - "compliantLines": 254738, - "eligibleFileCount": 1213, - "initialLines": 1144, - "path": "pkg/cli/update_actions.go", - "subjectSha": "b2ef1f3e80c8cd4853c672a8390d8feb3f308b39", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 270584 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "caa9b6be4d96b1c470a5c539938c8d8d9aa0b716", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_actions.go@caa9b6be4d96b1c470a5c539938c8d8d9aa0b716", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9414377790261065, - "currentLines": 1144, - "largest-file-health": 0.8732517482517482 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "31802321876", - "attempt": 1, - "createdAt": "2026-08-14T12:54:19Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/31802321876", - "sha": "9052088f5f61a79fd454dbcb4d6ab2add261676a", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/update_actions.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-16T12:54:19Z", - "maturesAt": "2026-08-16T12:54:19Z", - "mature": true, - "case": { - "compliantLines": 254199, - "eligibleFileCount": 1214, - "initialLines": 1144, - "path": "pkg/cli/update_actions.go", - "subjectSha": "9052088f5f61a79fd454dbcb4d6ab2add261676a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 271169 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "c4d1d5325b25e14bd459c644002b463962ed0fae", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/update_actions.go@c4d1d5325b25e14bd459c644002b463962ed0fae", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9374191002658858, - "currentLines": 0, - "largest-file-health": 0.8732517482517482 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32032012474", - "attempt": 1, - "createdAt": "2026-08-17T12:52:05Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32032012474", - "sha": "6be1e491818cd7563371734fa57d4b798b578b75", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/compiler_custom_jobs.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-19T12:52:05Z", - "maturesAt": "2026-08-19T12:52:05Z", - "mature": true, - "case": { - "compliantLines": 255189, - "eligibleFileCount": 1231, - "initialLines": 1142, - "path": "pkg/workflow/compiler_custom_jobs.go", - "subjectSha": "6be1e491818cd7563371734fa57d4b798b578b75", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 273266 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "3ce9975a17a3da255d3afcf46db41a163384d7ca", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/compiler_custom_jobs.go@3ce9975a17a3da255d3afcf46db41a163384d7ca", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9338483382491785, - "currentLines": 169, - "largest-file-health": 0.8747810858143608 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32139147957", - "attempt": 1, - "createdAt": "2026-08-18T12:52:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32139147957", - "sha": "7f8d2d80c25e626f098cf5fc62779395b5d35194", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/experiments_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-20T12:52:20Z", - "maturesAt": "2026-08-20T12:52:20Z", - "mature": true, - "case": { - "compliantLines": 258553, - "eligibleFileCount": 1240, - "initialLines": 1120, - "path": "pkg/cli/experiments_command.go", - "subjectSha": "7f8d2d80c25e626f098cf5fc62779395b5d35194", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 273304 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "0b8a771e720d9fc186f00913d3f40c3cde38d267", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/experiments_command.go@0b8a771e720d9fc186f00913d3f40c3cde38d267", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.946027134619325, - "currentLines": 257, - "largest-file-health": 0.8919642857142858 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32254939438", - "attempt": 1, - "createdAt": "2026-08-19T12:52:20Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32254939438", - "sha": "3ce9975a17a3da255d3afcf46db41a163384d7ca", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/add_package_manifest.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-21T12:52:20Z", - "maturesAt": "2026-08-21T12:52:20Z", - "mature": true, - "case": { - "compliantLines": 262625, - "eligibleFileCount": 1251, - "initialLines": 1330, - "path": "pkg/cli/add_package_manifest.go", - "subjectSha": "3ce9975a17a3da255d3afcf46db41a163384d7ca", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 275408 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "36375714dd89ca927463bf841bc3d16e9132640a", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/add_package_manifest.go@36375714dd89ca927463bf841bc3d16e9132640a", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9535852262824609, - "currentLines": 130, - "largest-file-health": 0.7511278195488722 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32371165918", - "attempt": 1, - "createdAt": "2026-08-20T12:52:58Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32371165918", - "sha": "0b8a771e720d9fc186f00913d3f40c3cde38d267", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/audit.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-22T12:52:58Z", - "maturesAt": "2026-08-22T12:52:58Z", - "mature": true, - "case": { - "compliantLines": 264686, - "eligibleFileCount": 1258, - "initialLines": 1098, - "path": "pkg/cli/audit.go", - "subjectSha": "0b8a771e720d9fc186f00913d3f40c3cde38d267", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 276153 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "98005b65df6bf95bc5cd67aaafb7ea2756759300", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/audit.go@98005b65df6bf95bc5cd67aaafb7ea2756759300", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9584759173356798, - "currentLines": 80, - "largest-file-health": 0.9098360655737705 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32483983659", - "attempt": 1, - "createdAt": "2026-08-21T12:52:27Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32483983659", - "sha": "36375714dd89ca927463bf841bc3d16e9132640a", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/workflow_builder.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-23T12:52:27Z", - "maturesAt": "2026-08-23T12:52:27Z", - "mature": true, - "case": { - "compliantLines": 266645, - "eligibleFileCount": 1275, - "initialLines": 1084, - "path": "pkg/workflow/workflow_builder.go", - "subjectSha": "36375714dd89ca927463bf841bc3d16e9132640a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 278188 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "97d39fae57642c74c503ae138f8ab735d36b46ce", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/workflow_builder.go@97d39fae57642c74c503ae138f8ab735d36b46ce", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9585064776338303, - "currentLines": 213, - "largest-file-health": 0.9215867158671587 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32729454860", - "attempt": 1, - "createdAt": "2026-08-24T12:52:38Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32729454860", - "sha": "398b1c9247189c14f57c9d63a056d516ad327d39", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 1, - "status": "pass", - "opportunityKey": "go-file:pkg/workflow/safe_outputs_handler_registry.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-26T12:52:38Z", - "maturesAt": "2026-08-26T12:52:38Z", - "mature": true, - "case": { - "compliantLines": 274181, - "eligibleFileCount": 1298, - "initialLines": 1091, - "path": "pkg/workflow/safe_outputs_handler_registry.go", - "subjectSha": "398b1c9247189c14f57c9d63a056d516ad327d39", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 285746 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/workflow/safe_outputs_handler_registry.go@5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9595269925038321, - "currentLines": 81, - "largest-file-health": 0.9156736938588451 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32850038837", - "attempt": 1, - "createdAt": "2026-08-25T12:52:31Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32850038837", - "sha": "012c51f6eb707856f52550ba3b138bca594d2346", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/cli/add_command.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-27T12:52:31Z", - "maturesAt": "2026-08-27T12:52:31Z", - "mature": true, - "case": { - "compliantLines": 279879, - "eligibleFileCount": 1317, - "initialLines": 1129, - "path": "pkg/cli/add_command.go", - "subjectSha": "012c51f6eb707856f52550ba3b138bca594d2346", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 288294 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/cli/add_command.go@5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9708110470561302, - "currentLines": 1129, - "largest-file-health": 0.8848538529672276 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "32970983023", - "attempt": 1, - "createdAt": "2026-08-26T12:52:57Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/32970983023", - "sha": "f50bb57c44aa66d5bab92b6e34b114d82ee94ddd", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-28T12:52:57Z", - "maturesAt": "2026-08-28T12:52:57Z", - "mature": true, - "case": { - "compliantLines": 280774, - "eligibleFileCount": 1321, - "initialLines": 1065, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "f50bb57c44aa66d5bab92b6e34b114d82ee94ddd", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 288061 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9747032746536324, - "currentLines": 1065, - "largest-file-health": 0.9380281690140845 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "33092733487", - "attempt": 1, - "createdAt": "2026-08-27T16:20:44Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/33092733487", - "sha": "2871ee4d8d73b5870dffbdd6799afeec18994ab9", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-29T16:20:44Z", - "maturesAt": "2026-08-29T16:20:44Z", - "mature": true, - "case": { - "compliantLines": 282053, - "eligibleFileCount": 1325, - "initialLines": 1065, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "2871ee4d8d73b5870dffbdd6799afeec18994ab9", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 289345 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9747982512225889, - "currentLines": 1065, - "largest-file-health": 0.9380281690140845 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "33191223654", - "attempt": 1, - "createdAt": "2026-08-28T16:42:15Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/33191223654", - "sha": "b440e85b4d8a1a107e18a03bfaa7acab9fe0a49a", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.03418803418803419, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:03:15Z", - "evidenceCutoff": "2026-08-30T16:42:15Z", - "maturesAt": "2026-08-30T16:42:15Z", - "mature": true, - "case": { - "compliantLines": 282809, - "eligibleFileCount": 1326, - "initialLines": 1085, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "b440e85b4d8a1a107e18a03bfaa7acab9fe0a49a", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 291174 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9712714734145219, - "currentLines": 1065, - "largest-file-health": 0.9207373271889401 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - }, - { - "run": { - "id": "33393528423", - "attempt": 1, - "createdAt": "2026-08-31T12:47:32Z", - "conclusion": "success", - "url": "https://github.com/github/gh-aw/actions/runs/33393528423", - "sha": "58f822becac0d9bc99015f923310bee28e03ac60", - "ref": "refs/heads/main", - "eventName": "schedule" - }, - "value": 0.03418803418803419, - "status": "pass", - "opportunityKey": "go-file:pkg/parser/import_field_extractor.go", - "evidenceAt": "2026-09-01T07:28:51Z", - "evidenceCutoff": "2026-09-01T07:28:51Z", - "maturesAt": "2026-09-02T12:47:32Z", - "mature": false, - "case": { - "compliantLines": 284045, - "eligibleFileCount": 1333, - "initialLines": 1085, - "path": "pkg/parser/import_field_extractor.go", - "subjectSha": "58f822becac0d9bc99015f923310bee28e03ac60", - "targetLines": 500, - "thresholdLines": 1000, - "totalLines": 292410 - }, - "provenance": [ - { - "kind": "git-commit", - "ref": "5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - }, - { - "kind": "go-source", - "ref": "pkg/parser/import_field_extractor.go@5cd744cc263a9d1ec5660fbf5604eaceb6f83430", - "repository": "github/gh-aw" - } - ], - "diagnostics": { - "compliant-line-mass-share": 0.9713929072193154, - "currentLines": 1065, - "largest-file-health": 0.9207373271889401 - }, - "baselineValue": null, - "deltaFromBaseline": null, - "evaluatorDigest": "de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85", - "source": "evaluator-replay" - } - ], - "caveat": "Operational value is observational. Replayed historical values apply one frozen evaluator digest to every run and do not establish that the workflow caused the measured outcome." -} diff --git a/reports/operational-value/daily-file-diet-operational-value.md b/reports/operational-value/daily-file-diet-operational-value.md deleted file mode 100644 index 8225c45d361..00000000000 --- a/reports/operational-value/daily-file-diet-operational-value.md +++ /dev/null @@ -1,84 +0,0 @@ -# Daily File Diet operational value - -![Daily File Diet operational value timeline](daily-file-diet-operational-value.svg) - -## Summary - -- **Operational value:** Decompose the run's largest oversized non-test Go file toward 500 lines. -- **History:** 2025-11-15T13:36:21Z through 2026-09-01T07:28:51Z -- **Coverage:** 245 of 245 runs produced numeric values; 0 unavailable; 0 errors -- **Current evaluator:** `de2d2a8309ba6567ffb7b62839e2272b89f663f548d07e661fded70b0d020a85` -- **Weekly cache:** 244 hits; 1 runs evaluated in this invocation -- **Latest value:** 0.0342 (-0.4932 from the first numeric observation) -- **Diagnostic, Largest-file health at assignment:** 0.9207 (+0.3969 across observed runs) -- **Diagnostic, Compliant line-mass share at assignment:** 0.9714 (+0.1228 across observed runs) -- **Structured report:** [daily-file-diet-operational-value.json](daily-file-diet-operational-value.json) - -## Weekly History - -| Week | Runs | Distinct opportunities | Primary mean | Primary range | Largest-file health at assignment | Compliant line-mass share at assignment | -|---|---:|---:|---:|---:|---:|---:| -| 2025-11-10 | 4 | 2 | 0.2637 | 0-0.5274 | 0.5547 | 0.8619 | -| 2025-11-17 | 7 | 1 | 0 | 0-0 | 0.5547 | 0.8149 | -| 2025-11-24 | 5 | 1 | 0 | 0-0 | 0.5516 | 0.782 | -| 2025-12-01 | 5 | 2 | 0.8299 | 0.6598-1 | 0.5722 | 0.8024 | -| 2025-12-08 | 4 | 2 | 0.6259 | 0.2518-1 | 0.6529 | 0.8205 | -| 2025-12-15 | 7 | 5 | 0.7624 | 0-1 | 0.772 | 0.9083 | -| 2025-12-22 | 15 | 3 | 0.6667 | 0-1 | 0.856 | 0.951 | -| 2025-12-29 | 9 | 4 | 1 | 1-1 | 0.9505 | 0.9689 | -| 2026-01-05 | 5 | 4 | 0.7528 | 0.0111-1 | 0.8175 | 0.9882 | -| 2026-01-12 | 6 | 1 | 0 | 0-0 | 0.7738 | 0.9483 | -| 2026-01-19 | 5 | 5 | 0.7986 | 0-1 | 0.8864 | 0.9628 | -| 2026-01-26 | 5 | 4 | 0.712 | 0-1 | 0.999 | 0.9826 | -| 2026-02-02 | 5 | 2 | 0 | 0-0 | 0.9354 | 0.9737 | -| 2026-02-09 | 5 | 2 | 0 | 0-0 | 0.7428 | 0.972 | -| 2026-02-16 | 5 | 1 | 1 | 1-1 | 0.7281 | 0.9649 | -| 2026-02-23 | 8 | 1 | 1 | 1-1 | 0.9033 | 0.9682 | -| 2026-03-02 | 5 | 2 | 0.5 | 0-1 | 0.993 | 0.992 | -| 2026-03-09 | 8 | 5 | 0.7621 | 0-1 | 0.9662 | 0.9922 | -| 2026-03-16 | 14 | 2 | 0 | 0-0 | 0.8872 | 0.9618 | -| 2026-03-23 | 5 | 1 | 0 | 0-0 | 0.75 | 0.9555 | -| 2026-03-30 | 5 | 1 | 0 | 0-0 | 0.75 | 0.9771 | -| 2026-04-06 | 5 | 1 | 0.3197 | 0.3197-0.3197 | 0.75 | 0.9569 | -| 2026-04-13 | 5 | 3 | 1 | 1-1 | 0.9216 | 0.987 | -| 2026-04-20 | 5 | 2 | 0.0282 | 0-0.0563 | 0.9842 | 0.9879 | -| 2026-04-27 | 5 | 3 | 0 | 0-0 | 0.919 | 0.9762 | -| 2026-05-04 | 6 | 2 | 0.0595 | 0-0.1191 | 0.9174 | 0.9594 | -| 2026-05-11 | 5 | 2 | 0 | 0-0 | 0.8524 | 0.9541 | -| 2026-05-18 | 5 | 2 | 0.0275 | 0-0.055 | 0.8182 | 0.9503 | -| 2026-05-25 | 5 | 2 | 0 | 0-0 | 0.5374 | 0.9326 | -| 2026-06-01 | 5 | 1 | 0.642 | 0.642-0.642 | 0.5354 | 0.922 | -| 2026-06-08 | 5 | 1 | 0 | 0-0 | 0.6923 | 0.926 | -| 2026-06-15 | 5 | 2 | 0 | 0-0 | 0.6404 | 0.9213 | -| 2026-06-22 | 4 | 2 | 0.5 | 0-1 | 0.6479 | 0.9185 | -| 2026-06-29 | 5 | 1 | 0 | 0-0 | 0.6458 | 0.9213 | -| 2026-07-06 | 5 | 4 | 0.7172 | 0-1 | 0.8445 | 0.9548 | -| 2026-07-13 | 6 | 3 | 0.6667 | 0-1 | 0.8311 | 0.9492 | -| 2026-07-20 | 5 | 2 | 0.5 | 0-1 | 0.8755 | 0.9547 | -| 2026-07-27 | 6 | 3 | 0.3333 | 0-1 | 0.8679 | 0.9474 | -| 2026-08-03 | 5 | 2 | 0.9831 | 0.9662-1 | 0.8702 | 0.9365 | -| 2026-08-10 | 5 | 1 | 1 | 1-1 | 0.8733 | 0.9374 | -| 2026-08-17 | 5 | 5 | 1 | 1-1 | 0.9216 | 0.9585 | -| 2026-08-24 | 5 | 3 | 0.3447 | 0-1 | 0.9207 | 0.9713 | -| 2026-08-31 | 1 | 1 | 0.0342 | 0.0342-0.0342 | 0.9207 | 0.9714 | - -## Frozen Contract - -- **Opportunity:** Largest non-test pkg/**/*.go blob at the run commit; below 1000 is healthy. -- **Assignment:** Greatest wc -l, reverse lexical tie-break. Key: go-file: or repository-health:non-test-go-under-1000; duplicates repeat. -- **Accepted evidence:** Git evidence of assigned-path reduction toward 500 lines or tree-proven absence; issues and traces are excluded. -- **Collection:** With contents:read, count newlines in the run commit archive for assignment and in the cutoff commit blob for evidence. -- **Maturation:** Two days; five pre-adoption issue/PR pairs (#1636-#3564) took 0.04-0.84 days. -- **Zero rule:** No reduction from the initial oversized file scores 0. -- **Missing rule:** Invalid, unavailable, or truncated Git evidence scores null; tree-proven path absence is attainment. -- **Primary metric:** `assigned-go-file-decomposition` = initialLines < 1000 => 1; else clamp((initialLines-currentLines)/(initialLines-500),0,1). Proven absence sets currentLines=0. -- **Diagnostic metric:** `largest-file-health` (latest) = min(1, 999 / initialLines) when the assignment archive contains eligible files. -- **Diagnostic metric:** `compliant-line-mass-share` (latest) = compliantLines / totalLines when the assignment archive contains eligible files and positive line mass. - -## Coverage Notes - -57 distinct opportunity keys were observed; 188 additional numeric observations repeated a key. Repeated observations remain visible in the plot but are not treated as independent within a weekly mean. - -## Interpretation - -Operational value is observational. Replayed historical values apply one frozen evaluator digest to every run and do not establish that the workflow caused the measured outcome. Diagnostic metrics provide context but are not combined with the primary value. Pre-grader runs have no archived case or event payload, so their cases are reconstructed only when the evaluator supports assignment from the run subject. Missing evidence is never treated as zero. diff --git a/reports/operational-value/daily-file-diet-operational-value.svg b/reports/operational-value/daily-file-diet-operational-value.svg deleted file mode 100644 index 88d860d9b79..00000000000 --- a/reports/operational-value/daily-file-diet-operational-value.svg +++ /dev/null @@ -1,51 +0,0 @@ - -Daily File Diet operational value over time -Outcome changes relative to the first post-adoption observation and a separate weekly per-run attainment trend under evaluator de2d2a8309ba. - - -Daily File Diet -Largest-file health at assignment improved since adoption -245 runs · evaluator de2d2a8309ba -Largest-file health at assignment -52.4% → 92.1% -+39.7 pts since adoption -Compliant line-mass share at assignment -84.9% → 97.1% -+12.3 pts since adoption -Outcome change since adoption -Percentage-point change from each metric's first observed value - -+50 pts -+25 pts -0 pts --25 pts --50 pts -Nov 15 -Jan 02 -Feb 20 -Apr 09 -May 27 -Jul 15 -Sep 01 -Adoption -0 pts = first observed value - -Gain from adoption for Largest-file health at assignment - - -+39.7 pts - - -+12.3 pts -Largest-file health at assignment -Compliant line-mass share at assignment -Per-run operational attainment -Weekly values (thin) · 4-week rolling mean (bold) · separate from repository health -0% -50% -100% - - -4-week avg 59.5% -Observed association only; the report does not establish that the workflow caused these changes. -