Repository navigation
Added a tool-neutral effort field and stopped deriving Codex reasoning effort from the tier - #46
Conversation
…g effort from the tier
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Symlinked skill files bypass effort transformation and can emit unsupported or forbidden effort metadata.
Review effort: Balanced
Findings: 1
Open (2)
What changed in this PR
Introduces tool-neutral effort: metadata, separating reasoning effort from model-tier selection.
Changes:
- Maps effort independently for Claude, Codex, and shared skills.
- Adds validation, adapter transformations, and comprehensive tests.
- Promotes versioned artifacts to 0.19.0 and documents the breaking change.
| File | Description |
|---|---|
packages/sync/skills/intelligence-update-context/references/skills.md |
Documents skill effort authoring. |
packages/sync/skills/intelligence-update-context/references/agents.md |
Documents agent effort selection. |
packages/sync/references/onboarding-migration.md |
Adds reverse-migration guidance. |
packages/sync/references/conventions.md |
Defines neutral effort mappings. |
packages/sync/references/adapters.md |
Documents adapter APIs and behavior. |
intelligence.yaml |
Updates schema and field guidance. |
intelligence.lock |
Aligns root lock to 0.19.0. |
examples/with-remote-skills/intelligence.yaml |
Updates example version pins. |
examples/platform-with-submodules/intelligence.yaml |
Updates example version pins. |
examples/platform-with-submodules/intelligence.lock |
Updates example lock. |
examples/go-api/intelligence.yaml |
Updates example version pins. |
examples/go-api/intelligence.lock |
Updates example lock. |
examples/go-api-with-pi-and-codex/intelligence.yaml |
Updates example version pins. |
examples/go-api-with-pi-and-codex/intelligence.lock |
Updates example lock. |
examples/go-api-with-opencode/intelligence.yaml |
Updates example version pins. |
examples/go-api-with-opencode/intelligence.lock |
Updates example lock. |
examples/go-api-with-antigravity/intelligence.yaml |
Updates example version pins. |
examples/go-api-with-antigravity/intelligence.lock |
Updates example lock. |
examples/dotnet-api-with-react-frontend/intelligence.yaml |
Updates example version pins. |
examples/dotnet-api-with-react-frontend/intelligence.lock |
Updates example lock. |
examples/cli-project/intelligence.yaml |
Updates example version pins. |
engine/VERSION |
Promotes the engine to 0.19.0. |
engine/lib/common.sh |
Adds effort mapping, linting, and skill rewriting. |
engine/adapters/cursor.sh |
Removes unsupported effort metadata. |
engine/adapters/copilot.sh |
Removes effort from copied skills. |
engine/adapters/codex.sh |
Emits explicit Codex reasoning effort. |
engine/adapters/claude.sh |
Emits mapped Claude effort. |
engine/adapters/_template.sh |
Exposes the effort helper. |
decisions/0015-separate-reasoning-effort-from-the-model-tier.md |
Records the new architecture. |
decisions/0013-add-a-frontier-model-tier.md |
Marks earlier behavior superseded. |
cli/tests/unit-engine.sh |
Tests mappings, linting, and skill copies. |
cli/tests/e2e-lifecycle.sh |
Tests effort across built-in adapters. |
cli/commands/init.sh |
Adds effort guidance to manifests. |
CHANGELOG.md |
Records 0.19.0 and migration requirements. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Verification - PASShead: b80ab70 - steps: PR body "## Verification" steps 1-6 (no qa_checks matched; docs/qa-checks.md absent) - env: local (empty
No Negative probes beyond the declared steps: an off-scale value differing only by case ( FailuresNone. |
Code review - PASS-WITH-WARNINGShead: b80ab70 - base: main - files 34, +533/-98 Critical(none) Warning
Suggestion(none) |
… the engine rule and effort in the symlinked-skill warning
Verification - PASShead: 6a5028e - steps: PR body "## Verification" steps 1-6 (no qa_checks matched; docs/qa-checks.md absent) - env: local (empty
No Negative probes beyond the declared steps: an off-scale value differing only by case ( The one commit since the prior verified head ( FailuresNone. |
Code review - CLEANhead: 6a5028e - base: main - files 35, +546/-110 Critical(none) Warning(none) Suggestion(none) |
Outcome - MANUALhead: 6a5028e
|
…d init show, and left the symlink warnings as on main
Verification - PASShead: bd3b6cb - steps: PR body "## Verification" steps 1-6 (no qa_checks matched; docs/qa-checks.md absent) - env: local (empty
No Negative probes beyond the declared steps, targeted at this head's own delta over the last-verified SHA ( FailuresNone. |
Code review - CLEANhead: bd3b6cb - base: main - files 35, +562/-108 Critical(none) Warning(none) Suggestion
|
Verification - PASShead: fd34d94 - steps: PR body "## Verification" steps 1-6 (no qa_checks matched; docs/qa-checks.md absent) - env: local (empty
No Negative probes beyond the declared steps: an off-scale value differing only by case ( This head is a merge of FailuresNone. |
Code review - CLEANhead: fd34d94 - base: main - files 19, +520/-68 Critical(none) Warning(none) Suggestion
|


Summary
tiermeant two things in one adapter. Every tool mapped it to a model, and Codex alone also derivedmodel_reasoning_effortfrom it (xhighforfrontier,highforheavyor no tier,medium,low). An author could not ask for a model and a reasoning effort independently, Claude Code's owneffort:on subagents and skills had no source spelling, and the same tier behaved differently per tool.Agents and skills now accept a tool-neutral
effort:—low,medium,high,xhigh,max,ultra— rendered into each tool's native setting the waytierandaccessare, andtierselects the model only (decision 0015):effort:.agents/skills/low…maxeffort: <level>model_reasoning_effort = "<level>"ultraeffort: max(nearest lower level)model_reasoning_effort = "ultra"hiigh,High)WARNING:line naming the sourceAn unknown value warns and is ignored instead of failing sync, because packages arrive from other authors and one typo must not block every team that installed it. Copilot's and Cursor's own skill copies never carry the key. Per-model level availability is left to the tools (Claude Code falls back to the highest supported level at or below the one set).
Behavior change: a Codex agent without
effort:no longer getsmodel_reasoning_effort, so Codex's own setting applies andfrontierandheavynow render identical Codex agents, as they already did in Copilot. The CHANGELOG carries a### Breakingcheck for projects that relied on the derived effort. Decision 0013 is marked superseded in part.Shape: one mapping,
map_effort_varinengine/lib/common.sh, is the only source; the Claude and Codex agent loops readeffortthrough the existingfrontmatter_indexpass, the skill-copy pass rewriteseffort:in place from a table built from that same function (copy_skill_bundle_dirs_for <tool>), and the frontmatter lint the engine already runs once over every source emits the warning. No new process per file; Cursor's agent transform strips the key. The package's own agents are unchanged.Type of change
Public CLI check
initwriteseffort:into its manifest comment)intelligence sync(unchanged)Verification
Starting state for every step: an empty directory initialized with
git init, outside any checkout of this repository; the CLI is this PR's head, run asbash <head>/cli/intelligencefrom a tree extracted from the head commit (for examplegit archive <head-sha> | tar -x -C <dir>); in the empty repository runinit --targets claude,codex,copilot,opencode. Agents go inintelligence/agents/<name>.mdwithname,descriptionand the frontmatter the step names; skills go inintelligence/skills/<name>/SKILL.md. Runsyncafter each step's change.tier: frontier,tier: heavyand notier, none witheffort:; runsync. Expected: no.codex/agents/*.tomlcontainsmodel_reasoning_effort, including the package'sintelligence-architectandintelligence-operator; models are unchanged (frontierrendersgpt-6-astrain Codex andfablein Claude); no.claude/agents/*.mdcontainseffort:.tier: lightandeffort: xhigh; runsync. Expected: its.claude/agents/<name>.mdhaseffort: xhighandmodel: sonnet; its.codex/agents/<name>.tomlhasmodel_reasoning_effort = "xhigh"andmodel = "gpt-6-luna"; its Copilot and OpenCode agent files contain no effort key; sync exits 0 with noWARNline.effort: ultra; runsync. Expected: its Claude file haseffort: max; its Codex file hasmodel_reasoning_effort = "ultra".effort: hiigh; runsync. Expected: exit 0; the output contains aWARNline naming the agent's source file andhiigh; neither its Claude nor its Codex file carries an effort.effort: ultraand a skill witheffort: hiigh; runsync. Expected: forultra,.claude/skills/<s>/SKILL.mdhaseffort: maxand.agents/skills/<s>/SKILL.mdhaseffort: ultra; forhiigh, neither tree'sSKILL.mdcontainseffort:, and the output contains aWARNline naming the skill's source file andhiigh.effort:(no value), and another agent and skill witheffort: ""; runsync. Expected: exit 0; noWARNline for them; no generated file for them containseffort:ormodel_reasoning_effort.Automated coverage
bash cli/tests/verify.shprintedverify okon this head (run through WSL on Windows,allscope: both lint gates and all 18 suites).e2e-lifecycle, "every built-in adapter renders every model tier": tier-only agents (each tier and none) carry nomodel_reasoning_effortin Codex and noeffort:in Claude, and thefrontierandheavyCodex agents are identical apart from name and description. It previously pinned the tier-derived ladder, so it fails on the old engine.e2e-lifecycle, "effort is written once and rendered where a tool has a field", across all seven built-in targets: explicit,ultra→max, quoted, duplicated (first wins) and CRLF agents in Claude and Codex; effort leaves the model alone; off-scale (hiigh,High) and empty values carry no key anywhere; Copilot, OpenCode, Antigravity and Cursor agents and Copilot and Cursor skill copies never carry one; a body line startingeffort:survives; skills in.claude/skillsand.agents/skills; exactly oneWARNING:line per off-scale source and none for empty values, and that line again undersync --compact, on a full render and on the unchanged run that replays it. Against the previous engine, 49 of the block's assertions failed when measured before the--compactchecks were added; those four checks need a warning the previous engine never prints.unit-engine: an independent expected matrix ofmap_effort_varfor every tool and level, off-scale and empty inputs, the table the awk pass receives,lint_frontmatter_files(warns once, first occurrence only, never for empty, CRLF-safe, frontmatter only), andcopy_skill_bundle_dirs_forper tool, including that bundled references and bodies are untouched.Versioned artifacts
v0.18.1is published andmainalready carries the pending0.19.0(Made status --check decide .gitignore presence with the writer's CR-blind test #55); a feature and a breaking change fit that minor, so this PR adds its lines to the existing## [0.19.0]and leaves## [0.18.1]unchangedengine/VERSION, every example'sschema_versionand exact@ainova-systems/syncpin, their locks, and this repository's manifest and lock are already0.19.0onmain; this PR moves none of them[Unreleased]section and no release dateNotes for reviewers
main.WARNING:line, the form decision 0016 uses, sosync --compactandinitshow it and a cached sync replays it; the frontmatter lint's other notes (leading tab, unquoted colon, quotes, length) keep their indentedWARN:form.main.tierrenders an empty model), Owner-only skills can stay selectable in Codex when the author ships agents/openai.yaml or symlinks SKILL.md #41, Copilot'smodel:format, Cursor's bracket effort parameters.