Skip to content

fix(harness): classify beyond-engine primitives before capability_absent - #1

Merged
masterleopold merged 1 commit into
mainfrom
fix/beyond-engine-precedence
Jul 17, 2026
Merged

masterleopold merged 1 commit into
mainfrom
fix/beyond-engine-precedence

Conversation

@masterleopold

@masterleopold masterleopold commented Jul 16, 2026 •

Copy link
Copy Markdown
Collaborator

Why

The test job on main fails 5 tests, all in the 4-way retarget gate: pour and stack-blocks (and the BEYOND fixture) are expected to classify as beyond_engine but come back as capability_rejected.

CI builds the rfl binding from the head of the public robotfoundationlayer/rfl repo (unpinned in .github/workflows/ci.yml). Upstream rfl now reports an unimplemented primitive as capability_absent: <primitive> when it is retargeted onto a descriptor that cannot declare it. In retarget_outcome, the capability_absent message check ran before the engine-coverage check, so a beyond-engine skill (place.put_down, place.stack) whose primitive is absent from the descriptor got tagged capability_rejected.

Per the documented gate order (CLAUDE.md gate #2), a valid emission the engine cannot lower is beyond_engine (a coverage gap, NOT a model error), and rfl / vendored descriptors are consumed-only. So the fix is entirely in cobel's classification logic.

What

Give the engine-coverage gate precedence over the embodiment-mismatch path:

except rfl.RetargetError as exc:
    msg = str(exc)
    # A skill using any primitive outside ENGINE_18 cannot be lowered by ANY
    # descriptor — coverage gap, not a real capability mismatch.
    if primitives_used(skill_yaml) - ENGINE_18:
        return Outcome("beyond_engine", msg)
    if "capability_absent" in msg:
        return Outcome("capability_rejected", msg)
    return Outcome("malformed", msg)

A skill built purely from ENGINE_18 still has an empty primitives_used - ENGINE_18, so genuine embodiment mismatches (seat-fuse, latch-buckle on a no-F/T arm) remain capability_rejected. sort-by-weight stays beyond_engine, and the malformed / retarget_ok paths are unaffected.

Verified by reproducing CI locally (rfl binding built from the public repo): full suite now 35 passed (was 5 failed, 30 passed).


View with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is enabled.

rfl now reports an unimplemented primitive as capability_absent for that
primitive, so beyond-engine skills (place.put_down, place.stack) retargeted
onto a descriptor that cannot declare them were misclassified as
capability_rejected. Give the engine-coverage gate precedence: a skill using
any primitive outside ENGINE_18 is beyond_engine (a coverage gap), and only
skills built purely from ENGINE_18 can be a genuine capability_rejected.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
@masterleopold
masterleopold merged commit 9681183 into main Jul 17, 2026
1 check passed
@masterleopold
masterleopold deleted the fix/beyond-engine-precedence branch July 17, 2026 20:56
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