Skip to content

agentcompass 0.1.2: sync AgentCompass v0.3.8 scoring (floors, origin, frontier headroom, curves, work-kind inference) - #749

Merged
yetone merged 3 commits into
magpie-community:mainfrom
akiiwa-games:agentcompass-0.1.2
Nov 5, 2026
Merged

yetone merged 3 commits into
magpie-community:mainfrom
akiiwa-games:agentcompass-0.1.2

Conversation

@akiiwa-games

@akiiwa-games akiiwa-games commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

What

packages/agentcompass 0.1.2 syncs Mode A's scoring with AgentCompass (akiiwa-games/AgentCompass) skills/agent-compass/references/accounts.json and scripts/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 floors: routine 3.0 → 2.3, hard 3.3 → 3.1; coupled 3.6 and frontier 4.2 unchanged.
  • ability_score_origin (new): routine 3.0, hard 3.3, coupled 3.6, frontier 4.2. The ability score is graded from max(floor, origin) (AgentCompass 54bb51e).
  • critical_headroom_by_difficulty (new): {frontier: 0.1}, so a critical frontier task needs 4.3.
  • tool_execution route: ability_floor: {hard: 2.7}.
  • Effort curves: opus, sonnet, haiku, astra, sol, terra, luna, grok-4.7, flash, argon, carbon, fable and deepseek-v4.1-flash-free, as effort_curves. scoring.effort_ability is upstream's low..max table. Model tiers are unchanged: the plugin keeps its own tier scale.
  • Work-kind inference (AgentCompass 54bb51e, first shipped in v0.3.8):
    • computer_use needs an action phrase. COMPUTER_USE_PHRASES is exactly v0.3.8's list, and a named code file (CODE_FILE_RE) rules it out.
    • Text translation needs "translation of".
    • A code file or a debugging word keeps the work out of text translation.
  • Session continuity moves too. extractRequestFacts().hasComputerUse now uses the same phrases and code-file guard, in place of main's broader GUI words. That fact drives the GUI capability_outgrown check 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.json only 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-prefix canonicalModel (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 = floor Sonnet 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_burn equal v0.3.8, table-driven.

  • Broken by hand, one at a time:

    Break Red
    criticalHeadroom ignoring the per-difficulty table 8.7
    abilityFloor ignoring the route floor 8.8
    origin = floor 8.9
    the code-file guard off 8.10
    bare keyboard/mouse back 8.10, 8.11
    "translation" for "translation of" 8.10
    namesCode out of the translation skip 8.10
    hasComputerUse without the guard, or with main's GUI words 8.10, 8.11
    luna's, opus's or astra's old curve, old effort_ability, or one effort_burn value changed 8.12 (luna also 8.6)
  • bun test 40 pass, node --test 40 pass, bun scripts/check.mjs agentcompass ok.

🤖 Generated with Claude Code

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 yetone left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

  1. gpt-6-luna's curve differs from v0.3.7.
  2. gpt-6-luna's tier 3.2 -> 3.1: upstream's tier is 2.61, so this value has no upstream source.
  3. The none/off/minimal/ultra handling in effortValue, the four new effort_ability entries and the longer EFFORT_ORDER are not in AgentCompass. Its effort_value only reads the model's curve, then the policy table, then the default, and its EFFORT_ORDER is low..ultra.
  4. The canonicalModel loop is unrelated to this PR and isn't mentioned in it.
  5. 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 criticalHeadroom ignore critical_headroom_by_difficulty, and abilityFloor ignore 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.

Comment thread packages/agentcompass/src/catalog.js Outdated
},
"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 },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

Comment thread packages/agentcompass/src/catalog.js Outdated
},
"gpt-6-luna": {
tier: 3.2,
tier: 3.1,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

Comment thread packages/agentcompass/src/allocator.js Outdated
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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

Comment thread packages/agentcompass/src/catalog.js Outdated
effort_ability: {
low: -0.7,
medium: -0.3,
none: -1.1,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

Comment thread packages/agentcompass/src/catalog.js Outdated
};

export const EFFORT_ORDER = ["low", "medium", "high", "xhigh", "max", "ultra"];
export const EFFORT_ORDER = ["none", "off", "minimal", "low", "medium", "high", "xhigh", "max", "ultra"];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

Comment thread packages/agentcompass/src/catalog.js Outdated
const slashIdx = clean.indexOf("/");
const unprefixed = slashIdx >= 0 ? clean.slice(slashIdx + 1) : clean;
if (aliases[unprefixed]) return aliases[unprefixed];
let unprefixed = clean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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") {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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>
@akiiwa-games akiiwa-games changed the title agentcompass 0.1.2: sync AgentCompass v0.3.7 capability curves agentcompass 0.1.2: sync AgentCompass v0.3.8 scoring (floors, origin, frontier headroom, curves, work-kind inference) Nov 5, 2026
@akiiwa-games

Copy link
Copy Markdown
Contributor Author

Thanks for checking this against AgentCompass's source. Pushed 4de2839 on top of 69dc43a:

  • gpt-6-luna: the curve is now v0.3.7–v0.3.9's effort_curves["gpt-6-luna"]: ability {low:-0.54, medium:-0.15, high:0, xhigh:0.1, max:0.35}, burn {low:0.1, medium:0.4, high:0.7, xhigh:1.0, max:1.5}. 8.6 now pins it. The tier change is gone, and luna stays at 3.2 as on main.
  • Taken out of this PR: the none/off/minimal/ultra handling in effortValue, the four effort_ability entries, the longer EFFORT_ORDER, and the canonicalModel loop. effort_ability is now upstream's low..max values only; effortValue, EFFORT_ORDER and canonicalModel are main's code again. Each comes back as its own PR with a test, and says where it differs from upstream: 0.1.3 (effort fallback) and 0.1.4 (canonicalModel, which now keeps openrouter/qwen/foo → qwen/foo).
  • Behaviour tests:
    • 8.7: a critical frontier task admits Astra Max (4.3) and turns away Astra High (4.2), with "ability 4.20 below the frontier floor 4.30".
    • 8.8: on tool_execution/hard, gpt-6-luna:medium (3.05) clears the route floor 2.7, while the same candidate on general_implementation/hard is turned away at 3.10.
    • Breaking criticalHeadroom to return critical_headroom alone turns 8.7 red. Making abilityFloor ignore the route floor turns 8.8 red. Putting luna's old curve back turns 8.6 red.
  • Title and citations fixed. a8c707b, 8e5d2b5 and a2215b3 are commits in akiiwa-games/magpie-agentcompass-router, the plugin's own repo, not AgentCompass. The computer-use, translation and origin changes are AgentCompass 54bb51e, first shipped in v0.3.8.

bun test 36 pass, node --test 36 pass, bun scripts/check.mjs agentcompass ok.

@yetone yetone left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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_headroom and critical_headroom_by_difficulty;
  • effort_ability and effort_burn;
  • the tool_execution route 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:

  1. origin = floor (ability_score_origin ignored) in allocator.js. Please add a case where ability_score_origin is above the floor and decides the result.
  2. The CODE_FILE_RE guard in inferKindFromObjective (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 not computer_use.
  3. 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 says computer_use today, the PR says general_implementation; pin it).
  4. "translation of" changed back to "translation" (:400). Add "Add a translation layer between the API and the DB".
  5. namesCode dropped from the translation skip. Add a code file plus translate with no debug word, e.g. "Translate the error strings in i18n.ts".
  6. hasComputerUse in extractRequestFacts (:261), with the guard off or with the old GUI_WORDS put back. This feeds continuity.js:1108 (the gui capability_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.
  7. 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 and effort_ability against 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>
@akiiwa-games

Copy link
Copy Markdown
Contributor Author

Thanks for the re-review. Pushed 4ff38ce.

The four phrases: I dropped "take a screenshot", "capture a screenshot", "截取屏幕" and "截屏操作". COMPUTER_USE_PHRASES is now exactly v0.3.8's list, so this stays a pure sync.

New tests, one per hand break:

  • 8.9, origin: a critical hard task (error_cost 3) with Sonnet xhigh against Astra medium. Origin 3.3 picks Astra medium. With origin = floor (3.1), Sonnet xhigh's ability score saturates and it wins.
  • 8.10, kind and fact guards:
    • "Click the Save button handler in settings.tsx is broken" → general_implementation;
    • "Add keyboard shortcuts to the settings dialog" → general_implementation, pinned;
    • "Add a translation layer between the API and the DB" → general_implementation;
    • "Translate the error strings in i18n.ts" → general_implementation;
    • controls: "Write a translation of the README…" and "Translate the release notes…" → text_in_text_out;
    • the four removed phrases alone are not computer_use;
    • extractRequestFacts().hasComputerUse is true for a real click instruction, and false for the code-file case and for "keyboard … desktop app", "gui … desktop app" and "桌面…键盘".
  • 8.11, continuity: a warm session on grok-4.7 (gui < 0.5).
    • A click instruction still gives capability_outgrown / gui_capability_required and moves off grok.
    • "Add keyboard shortcuts to the desktop app", "Open the gui and check the desktop app", "修改桌面版的键盘快捷键" and the settings.tsx click now hold grok. On main, the broader GUI words moved them. The body now says so.
  • 8.12: a table-driven check that all 13 effort_curves and effort_ability / effort_burn equal v0.3.8.

Hand breaks I ran myself (bun test, one at a time, restored from git after each):

Break Red
origin = floor 8.9
CODE_FILE_RE guard off in inferKindFromObjective 8.10
bare keyboard/mouse back 8.10, 8.11
"translation" for "translation of" 8.10
namesCode out of the translation skip 8.10
hasComputerUse guard off / old GUI_WORDS 8.10, 8.11
opus's / astra's old curve, old effort_ability, one effort_burn value 8.12
either removed phrase put back 8.10

bun test 40 pass, node --test 40 pass, bun scripts/check.mjs agentcompass exit 0. Body updated.

@yetone
yetone merged commit bf959aa into magpie-community:main Nov 5, 2026
2 checks passed
akiiwa-games added a commit to akiiwa-games/plugins that referenced this pull request Nov 5, 2026
…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>
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.

2 participants