Conversation
…takes remainder The v3 CyberGym lane (30%) previously RENORMALIZED the top-N fixed shares when fewer than five miners qualified. _award_shares now gives the BOTTOM ranks their fixed level shares from the bottom up (rank n -> S5, rank n-1 -> S4, ...) and rank 1 the remainder, so the lane still pays its full 1.0 while a thin field concentrates on the leader (winner-take-most): N=1 [1.00] N=2 [0.96, 0.04] N=3 [0.89, 0.07, 0.04] N=4 [0.79, 0.10, 0.07, 0.04] N=5 [0.65, 0.14, 0.10, 0.07, 0.04] Level scores are the existing TOURNAMENT_SHARES; shares always sum to 1. Change is byte-identical in cathedral-distill's cybergym_tournament (BOUNDARY.md fork hazard), guarded by an identical golden test in both repos. N=0 (empty lane) is unchanged here; the N=0->compute redirect lands in a follow-up. Reward-path; for wallscaler review, not self-merged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Co-merge required (fork hazard). This |
wallscaler
left a comment
There was a problem hiding this comment.
Reviewed from fresh clones in Python 3.11 venvs with bittensor importable, so the chain-submission tests ran here. Line numbers are on the PR heads unless marked.
PR 2: cathedral-validator #146 (same curve, vendored copy)
Artifact. scaffold/publisher/cybergym_tournament.py::_award_shares, updated expectation in test_mechanism_cybergym_adapter.py:806-811, new golden test at :822-841.
Question. Is the change byte-identical to #161, and are there any pins between the repos that must move.
Out of scope. Curve design; N=0 handling.
Verdict
- Merge in the same sitting as #161. The two PR hunks are byte-identical; no runtime pin crosses the repos for this file.
Byte-identity, verified
- The added and removed lines of the two hunks are identical (
diffof the+/-lines, exit 0). - The whole files differ only by the six-line VENDORED header at validator lines 3-8, which already differs on both mains. The header pins
cathedral_distill.cybergym_tournament @ a470b59; nothing tests that pin. - Tests:
test_mechanism_cybergym_adapter.py52 passed on the PR head, including the golden test andtest_vendored_tournament_constants_match_the_mechanism.
Findings
- None.
Refuted
- "The DISTILL_CONTRACT_COMMIT pin must be bumped." Refuted:
pyproject.toml:100andcathedral_thin/integration.py:39pin distillb2ad1edd, which predates the tournament (distill #108,72366b5) entirely. That pin serves the receipt/lane/config contract for the optionalcathedral_distillextra, and the publisher uses the vendored copy by design ("duplicate rather than depend", header lines 4-5). No bump is needed for this curve. - "The validator re-derives the tournament and an old validator would compute different shares." Refuted:
validator_thin.pynever importscybergym_tournament; it re-verifies lane mass and bindings only (:3413-3416). Authority/FULL mode refuses v3 outright (validator_thin.py:1642-1654). The curve is publisher-only at runtime.
Observations
- The VENDORED header should say the distill commit it now mirrors (the #161 merge sha) instead of
a470b59. Cosmetic, but it is the only thing that records the lockstep. - The header also cites
tests/.../test_cybergym_tournament_vendored.py, which does not exist; the constants guard lives intest_mechanism_cybergym_adapter.py:813. Pre-existing drift. git diffof #146 against current main touches nothing else in the two files; the PR is 40+ commits behind but merges clean (GitHub reports MERGEABLE).
Questions for the author
Merge order: same sitting as distill #161 (rebased, README count set from collection). Either order at runtime; the co-merge is a source-of-truth discipline.
The live publisher was not paying jared's decided curve. distill moved cybergym_tournament to the KING model on 2026-09-04 (#181: ranks 2-5 take fixed runner-up shares 0.07/0.03/0.03/0.03, the king takes the residual, so a thin field concentrates on the leader). The publisher's VENDORED copy -- which is what the live weight path composes from -- still renormalized the old 0.65/0.14/0.10/0.07/ 0.04 table, so with two winners it paid 0.82/0.18 where the spec says 0.93/0.07. The vendored file is re-synced from distill main (de916cf) and the header records that commit. The existing constants guard did not catch the drift, because the two copies had DIFFERENT CONSTANTS (TOURNAMENT_SHARES vs RUNNER_UP_SHARES) rather than different values of one, and the guard pinned the name it knew. `test_vendored_award_shares_matches_distills_king_schedule` now pins the SCHEDULE rank by rank for every field size, which is what actually pays, and asserts the lane sums to 1 for any non-empty field. Supersedes #146 (which vendored an older bottom-fill table) and its distill twin #161.
|
Superseded by #239, which syncs the vendored copy to distill main's KING curve ( Context that changed since this was opened: distill #181 landed jared's KING spec on 2026-09-04 ( Your two asks are carried over into #239: the header sha now names the distill commit being mirrored, and the missing lockstep guard exists — |
Implements jared's v3 CyberGym-lane payout curve (STAGE A of the v3 lane redesign). With fewer than five qualified miners, the bottom ranks take their fixed level shares from the bottom up and rank 1 absorbs the remainder (winner-take-most), replacing the old renormalize:
Level scores are the existing
TOURNAMENT_SHARES; shares always sum to 1. The change is byte-identical incathedral-validatorandcathedral-distillcybergym_tournament.py(BOUNDARY.md fork hazard), guarded by an identical golden test in both.N=0 (empty lane) is unchanged here; the N=0->compute redirect is a follow-up (it touches the validator re-derivation and is a v3 contract-shape change).
Reward-path; not self-merged.
🤖 Generated with Claude Code