소스 정보
- 저장소
- aaif-goose/goose
- 최근 소스 활동
- 2026년 8월 12일 08:31
- 감지된 SKILL.md 언어
- 영어
- 스타
- 53,389
- 포크
- 6,088
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/aaif-goose/goose --skill compare-tasks명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| name | compare-tasks |
| description | Compare how two harbor benchmark runs performed on a single shared task |
Use when given two harbor run names and a task name, and the goal is to understand why the two runs differ on that task — not just that they differ.
RUN_A: harbor run name (e.g. sonnet46-full)RUN_B: harbor run name (e.g. pi-sonnet46-full)TASK: bare task name (e.g. extract-elf, not terminal-bench/extract-elf)RUNS_DIR: defaults to evals/harbor/runs/ relative to the repo rootHarbor 0.8 names trial dirs <task>__<random-suffix> (e.g.
extract-elf__bU3GHs4), not <task>.1. The suffix is unique per trial,
so don't guess it — discover it from disk:
TRIAL_A_DIR=$(ls -d "$RUNS_DIR/$RUN_A/${TASK}__"*/ 2>/dev/null | head -1)
TRIAL_B_DIR=$(ls -d "$RUNS_DIR/$RUN_B/${TASK}__"*/ 2>/dev/null | head -1)
If either is empty, that run didn't include this task — stop and say so.
(ls "$RUNS_DIR/$RUN_A/" shows what's there.)
If you want to confirm the match, every result.json carries task_name
and trial_name:
jq '{task_name, trial_name}' "$TRIAL_A_DIR/result.json"
The fastest path is to let cmd.py task do it for you — it already prints
status, reward, duration, tokens, turns, cost, error class, and the tail of
the verifier stdout:
./evals/harbor/cmd.py task "$RUN_A" "$TASK"
./evals/harbor/cmd.py task "$RUN_B" "$TASK"
Only drop to raw jq against result.json if you need a field cmd.py task
doesn't print. The actual shape (harbor 0.8 TrialResult):
jq '{
reward: (.verifier_result.rewards.reward
// (.verifier_result.rewards | to_entries | .[0].value)
// null),
rewards_all: .verifier_result.rewards,
duration_seconds: ((.finished_at | fromdateiso8601) - (.started_at | fromdateiso8601)),
input_tokens: .agent_result.n_input_tokens,
cache_tokens: .agent_result.n_cache_tokens,
output_tokens: .agent_result.n_output_tokens,
cost_usd: .agent_result.cost_usd,
error_type: .exception_info.exception_type,
error_message: (.exception_info.exception_message // "" | split("\n")[0])
}' "$TRIAL_A_DIR/result.json"
The reward fallback mirrors reporter.trial_reward: if the verifier
didn't use the conventional reward key, take the first value in the
rewards map.
Derive status from those:
pass if reward >= 1.0partial if reward > 0 (and < 1)fail if reward == 0timeout if reward is 0/null and error_type contains "timeout"error if reward is 0/null and error_type is set (non-timeout)no-reward if neither verifier_result.rewards nor exception_info is setReward wins over errors: harbor can record an AgentTimeoutError after the
verifier already scored a pass (the agent finished the work then the harness
timed out during teardown, or it timed out after writing the correct answer).
If we got points, count them. See reporter.trial_status for the canonical
rule.
Several agent_result fields can be null depending on the harness
(notably n_cache_tokens, n_output_tokens, cost_usd on some goose
runs). Don't treat that as a failure — just omit those facts from the
comparison if missing on either side. cmd.py task already applies
harbor's fallbacks (reading goose's complete event from agent/goose.txt
when the structured field is null), so its numbers are the right ones to
report.
The task definitions are NOT in the harbor Python package. They are plain
text files on disk, in harbor's task cache. Do not run find / or
pip show harbor — that is the wrong direction.
Harbor caches under ~/.cache/harbor/ on every platform (it uses
Path("~/.cache/harbor").expanduser() unconditionally — there is no
~/Library/Caches/harbor on macOS, despite what you might expect).
The on-disk layout for package-backed tasks (the common case — everything
in terminal-bench/terminal-bench-2 lands here) is:
~/.cache/harbor/tasks/packages/<org>/<task>/<digest>/
Note: no dataset name in the path. Tasks are keyed by org + task name +
content digest, not by which dataset pulled them. The <digest> segment
changes when the task is republished, so discover the dir rather than
hardcoding:
TASK_DIR=$(ls -d ~/.cache/harbor/tasks/packages/terminal-bench/"$TASK"/*/ 2>/dev/null | head -1)
echo "$TASK_DIR"
ls "$TASK_DIR"
If that's empty, the task could be from a different org or a git source —
broaden the search. find returns the parent (one level above the
digest), so descend one more level. Guard against $PARENT being empty,
otherwise the glob expands to /*/ and matches the filesystem root:
PARENT=$(find ~/.cache/harbor/tasks -type d -name "$TASK" 2>/dev/null | head -1)
if [ -n "$PARENT" ]; then
TASK_DIR=$(ls -d "$PARENT"/*/ 2>/dev/null | head -1)
fi
If both lookups come up empty, the task hasn't been downloaded on this
machine — bail out and report that, rather than guessing. (Runs sync via
cmd.py pull but the task cache does not, so a machine that only inspects
results may never have the spec locally.)
~/.cache/harbor/datasets/ exists too but holds dataset-level metadata,
not the per-task instruction.md / tests/ / solution/ files — not
what you want here.
Inside, you care about three files:
instruction.md — exactly what the agent was asked to dotests/test_outputs.py (or sometimes run-tests.sh) — what the verifier
actually checks, line by linesolution/solution.sh — the reference correct answerWithout all three you can't tell whether a wrong answer was a misread, a shallow bug, or a verifier surprise. Quote the assertion that failed when you describe a failure — paraphrasing is how wrong conclusions sneak in.
Two sources, prefer the first when present:
$TRIAL_DIR/agent/trajectory.json — harbor's ATIF format, one entry per
agent step. jq '.steps[] | {step_id, source, message, tool_calls: [.tool_calls[]?.function_name]}'
gives a compact view. Most current runs have it; some older harness
versions may not.$TRIAL_DIR/agent/<harness>.txt — raw stream-json or log. The filename
matches the harness (commonly goose.txt or pi.txt; other harnesses
use their own name). Don't guess — run ls "$TRIAL_DIR/agent/" and use
whatever .txt file is there.Skim, don't quote in full. For each agent identify:
$TRIAL_DIR/verifier/ typically contains:
test-stdout.txt — the verifier's full stdout (assertion failures, pytest
output, etc.). This is usually the most diagnostic file.reward.txt — the scalar reward as a string.ctrf.json — structured test results in CTRF format, useful if you want
per-assertion pass/fail without grepping stdout.tail -50 "$TRIAL_DIR/verifier/test-stdout.txt"
This is often more diagnostic than the agent log — it tells you exactly which assertion failed and what the agent's output was at that point.
Output markdown with these sections in order:
nm -n so its addresses matched the verifier's
ground truth, A's script used PIE-relocated virtual addresses which the
verifier doesn't normalize"../evals/harbor/cmd.py task <run> <task> for the headline numbersls -d to discover the <task>__<suffix> trial directoriesjq for any result.json field cmd.py task doesn't print$TRIAL_DIR/agent/ and $TRIAL_DIR/verifier/find ~/.cache/harbor/tasks to locate the task specNo Python imports, no harbor package required. Everything you need is on
disk as JSON / text files.
SOC 직업 분류 기준