Skip to content

Rewrite the skills SDK docs for the 0.7 interface - #25

Open
karmanyaahm wants to merge 3 commits into
mainfrom
docs/skills-0.7-interface
Open

Rewrite the skills SDK docs for the 0.7 interface#25
karmanyaahm wants to merge 3 commits into
mainfrom
docs/skills-0.7-interface

Conversation

@karmanyaahm

@karmanyaahm karmanyaahm commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

The skills docs still describe the 0.6.x API. 0.7 replaced essentially all of it, so a reader following these pages today writes a skill against an interface that no longer exists.

What was wrong

The docs said 0.7
mobility = Interface(InterfaceType.MOBILITY) mobility: Mobility
image = RobotState(RobotStateType.LAST_MAIN_CAMERA_IMAGE_B64) image: MainImage
a name property and a guidelines() method the class name and the class docstring
return "msg", SkillResult.SUCCESS return "msg" / self.fail(...)
self._cancelled flags and a cancel() on every skill the framework latches, brakes and reports
odom.pose.pose.position.x odom.x
move_to_cartesian_pose() returning a bool move_to() blocking and raising
composition via innate.skills declared sub-skills — innate.skills no longer exists

The composing-skills page was the worst of it: it documented an import path that was removed and walked through run_routine_demo.py, a shipped skill that no longer ships.

The rewrite

Overview — one rule: annotate what you consume. The class name is the skill name, the class docstring is the agent-facing guidelines, the execute() signature is the parameter schema. A plain annotation is guaranteed inside execute() (the run fails up front if the feed never arrives, with the real per-feed grace — 3 s cameras, 6 s battery, 2 s the rest), and | None makes it best effort. Cancellation is stated as the framework's job, carrying the never-time.sleep rule across from the OS repo.

Robot state — typed values replace the enums, with an odom-vs-pose frame table, because picking the wrong one is the classic bug: odom drifts but never jumps, pose corrects and therefore can.

Body control — the 0.7 arm SDK. Blocking and raising (ArmFailed / ArmUnhealthy), move_to FK-verification with reboot-and-retry, move_by from the measured pose, Waypoint/follow(), block=False + wait(), and the standing grip target — why nothing threads gripper= through a trajectory any more.

Composing skills — rebuilt on declared sub-skills and PhysicalSkill / physical_skills typed refs, the shared cancel latch, and self.skills.run() for dynamic ids. Pre-release warning dropped; the feature shipped.

Introduction — skill packages and <folder>/<name> namespacing, symlinked packs replacing extra_skill_dirs and the ~/skills lane, defining-the-class-is-the-registration, and broken skills staying visible with their load error instead of vanishing.

Plus navigation interfaces, the full-body examples, external services, the policy-defined pages, and the shared interface tables.

Also in here

Two commits on top of the rewrite:

  • docs: lead the MARS quickstart with the victory_spin skill — the quickstart's "run custom code" step pointed at the Gmail/IMAP skill, which needs an app password before it does anything. It now leads with a victory_spin you can paste, save and watch move, and links the email skill as the follow-on for reaching off the robot.
  • Use real robot naming in SSH examples — the SSH and development-setup pages showed a bare goodbot password and a placeholder hostname. Robots ship as MARS the <N>th, so the real pattern is mars-the-<N>th.local with goodbot<N>.

Scope

Agent pages get mechanical import and type-hint updates onlyfrom innate import Agent, SkillRef, list[SkillRef] — since get_skills() now prefers the class over an id string. The old brain_client.agent_types path still works via its compat shim, so nothing there was broken; a full agents-docs pass is a separate job.

Two renames, both reversible

  • physical-skill-examples.mdx is retitled "Full-Body Examples". The old title now collides with PhysicalSkill, which in 0.7 specifically means a trained policy. Path unchanged, so no redirect needed.
  • composing-skills.mdx loses "(pre-release)".

docs.json is untouched — same page set, same paths.

Verification

Every API claim checked against innate-os at 0.7.0-rc3: innate/__init__.py, skills/types.py (_feed_specs is the feed table), robot/manipulation.py, robot/mobility.py, robot/head.py, state/*.py, and the shipped skills in workspace/innate_skills/. mint broken-links passes clean.

Before merging

0.7.0 is still at rc3. Merging publishes docs for an API that hasn't tagged yet — worth holding until the release.

Two carried-over tables I did not audit against source: HeadTiltAnglesTable and NavigationUseCasesTable. Both are 0.6-era behavioral claims, low risk, but they're the remaining unverified content.

The skills docs still described the 0.6.x API: `Interface(InterfaceType.X)` /
`RobotState(RobotStateType.Y)` descriptors, a `name` property, `guidelines()`,
`(message, SkillResult)` tuples, `_cancelled` flags, and a `cancel()` method on
every skill. 0.7 replaced all of that.

Core rewrite (software/skills/code-defined-skills.mdx): one rule — annotate what
you consume. The class name is the skill name, the class docstring is the
agent-facing guidelines, the execute() signature is the parameter schema. A plain
annotation is guaranteed inside execute() (the run fails up front if the feed
never arrives, with the real per-feed grace: 3s cameras, 6s battery, 2s the
rest); `| None` makes it best effort. Return the message or call self.fail();
the tuple form is documented as deprecated-but-working. Cancellation is stated
as the framework's job, including the never-`time.sleep` rule.

robot-state.mdx: typed values replace the RobotStateType enums — odom.x rather
than odom.pose.pose.position.x, an Image that IS the base64 string with .jpeg
for bytes, Map.grid, Lidar.min_range(), the .raw escape hatch, and an
odom-vs-pose frame table.

body-control-interfaces.mdx: the 0.7 arm SDK. Blocking and raising
(ArmFailed / ArmUnhealthy) instead of bools, move_to FK-verification with
reboot-and-retry, move_by from the measured pose, Waypoint/follow(), block=False
+ wait() + moving, and the standing grip target — why nothing threads gripper=
through a trajectory any more.

composing-skills.mdx: the page documented `innate.skills`, which no longer
exists, and cited a shipped skill that no longer ships. Rewritten around
declared sub-skills and PhysicalSkill / physical_skills typed refs, the shared
cancel latch, and self.skills.run() for dynamic ids. Drops the pre-release
warning.

skills.mdx: skill packages and <folder>/<name> namespacing, symlinked packs
replacing extra_skill_dirs and the ~/skills lane, defining-the-class-is-the-
registration, and broken skills staying visible with their load error.

Also: navigation-interfaces (typed declaration, the deadman `duration` on
send_cmd_vel, which calls are cancel points), physical-skill-examples (all
examples rebuilt; retitled "Full-Body Examples" since "physical skill" now
specifically means a trained policy), external-services (self.fail() over error
tuples, credentials read per run rather than in __init__), policy-defined-skills
and deploy-trained-skill (typed policy refs), and the shared interface tables.

Agent pages get mechanical import and type-hint updates only — `from innate
import Agent, SkillRef`, list[SkillRef] — since get_skills() now prefers the
class over an id string. The old brain_client.agent_types path still works via
its compat shim, so nothing there was broken.

Verified against innate-os on 0.7.0-rc3: innate/__init__.py, skills/types.py
(_feed_specs is the feed table), robot/manipulation.py, robot/mobility.py,
robot/head.py, state/*.py, and the shipped skills. `mint broken-links` clean.
@mintlify

mintlify Bot commented Aug 8, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
innateinc 🟢 Ready View Preview Aug 8, 2026, 1:40 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

karmanyaahm and others added 2 commits August 7, 2026 18:44
Show the mars-the-<N>th hostname pattern and the matching
goodbot<N> password, with MARS the 21st/27th as examples,
on the SSH page and in Development Setup.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Mirror the simulator tutorial's order — skill first, then the agent that
uses it — and merge Hello World and Cheerful into one CheerfulGreeter
agent. Replaces the Gmail walkthrough with a pointer to the
RetrieveEmails worked example.
theo-michel added a commit that referenced this pull request Aug 8, 2026
…al robot naming

The quickstart's first build step pointed at the Gmail/IMAP skill, which needs
an app password before it does anything. It now opens with a victory_spin you
can paste, save and watch, then hands that skill to the agent — so the first
five minutes end in the robot moving.

SSH examples showed a bare `goodbot` password and a placeholder hostname.
Robots ship as MARS the <N>th, so the real pattern is mars-the-<N>th.local
with goodbot<N>.

Both carried over from #25.

Co-authored-by: Karmanyaah Malhotra <karmanyaahm@users.noreply.github.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.

1 participant