Skip to content

The climb board: data, table, and chart of every attempt, kernel-published - #193

Merged
renmengye merged 14 commits into
mainfrom
feat/climb-board
Aug 30, 2026
Merged

renmengye merged 14 commits into
mainfrom
feat/climb-board

Conversation

@renmengye

Copy link
Copy Markdown
Member

Summary

The climb finally gets a face. When runs end, the tick publishes to the target's research-log branch:

  • climb/<benchmark>.json — one row per terminal attempt (agent, date, hypothesis one-liner, outcome, baseline/candidate, GPU-hours, PR link), merged by run id — published history is never rewritten, and it survives a future state-root reaper.
  • CLIMB.md — headline numbers + the attempts table, newest first (plain markdown; GitHub renders it).
  • climb.html — a self-contained chart.js page over the JSON (candidate scatter colored by outcome, best-so-far step line, baseline dashes, hypothesis tooltips). Open from a clone today; a Pages site serves it unchanged at the public flip.

Why not a GitHub Action + Pages now: Pages access control is Enterprise-only (a private repo's dashboard would be public), an Action would reconstruct state the kernel already has, and Actions minutes stay reserved for CI.

Idempotent by construction (merge by run id, write only on change), advisory like the ledger (a failure never stops the tick).

Test plan

  • ruff, format, mypy, pytest (885 passed; 4 new tests)
  • Row collection from terminal records + reports; idempotent merge that keeps published history; both views render; service writes 3 files once, nothing on no change, only changed files on a new run
  • Review rounds; then read CLIMB.md on gpt-speedrun's research-log after the next terminal run

🤖 Generated with Claude Code

…ished

CLIMB.md (numbers + attempts table, rendered by GitHub),
climb/<benchmark>.json (the data contract), and climb.html (a chart.js
page over the JSON) land on the target's research-log branch as runs
end — published by a tick service like the ledger, not a GitHub Action:
Pages is public on a private repo's plan, an Action would rebuild kernel
state, and Actions minutes stay spent on CI. Rows merge by run id and
files are written only on change, so the service is idempotent and
history survives a state-root cleanup. At the public flip a Pages site
serves the same files unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 1 — reviewed head 0d38f9c8 — reviewer summarizer:hermes/gpt-5.6-terra over coverage+credentials+deployment+general+lifecycle+prose.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 5 blocking, 0 advisory.

5 findings attached to the lines below.

Verdict: block merge. The board can erase historical benchmarks from shared rendered views, rank max-direction metrics backward, leave views unrecoverable after a partial view upload, fail under the documented direct-from-clone workflow, and publish links to JSON that failed to upload. Rejected findings: none; the lower blocking assessments for the failed-JSON and historical-view findings were merged into the corroborated blocking defects rather than treated as separate claims.

Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
…t data

The board keeps its own memory (climb/index.json: benchmark -> direction),
so a benchmark whose local records were cleaned up keeps its place in the
views. Both views honor direction: max. Every file is compared against
the branch each pass, which is also the retry for a failed upload. A
benchmark whose fresh JSON could not be uploaded renders from its last
published rows, never data that is not on the branch. The chart data is
embedded in climb.html — a browser blocks fetch() on a file:// page, so
the direct-from-clone view needs it inline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 1 — reviewed head 7fdd0cb5 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 2 blocking, 0 advisory.

2 findings attached to the lines below.

The board uses the wrong direction for max benchmarks and embeds report text as executable HTML script data.

Comment thread src/autoresearch/tick.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
… escape its script

The tick passes the contract's benchmark directions (it had loaded the
contract lines earlier and passed nothing). "<" is escaped inside the
embedded JSON, so an agent-written hypothesis carrying </script> stays
data instead of running in the published page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 — reviewed head 9aed2bf1 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: nothing blocking — 1 advisory note.

1 finding attached to the lines below.

A transient board-data read can erase an indexed benchmark from the published views.

Comment thread src/autoresearch/climbboard.py Resolved
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 3 — reviewed head 489ddaae — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 1 blocking, 0 advisory.

1 finding attached to the lines below.

A transient failure while reading the board index can overwrite it and remove published benchmark history.

Comment thread src/autoresearch/climbboard.py Resolved
The index is read with the raising client call so a 404 (no board yet)
and an outage are distinct: the first starts fresh, the second skips the
index write for the pass — a transient failure must not shrink the
board's memory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 4 — reviewed head a3211fad — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: nothing blocking — 1 advisory note.

1 finding attached to the lines below.

The per-benchmark row cap drops older published attempts.

Comment thread src/autoresearch/climbboard.py Resolved
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 5 — reviewed head 191eb014 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 2 blocking, 0 advisory.

2 findings attached to the lines below.

Two data-integrity defects found in climb-board publishing.

Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
…rwritten

A run in review is not published until its PR's fate is known (a merged
run lands with its final ending; the views count merged as a win). The
per-benchmark JSON is read with the raising client call, like the index:
a 404 starts fresh, an outage sits the pass out — published history is
never replaced by a blind merge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 6 — reviewed head 0b3ac590 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 3 blocking, 0 advisory.

3 findings attached to the lines below.

The climb board can discard data for an allowed benchmark name, after failed reads, and for GPU-hour totals.

Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
…es terminal transitions

Data files live under climb/data/ (benchmark names are contract-
controlled and 'index' is legal), and _clear_stage keeps gpu_hours_used
when it wipes the waiting bookkeeping, so the board reads real spend
after the transition instead of zero.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 7 — reviewed head f46fefc3 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: no defects found.

Stat chips, a card with a faint grid, and light/dark from the viewer's
system theme — the page people will actually watch deserves more than
default chart.js on white. Content and behavior unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 8 — reviewed head b7f9b83c — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 1 blocking, 0 advisory.

1 finding attached to the lines below.

The board cap can remove pre-existing attempts whose reports were never archived.

Comment thread src/autoresearch/climbboard.py Resolved
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 9 — reviewed head 0514c118 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 1 blocking, 0 advisory.

1 finding attached to the lines below.

The full test suite passes (894 tests), but a transient board-data read can erase published history.

Comment thread src/autoresearch/climbboard.py Resolved
…ever overwritten

Commit 0b3ac59 said this and did not do it: the patch script died on an
anchor mismatch before writing the module, the follow-up applied only
the cosmetic remainder, and the commit landed under the original
message unverified. This commit carries the real changes — collect
publishes only ENDED runs (a merged run lands with its final ending),
and the per-benchmark JSON is read with the raising client call so an
outage sits the pass out instead of blindly overwriting history — plus
the tests that pin both.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A scatter dataset ignores category labels (it wants x/y pairs on a
linear axis), so the mixed chart rendered nothing. All three datasets
now share the category axis; candidates are a point-only line.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 10 — reviewed head 66f15420 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: nothing blocking — 1 advisory note.

1 finding attached to the lines below.

One advisory data-retention issue found. Verified with the full test suite: 895 passed.

Comment thread src/autoresearch/climbboard.py Resolved

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 11 (re-run on the same head) — reviewed head 66f15420 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: no defects found.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 12 — reviewed head 636efb15 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: 1 blocking, 1 advisory.

2 findings attached to the lines below.

Two climb-board correctness defects were found. Full test suite passed: 895 tests.

Comment thread src/autoresearch/climbboard.py Resolved
Comment thread src/autoresearch/climbboard.py Resolved
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 13 — reviewed head 08adb5c3 — reviewer hermes/gpt-5.6-terra.

terra
Advisory findings from autoresearch — the code owner decides. Reply to disagree; the autoresearch:no-review label opts this PR out.

Verdict: no defects found.

@renmengye
renmengye merged commit 07e7361 into main Aug 30, 2026
5 checks passed
@renmengye
renmengye deleted the feat/climb-board branch August 30, 2026 01:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant