Repository navigation
agentcompass 0.1.2: sync AgentCompass v0.3.8 scoring (floors, origin, frontier headroom, curves, work-kind inference) - #749
Conversation
Mode A (the default) changes for every user:
- ability floors: routine 3.0 -> 2.3, hard 3.3 -> 3.1 (coupled 3.6, frontier 4.2);
- new ability_score_origin (routine 3.0, hard 3.3, coupled 3.6, frontier 4.2),
graded from max(floor, origin) so a raised floor hands out no free score;
- new critical_headroom_by_difficulty (frontier 0.1);
- opus, sonnet, haiku, luna and fable effort curves; gpt-6-luna tier 3.2 -> 3.1;
- none, off and minimal join EFFORT_ORDER, clamped against each model's curve;
- computer_use needs an action phrase, and a named code file or a debugging
word keeps work out of text translation ("translation of").
Test 8.6 asserts the parity.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
yetone
left a comment
There was a problem hiding this comment.
Reviewed at 69dc43a, against AgentCompass's own source: skills/agent-compass/references/accounts.json and scripts/allocator.py at v0.3.7 (97b9379), 54bb51e and v0.3.9 (e5c5e65). These three agree on every value below.
Matches upstream: the floors (2.3/3.1/3.6/4.2), ability_score_origin, critical_headroom_by_difficulty {frontier: 0.1} and the tool_execution route's ability_floor {hard: 2.7}. Every effort curve matches except gpt-6-luna's: opus, sonnet, haiku, astra, sol, terra, grok-4.7, flash, argon, carbon, fable and deepseek-v4.1-flash-free. COMPUTER_USE_PHRASES, CODE_FILE_RE, the "translation of" rule, the debugging skip and origin = max(floor, origin) match 54bb51e.
Does not match, or is not from upstream. Line comments have the details.
- gpt-6-luna's curve differs from v0.3.7.
- gpt-6-luna's tier 3.2 -> 3.1: upstream's tier is 2.61, so this value has no upstream source.
- The none/off/minimal/ultra handling in
effortValue, the four neweffort_abilityentries and the longerEFFORT_ORDERare not in AgentCompass. Itseffort_valueonly reads the model's curve, then the policy table, then the default, and itsEFFORT_ORDERis low..ultra. - The
canonicalModelloop is unrelated to this PR and isn't mentioned in it. - The body cites a8c707b, 8e5d2b5 and a2215b3. None of them exists in akiiwa-games/AgentCompass. The computer-use, translation and origin changes are 54bb51e, which first shipped in v0.3.8, not v0.3.7. Please fix the title and the citations.
Run (Linux, WSL2 Ubuntu 24.04, Bun 1.4.2, Node 22, worktree at the head): bun test 34 pass; node --test 34 pass; bun scripts/check.mjs ok.
Broken by hand:
- Dropping
Math.max(floor, ...)turns 8.6 red (ability expected 0, got 0.5). - Turning off the translation/debug skip turns 8.6 red ("修复翻译模块的 bug" -> text_in_text_out).
- With all four of these put back at once, 34 of 34 still pass: luna's curve set to upstream's numbers, the effortValue none/off/minimal/ultra branches removed, the new effort_ability entries and EFFORT_ORDER entries removed, and the old canonicalModel restored. No test covers any of them.
- Making
criticalHeadroomignorecritical_headroom_by_difficulty, andabilityFloorignore the route's floor, also leaves 34 of 34 passing. 8.6 only deepEquals the policy objects.
Requested:
- Make gpt-6-luna's curve match upstream's, and drop the tier change (or cite its source).
- Take the effort-fallback and canonicalModel changes out into their own PR, each with a test that fails without it.
- Add behaviour tests:
- the critical frontier gate is 4.3: Astra Max (4.3) is admitted, Astra High (4.2) is not;
- tool_execution/hard uses the 2.7 floor.
- Correct the title and the cited commits.
| }, | ||
| "gpt-6-luna": { | ||
| ability: { low: -0.54, medium: -0.15, high: 0, xhigh: 0.2, max: 0.35 }, | ||
| burn: { low: 0.28, medium: 0.46, high: 0.7, xhigh: 0.85, max: 1.5 }, |
There was a problem hiding this comment.
This doesn't match AgentCompass. In v0.3.7 effort_curves["gpt-6-luna"] is ability {low: -0.54, medium: -0.15, high: 0.0, xhigh: 0.1, max: 0.35}, burn {low: 0.1, medium: 0.4, high: 0.7, xhigh: 1.0, max: 1.5}. Here xhigh ability is 0.2 and burn low/medium/xhigh are 0.28/0.46/0.85. v0.3.8 and v0.3.9 have the same values as v0.3.7. With upstream's numbers put back, every test still passes, so nothing guards this table.
| }, | ||
| "gpt-6-luna": { | ||
| tier: 3.2, | ||
| tier: 3.1, |
There was a problem hiding this comment.
Upstream's models["gpt-6-luna"].tier is 2.61 in v0.3.7 to v0.3.9, so 3.1 isn't a sync. The plugin keeps its own tier scale elsewhere too, so either cite where 3.1 comes from or leave the tier out of this PR.
| export function effortValue(policy, curves, name, effort, fallback) { | ||
| const own = curves?.[name] || {}; | ||
| if (effort in own) return own[effort]; | ||
| if (effort === "ultra" && "max" in own) return own.max; |
There was a problem hiding this comment.
AgentCompass's effort_value (allocator.py:593 at v0.3.7 and 54bb51e) is own[effort] if effort in own else policy[f'effort_{name}'].get(effort, default). It has no ultra->max step and no none/off/minimal clamp. Upstream scores Astra/Sol ultra at tier + 0, and this scores them at their Max. It may well be a good plugin-side fix (before this PR, :minimal read as High), but it isn't parity, and removing lines 80-94 leaves all 34 tests green. Please put it in its own PR, say there that it differs from upstream, and add a test for :minimal and :ultra.
| effort_ability: { | ||
| low: -0.7, | ||
| medium: -0.3, | ||
| none: -1.1, |
There was a problem hiding this comment.
none/off/minimal/ultra aren't in upstream's scoring.effort_ability (low..max only). Same point as the effortValue comment: this belongs with that change, with a test.
| }; | ||
|
|
||
| export const EFFORT_ORDER = ["low", "medium", "high", "xhigh", "max", "ultra"]; | ||
| export const EFFORT_ORDER = ["none", "off", "minimal", "low", "medium", "high", "xhigh", "max", "ultra"]; |
There was a problem hiding this comment.
Upstream's EFFORT_ORDER is ('low', 'medium', 'high', 'xhigh', 'max', 'ultra'). Adding none/off/minimal changes candidate parsing (model:minimal now becomes an effort, see allocator.js:803) and the continuity downgrade check. Neither is tested.
| const slashIdx = clean.indexOf("/"); | ||
| const unprefixed = slashIdx >= 0 ? clean.slice(slashIdx + 1) : clean; | ||
| if (aliases[unprefixed]) return aliases[unprefixed]; | ||
| let unprefixed = clean; |
There was a problem hiding this comment.
This isn't mentioned in the PR and isn't related to the curves. It changes what an unknown multi-prefix id canonicalizes to (openrouter/qwen/foo -> foo, was qwen/foo), which quota.js and continuity.js match on. Restoring the old code leaves 34 of 34 passing. Please put it in its own PR with a test.
| /** | ||
| * Extra ability critical work needs above the difficulty's floor (`allocator.py:critical_headroom`). | ||
| */ | ||
| export function criticalHeadroom(policy = DEFAULT_SCORING_POLICY, difficulty = "hard") { |
There was a problem hiding this comment.
With this returning critical_headroom alone, and with abilityFloor ignoring the route's floor, every test still passes. 8.6 only deepEquals the policy objects. Please add behaviour tests: a critical frontier task admits Astra Max (4.3) and turns away Astra High (4.2), and tool_execution/hard uses the 2.7 floor.
…behaviour tests for the gates - gpt-6-luna's effort curve is AgentCompass's effort_curves["gpt-6-luna"] (v0.3.7, v0.3.8 and v0.3.9 agree): ability xhigh 0.1, burn low/medium/xhigh 0.1/0.4/1.0. The tier stays 3.2: the 3.1 had no upstream source, and the plugin keeps its own tier scale. - The none/off/minimal/ultra effort fallback (effortValue, the four effort_ability entries and the longer EFFORT_ORDER) and the canonicalModel loop leave this PR. Each comes back as its own PR with its own test. - 8.6 pins luna's curve. 8.7: a critical frontier task admits Astra Max (4.3) and turns away Astra High (4.2). 8.8: tool_execution/hard uses its route floor 2.7, and the same luna:medium (3.05) is turned away on general_implementation/hard (3.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for checking this against AgentCompass's source. Pushed 4de2839 on top of 69dc43a:
|
yetone
left a comment
There was a problem hiding this comment.
Re-reviewed at 4de2839. The values match, but some of the new behaviour has no test, so I'm requesting changes.
What matches v0.3.8. I checked every value against skills/agent-compass/references/accounts.json and scripts/allocator.py at v0.3.8, by script:
- all 13 curves;
ability_floor,ability_score_origin,critical_headroomandcritical_headroom_by_difficulty;effort_abilityandeffort_burn;- the
tool_executionroute floor{hard: 2.7}; EFFORT_ORDER.
The cited commits a8c707b, a2215b3 and ec37bac exist. The changes to profiler-core match 54bb51e: COMPUTER_USE_PHRASES, CODE_FILE_RE, "translation of", the debugging skip and origin = max(floor, ability_score_origin).
What was run (WSL Ubuntu 24.04, Bun 1.4.2, Node 22): bun test 36 pass, node --test 36 pass, bun scripts/check.mjs exit 0.
Hand breaks. Each change was broken by hand, one at a time.
These turn a test red:
- headroom ignoring the table;
- the floor ignoring the route;
- the origin without
max; - the translation skip off;
- the debug skip dropped;
- the routine/hard floors put back;
- the tool route floor removed;
- luna's old curve.
These leave all 36 green, so nothing guards them:
origin = floor(ability_score_originignored) in allocator.js. Please add a case whereability_score_originis above the floor and decides the result.- The
CODE_FILE_REguard ininferKindFromObjective(profiler-core.js:309) removed. Add a case with an action phrase and a code file, e.g. "Click the Save button handler in settings.tsx is broken", and assert it is notcomputer_use. - Bare "keyboard"/"mouse" put back in the phrase list. Add "Add keyboard shortcuts to the settings dialog" and assert it is not
computer_use(main sayscomputer_usetoday, the PR saysgeneral_implementation; pin it). - "translation of" changed back to "translation" (:400). Add "Add a translation layer between the API and the DB".
namesCodedropped from the translation skip. Add a code file plus translate with no debug word, e.g. "Translate the error strings in i18n.ts".hasComputerUseinextractRequestFacts(:261), with the guard off or with the old GUI_WORDS put back. This feeds continuity.js:1108 (the guicapability_outgrown), so the change also moves continuity: main's broader words (" gui", "desktop app", "keyboard", "桌面", "键盘") used to trigger it. Please say so in the body, and test both the fact and the continuity outcome.- Only luna's curve is pinned. Put back opus's or astra's old curve, or
effort_ability's old values, and every test stays green. A table-driven test of all 13 curves andeffort_abilityagainst the v0.3.8 values would keep the next sync honest.
Extras that aren't in upstream. COMPUTER_USE_PHRASES has four entries that v0.3.8 doesn't have: "take a screenshot" and "capture a screenshot" (lines 95-96), and "截取屏幕" and "截屏操作" (104-105). Either drop them or name them in the body as plugin-side additions. As written, the body says this is a sync.
…ases v0.3.8 does not have - 8.9: `ability_score_origin` above the floor decides the pick (hard: Astra medium over Sonnet xhigh). - 8.10: the CODE_FILE_RE guard, bare keyboard/mouse, "translation of", the code-file translation skip, and `hasComputerUse` in extractRequestFacts. - 8.11: continuity: only a computer-use turn outgrows a model without GUI; the broader GUI words no longer move the session. - 8.12: all 13 effort curves and `effort_ability` / `effort_burn` pinned to v0.3.8. - COMPUTER_USE_PHRASES is now exactly v0.3.8's list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the re-review. Pushed 4ff38ce. The four phrases: I dropped "take a screenshot", "capture a screenshot", "截取屏幕" and "截屏操作". New tests, one per hand break:
Hand breaks I ran myself (
|
…allback Conflicts resolved: version stays 0.1.3; effort_ability keeps none/off/minimal (-1.1/-1.1/-1.0) on top of magpie-community#749's low..max (low -0.54, medium -0.2); the test import line takes the union. 8.12 now compares effort_ability's low..max with AgentCompass v0.3.8 and pins none/off/minimal as the plugin's own rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What
packages/agentcompass0.1.2 syncs Mode A's scoring with AgentCompass (akiiwa-games/AgentCompass)skills/agent-compass/references/accounts.jsonandscripts/allocator.py. v0.3.7 (97b9379), v0.3.8 and v0.3.9 (e5c5e65) agree on every value below. This is the split-out half of #742: it changes Mode A, the default mode, for every user.Changes
ability_score_origin(new): routine 3.0, hard 3.3, coupled 3.6, frontier 4.2. The ability score is graded frommax(floor, origin)(AgentCompass 54bb51e).critical_headroom_by_difficulty(new):{frontier: 0.1}, so a critical frontier task needs 4.3.ability_floor: {hard: 2.7}.effort_curves.scoring.effort_abilityis upstream's low..max table. Model tiers are unchanged: the plugin keeps its own tier scale.computer_useneeds an action phrase.COMPUTER_USE_PHRASESis exactly v0.3.8's list, and a named code file (CODE_FILE_RE) rules it out.extractRequestFacts().hasComputerUsenow uses the same phrases and code-file guard, in place of main's broader GUI words. That fact drives the GUIcapability_outgrowncheck in continuity.js. On main, a new turn mentioning " gui", "desktop app", "keyboard", "mouse", "桌面" or "键盘" moved a warm session off a model without GUI. Now only a computer-use instruction ("click the …", "use the mouse", "操作桌面" …) does, and a click instruction about a code file doesn't.The plugin-side source commits are a8c707b and a2215b3 in akiiwa-games/magpie-agentcompass-router, the plugin's own repo, with this PR's review fixes in ec37bac and 6ce6b6b. Files:
src/allocator.js,src/catalog.js,src/profiler-core.js;package.jsononly bumps the version.Two changes that were here first now have their own PRs, each with a test: the effort fallback (
:minimal/:ultra, 0.1.3, #750) and multi-prefixcanonicalModel(0.1.4, #751). Neither is in AgentCompass.Tests
8.6: checks the floors, the origin, the frontier headroom and luna's curve, plus the computer-use and translation prompts. It also checks that a model exactly at a raised floor (3.6, above origin 3.3) gets 0 ability score.
8.7: a critical frontier task admits Astra Max (4.3) and turns away Astra High (4.2).
8.8: tool_execution/hard uses its route floor 2.7. gpt-6-luna:medium (3.05) is admitted there and turned away on general_implementation/hard (3.1).
8.9: origin above the floor decides the pick. On a critical hard task, origin 3.3 picks Astra medium; with
origin = floorSonnet xhigh would win.8.10: the code-file guard, bare keyboard/mouse, "translation of", the code-file translation skip, and
hasComputerUse.8.11: continuity on a warm grok-4.7 session. A click instruction gives
capability_outgrown/gui_capability_required. "keyboard … desktop app", "gui … desktop app", "桌面…键盘" and a click about settings.tsx hold the session.8.12: all 13 effort curves and
effort_ability/effort_burnequal v0.3.8, table-driven.Broken by hand, one at a time:
criticalHeadroomignoring the per-difficulty tableabilityFloorignoring the route floororigin = floornamesCodeout of the translation skiphasComputerUsewithout the guard, or with main's GUI wordseffort_ability, or oneeffort_burnvalue changedbun test40 pass,node --test40 pass,bun scripts/check.mjs agentcompassok.🤖 Generated with Claude Code