Vercel Composition Patterns
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
Author vehicle controllers in LunCoSim so spacecraft, landers, rovers, and drones can move, fly, drive, land, or accept pilot control.
$ npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LunCoSim/lunco-sim authoring-vessel-controllers --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/authoring-vessel-controllers .claude/skills/authoring-vessel-controllers && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "authoring-vessel-controllers" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/authoring-vessel-controllers into .claude/skills/authoring-vessel-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "authoring-vessel-controllers", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/LunCoSim/lunco-sim/tree/main/skills/authoring-vessel-controllersType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LunCoSim/lunco-sim authoring-vessel-controllers --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/authoring-vessel-controllers .agents/skills/authoring-vessel-controllers && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "authoring-vessel-controllers" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/authoring-vessel-controllers into .agents/skills/authoring-vessel-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "authoring-vessel-controllers", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LunCoSim/lunco-sim authoring-vessel-controllers --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/authoring-vessel-controllers .cursor/skills/authoring-vessel-controllers && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "authoring-vessel-controllers" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/authoring-vessel-controllers into .cursor/skills/authoring-vessel-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "authoring-vessel-controllers", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/LunCoSim/lunco-sim.git --path skills/authoring-vessel-controllers--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LunCoSim/lunco-sim authoring-vessel-controllers --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/authoring-vessel-controllers .gemini/skills/authoring-vessel-controllers && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "authoring-vessel-controllers" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/authoring-vessel-controllers into .gemini/skills/authoring-vessel-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "authoring-vessel-controllers", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install LunCoSim/lunco-sim authoring-vessel-controllersInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/authoring-vessel-controllers .github/skills/authoring-vessel-controllers && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "authoring-vessel-controllers" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/authoring-vessel-controllers into .github/skills/authoring-vessel-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "authoring-vessel-controllers", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LunCoSim/lunco-sim authoring-vessel-controllers --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/authoring-vessel-controllers .opencode/skills/authoring-vessel-controllers && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "authoring-vessel-controllers" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/authoring-vessel-controllers into .opencode/skills/authoring-vessel-controllers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "authoring-vessel-controllers", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
authoring-vessel-controllersAuthor vehicle controllers in LunCoSim so spacecraft, landers, rovers, and drones can move, fly, drive, land, or accept pilot control.
Authoring Vessel Controllers is an agent skill from LunCoSim/lunco-sim. Author vehicle controllers in LunCoSim so spacecraft, landers, rovers, and drones can move, fly, drive, land, or accept pilot control. Use when adding or debugging autopilot, GNC, guidance, waypoint following, thruster response, manual takeover, a Modelica control model, a controller program prim, or the wired piloted authority signal. This skill assigns control math to Modelica, sequencing and events to Rhai, and structure, sensors, wiring, and authority to USD. It covers the unwired-input failure mode…
Its SKILL.md is about 5.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development. The repository describes itself as: Collaborative Multiphysics Cosimulator For Space Missions 🌎🚀🌚. The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 43f1301. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are usda, modelica and rhai).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Authoring Vessel Controllers loads about 5.8k tokens when it runs. Until then it costs about 178 tokens; SKILL.md has 2,862 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from LunCoSim/lunco-sim at commit 43f1301, republished under its Apache-2.0 licence (© LunCoSim). 2,862 words, ~5,781 tokens.
.claude/skills/authoring-vessel-controllers/SKILL.md (or your agent's skills folder).Read luncosim-architecture before
adding a sensor, actuator, generated network, or custom USD field. This skill
owns the vessel-controller recipe; the architecture skill owns the
standard-schema and no-compatibility gate.
A vessel that drives itself (a GNC, an autopilot) is built from three layers, each in the language that fits it. Never blur them.
| Layer | Language | Owns | Rule |
|---|---|---|---|
| Control LAW | Modelica (.mo) | the math: PID, schedules, mixing, τ=I·α | ALL control math lives here. Never compute a control law in rhai. |
| Logic / sequencing | rhai (.rhai) | phases, events, mission steps, reactions | EVENT-DRIVEN only. No per-tick control loops, no time-stepping. |
| Structure / wiring / authority | USD (.usda) | sensors, wires, possession, identity | Declarative. Sensors are referenced library prims; a wire is a native USD connection. |
The shipped lander is one reference implementation: assets/models/Lander.mo,
assets/scenarios/lander_subsystems.rhai, assets/vessels/landers/descent_lander.usda
(referenced by assets/scenes/luncosim/lander_ops.usda). For another vehicle,
select the closest production controller, vehicle asset, composing scene,
and test before authoring a new one. A tutorial model can clarify the idea while
still being too simplified to serve as the production contract.
Before writing a new controller:
assets/models/, assets/vessels/, assets/components/,
assets/scenes/, and assets/scenarios/ for an existing controller and its
consumer..mo only when the existing equation or public interface is
genuinely insufficient; do not fork a working controller for naming alone.This is a discovery rule, not a requirement to reuse one particular vehicle.
For a new controller assembly, use the generic Rhai authoring checkpoint before
debugging the equations: model_context reads the exact program/body tree,
readiness_report checks the caller's topology, physicality, mount, connection,
control, and runtime policy, and port_graph/wiring_plan validates the
standard USD endpoint paths and types. Keep the controller's continuous law in
Modelica and the phase/mission policy in Rhai; these facades only inspect and
return dry typed USD plans. See the model-authoring guide.
When propellant changes a hull's mass properties, connect the Modelica mass,
body-local COM, and diagonal inertia outputs to the physical Avian inputs:mass,
inputs:com_x/y/z, and inputs:inertia_xx/yy/zz through the document API.
Controller inputs such as controller_inertia_xx/yy/zz consume separate wires;
those inputs do not update the physical body. The live physical endpoint retains
native f64 solver values through collider recomputation. Scalar inertia updates
require an axis-aligned tensor and reject nonzero cross terms before commit;
they cannot represent a coupled tensor update. Keep articulated appendages as
their own bodies: the joint-island mass outputs are complete translational mass,
not an assumed rigid assembly inertia. Verify live burn mass, COM, and inertia
against QueryPhysicsState in the owning authored Rhai scene test. See the
lander mass-property contract.
The model reads what the vessel senses and outputs force/torque. It is a PROGRAM,
and a program is a prim: the vessel's own flight-control system is inseparable from the
airframe, so the vessel prim applies LunCoProgramAPI and names the model in place —
uniform asset info:sourceAsset = @models/MyController.mo@. Its inputs: ARE
the vessel's control surface. A control law that is bolted on (a guidance component, a
supervisory script) is a a Scope applying LunCoProgramAPI CHILD prim instead, so deleting the prim
removes the behaviour. Ports are wired with native USD connections (§3).
Because it drives a force on a body the client predicts, it must promise it steps fast
enough for that: uniform bool lunco:program:realtimeSafe = true. Without the promise
the wiring pass refuses it a force_*/torque_* port and says why.
model MyController
input Real altitude, descent_rate; // SENSED (wired from sensors, see §3)
input Real piloted = 0.0; // authority gate (wired, see §4)
input Real external_throttle = 0.0; // the pilot's stick (when piloted)
output Real force_y, throttle;
Real gnc_throttle, cmd;
equation
gnc_throttle = <your control law>; // math, DIRECT (no lag)
cmd = piloted*external_throttle + (1.0-piloted)*gnc_throttle; // yield-to-pilot gate
force_y = cmd * max_thrust;
end MyController;Gotchas that will waste hours if you don't know them:
input Real x
used only in algebraic equations, never wired and never written, is constant-folded
→ runtime writes to it never reach the solver. To keep an input LIVE, either wire
it (see §3/§4) or route it through a der (der(x_live)=(x-x_live)/0.02; use x_live).
Symptom: set() returns true but has no effect.der are always live (a state depends on them) — that's why
external_throttle/pitch are spool-filtered (der(filter)=(cmd-filter)/tau): it
both gives pilot feel AND keeps them live.if on algebraic vars. Use min/max for clamps and a
branch-free arithmetic blend (a*x+(1-a)*y) for selection, never a nested if.For a rover route, the drivetrain and any continuous control law remain the
actuator-side Modelica/USD contract. Both skid RoverDrivetrain and wheel-steered
RoverAckermannDrivetrain consume parameters:forward_yaw_offset on the
drivetrain prim to align guidance with the wheel travel frame. Navigation uses
−Z forward by default; a body-local +X wheel heading requires −π/2. Derive the
travel direction from the authored steering axis crossed with the wheel axle,
and keep that frame parameter when switching drive laws. Verify waypoint
arrival in the authored production route test with its actual axle frame.
A scene-level Rhai route program reads
the route's composed point prims, waits for generic sensor enter events, and
publishes current named-port guidance through the shared bridge. The route is
not stored on the rover. User possession controls the local ControlLink, HUD,
and manual-input session; possession alone does not stop an enabled route
program. The shared controller requests ClaimControl when the operator first
presses a bound intent on a target owned by another session. The existing
control.authority.take Rhai policy decides whether that handoff is allowed.
After the claim, the target-scoped semantic edge reaches the route policy and
the held port command is applied.
Route editing resolves composed LunCoProgramAPI and inputs:subject bindings,
including when the pointer context has no selected or possessed subject.
Identity and hierarchy queries explicitly request attrs: []; omitted attrs
reads every authored attribute. Discover programs through bounded, branch-local
QueryUsdPrims batches: Rhai limits aggregate string bytes in nested values,
so a whole CAD hierarchy level can exceed the limit even without attributes.
Verify both a unique unpossessed route and ambiguity rejection, and exercise
the active scene_interaction hook through native window input for UI acceptance.
A a Scope applying LunCoProgramAPI child prim on the vessel, naming a .rhai scenario
(uniform asset info:sourceAsset = @scenarios/my_supervisor.rhai@), does
supervision and sequencing — never a control loop. React to events; don't poll or
step.
fn on_event(me, evt, ctx) {
if evt.name == "lander_touchdown" { /* advance the mission */ }
if evt.name == "low_fuel" { notify_kind("Low fuel", "warn"); }
}wait, wait_for, wait_until) or
from Modelica condition outputs connected to LunCoEvent prims, not dt counting:
def LunCoEvent "LowFuel" { float inputs:trigger.connect = </Lander.outputs:low_fuel>; uniform token lunco:event:name = "lander_low_fuel"; uniform token lunco:event:severity = "warning" }.The controller reads SENSORS, not the god-view body. Sensors are reusable prims in
assets/vessels/sensors/ (imu.usda, altimeter.usda), referenced + mounted:
def "Altimeter" (prepend references = @../../vessels/sensors/altimeter.usda@</Altimeter>)
{ double3 xformOp:translate = (0, -3.3, 0); uniform token[] xformOpOrder = ["xformOp:translate"] }A wire is a native USD connection, authored on the prim that CONSUMES the value —
float inputs:descent_rate.connect = </Lander.outputs:velocity_y>,
float inputs:altitude.connect = </Lander/Altimeter.outputs:range>. Wired inputs are
live (they reach the solver). Physical constants a model needs (mass, inertia) come from
the body's own ports (inputs:vehicle_mass.connect = </Lander.outputs:mass>,
inputs:inertia_xx.connect = …) — USD-derived, not magic numbers.
A Modelica parameter is authored as a typed USD constant and is placed in
the compile-time parameter set by contract classification. A runtime Modelica
input is a live signal and needs a native USD connection or an explicit
runtime writer; do not infer its kind from the USD spelling alone.
Rust publishes only generic built-in observations. The sensor asset and USD connections identify placement and topology; Modelica performs filtering, frame conversion, navigation, and control. Do not add a semantic sensor registry, a world-coordinate force special case, or a fallback port when the parsed Modelica contract does not match the authored scene.
piloted signal + ControlLinkThis is the key pattern. Do not build a bespoke gate.
SessionRegistry and RBAC
(may_take_control) arbitrate those user sessions. An authored mission or
route program is scenario policy, not a possession session.piloted port:
a read-only cosim port (PILOTED_BACKEND, lunco-cosim/src/ports.rs) that is 1.0
when any session owns the vessel (SessionRegistry::owner_of(...).is_some()), else 0.float inputs:piloted.connect = </Lander.outputs:piloted>) into the
model as the manual-input authority signal. Gate the pilot stick with it, then
combine manual input with authored program/autopilot inputs through the model's
explicit authority signals. Do not let a possession change replace or zero an
active program's enable, target, or speed inputs. Possession owns the manual
input claim; authored model policy owns the command mux.ClaimControl transition.
The authored control.authority.take policy decides whether the local session can
take the endpoint; Rust does not special-case an autopilot role.external_throttle/pitch/… through the vessel's
intent→port Controls scope (next section) when they possess. Camera-follow
without taking control: follow(entity) (inserts a chase camera, no ControlLink).Scene replacement clears possession claims for outgoing USD prims at the shared
SceneTeardown boundary. Because claims use stable GlobalEntityId values, a
replacement projection may reuse an id without inheriting the previous scene's
driver; persistent non-scene ids are not cleared by that sweep.
AcquireControl and ReleaseControlSource are the single owner of the possession
transaction: they validate the endpoint and local binding before changing
SessionRegistry or ControlLink. A handoff releases prior claims for that
session (except the selected target). Releasing possession removes the local
control/camera binding and updates the manual-input authority; it does not write
endpoint ports or stop an authored autopilot. Wire-applied commands update host
authority only and never bind a remote session to the local camera. Explicit
endpoint lifecycle stops remain separate from possession release.
A route or mission program publishes authored guidance through the vessel's
generic named-port surface and the model's existing guidance/actuation
contract. It does not call AcquireControl or claim a user session. Releasing
possession leaves the program's input ports and enable state intact. The generic
route_follow policy stops guidance on a pressed or pulsed non-Action
intent.edge from its currently possessed subject; input from the free avatar
or another unpossessed surface cannot stop it. Action remains the route
toggle. Other authored autopilots should consume the same semantic edge
contract to yield. When a mission also drives that subject, retire its driving
branch on the operator route's route_started and route_stopped events.
Subscribe to the running script host (usd_path(me) at the emitter), which
can be the parent scope of the LunCoProgramAPI source prim. Retiring a mission
must preserve a newly started operator program's guidance writes. Test the HUD
handoff while mission guidance is active immediately after deployment, then
verify it remains stopped across subsequent ticks and a scene reload.
An attended deployment may explicitly hand the local operator to the new
vehicle with AcquireControl { bind_camera: true }. A host-authority claim
with bind_camera: false does not move local keyboard input to that vehicle.
Keep this discrete operator handoff separate from publishing guidance.
Do not set
Position, LinearVelocity,
ModelicaModel.inputs, or a private actuator component to make a scenario move;
those bypass the authored input and model contracts.
Controls scopeA vessel is possessable + drivable when it carries two things:
throttle/steer/brake from its composed USD/model network (the projection stamps
a separate MobilityRoot and OutputPorts); a cosim vessel gets its .mo inputs
(external_throttle, pitch, …). This surface is topology-derived; you don't
hand-write it.Controls scope — the intent→port map (stage 2 of control), read into a
lunco_control_core::ControlBinding. Without it a vessel can be possessed but keyboard
input does nothing — drive_from_bindings skips a bindingless vessel. (API /
set_input / rhai can still drive it by port name — that path needs only the surface.)For desktop manual control, the workbench owns the UI-to-simulation focus
boundary. A press resolved to the main 3D scene surrenders retained egui
TextEdit focus before it publishes EguiFocus, so a possessed vessel can
receive the shared input map after a perspective switch. Active text fields
continue to capture keyboard input until that explicit scene press. The
controller must consume this published focus state; it must not read raw keys
again, clear focus itself, or add a vehicle-specific input path.
The local Embodiment is a separate domain role. It also has an InputPorts surface and
binding, but those ports are its free-flight embodiment and are not a vessel
possession target. Click resolution and AcquireControl enforce this boundary by
accepting a non-Embodiment input surface; SceneCamera is presentation metadata and
does not participate in possession.
Author the scope as a child references arc to the shared profile — the SAME arc
kind the wheels use, so it composes through a spawn/reference. Root subLayers and
inherits do not provide the required spawned control profile.
# on the vessel prim — a rover:
def "Controls" (
prepend references = @../control_profiles.usda@</RoverControls> # lander: </LanderControls>
)
{
}assets/vessels/control_profiles.usda: RoverControls
(forward/back→throttle, left/right→steer, brake→brake) and LanderControls
(forward/back→body pitch, left/right→body roll, yaw_left/right→body yaw,
thrust→external_throttle, release→release). The lander profile selects a
stable orbit camera: camera orientation never remaps these body axes.
W/S/A/D/Q/E and G are only the bundled input_bindings labels; help must
resolve the current settings rather than hardcoding those keys.
In the bundled lander mission, G writes the authored release input; the
scene Rhai program edge-detects it after touchdown and calls generic
DetachJoint for the authored dock. Keep that delivery policy in Rhai, not
in a vehicle-specific Rust port backend.
The path is relative to the vessel file (@../../control_profiles.usda@ one dir deeper,
@../../vessels/control_profiles.usda@ from a scene).def "Controls" (references=…) { def "action" { uniform string lunco:port = "handbrake" } }.UserIntent map, so a saved
keymap rebinds every vessel; you only choose what each intent actuates here.pause intent. The avatar hotkey toggles
SetTimeTransport from that intent; it is not a vehicle port or a raw-key
controller special case.Controls child (and give it an
actuation surface) via the USD-op API on the new prim — it composes immediately and the
possessing avatar can drive it. No Rust, no restart. This is how you "build a new entity
and teach the avatar to control it."For discrete controls, use intent_pulse(target, "release") or
intent_edge(target, intent, edge) from the control prelude. The runtime
publishes one target-scoped intent.edge event for pressed, released, or
pulse; consume it in the authored Rhai supervisor and let that policy drive
the appropriate Modelica/port behavior. Do not emulate a pulse with two
ordered held commands, and do not add a vehicle-specific Rust action path.
The helper returns the edge command id. Use it with
query("CausalTrace", #{target: target, correlation_id: edge.id}) to inspect
the current authored binding, selected public port owner, connection/native
joint admission, measured channels, and the edge's classified producer origin.
Rhai-origin records include the owner cycle, generation, logical sequence, and
the stable actor id when issued by a Twin scenario. Twin scenario helper calls
omit producer_id; actorless application Rhai and API/direct typed callers
supply a stable nonzero ID. External discrete edges include their committed
scene generation, effective tick, and per-tick sequence; deterministic Rhai
simulation edges have no external admission stamp. This is a diagnostic
snapshot; an empty or pending stage means the path is incomplete. The bounded
trace is not a session replay log.
.mo model: sensed inputs → force/torque; min/max
clamps; DIRECT control path; a piloted gate. Der-feed any tunable gain you want
Inspector-editable at sim-rate.assets/vessels/sensors/ and mount them.LunCoProgramAPI, name the model
(uniform asset info:sourceAsset = @models/MyController.mo@), promise
uniform bool lunco:program:realtimeSafe = true, author the connections (sensor +
body ports → model inputs:, incl. inputs:piloted, and model force/torque → the
body), and add a Controls child that references a profile (</LanderControls>)
so the pilot's intents reach the stick ports.Scope applying LunCoProgramAPI child prim naming a .rhai supervisor for events/sequencing
(no control loop), with connected LunCoEvent children for model conditions.piloted); release → GNC resumes. Tune live via the Inspector or set().piloted gate instead.manual flag toggled at runtime — folds unless der-fed; and it's
per-model. piloted is the general, wired, first-class signal.© LunCoSim, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/authoring-vessel-controllers of LunCoSim/lunco-sim.
Open the folder on GitHubat commit 43f1301
Authoring Vessel Controllers next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Authoring Vessel Controllers this skillLunCoSim/lunco-sim | 107 | — | ~5.8k | Automated safety check: Pass | Apache-2.0 | |
| Vercel Composition Patternssupabase/supabase | 111k | 58 repos | ~726 | Automated safety check: Pass | MIT | |
| Finishing a Development Branchobra/superpowers | 297k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Typescript Advanced Typesrolling-scopes/rsschool-app | 10k | 25 repos | ~4.2k | Automated safety check: Pass | MPL-2.0 | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 4 repos | ~1.1k | Automated safety check: Pass | MIT |
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
rolling-scopes/rsschool-app
Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
onyx-dot-app/onyx
Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.
LunCoSim/lunco-sim
Generate concise LunCoSim nightly GitHub release notes with platform downloads, installation guidance, an AI-agent mission prompt, and a changelog link.
LunCoSim/lunco-sim
Build or repair a reusable scene component through a live LunCoSim Editor session.
LunCoSim/lunco-sim
Build or review a componentized LunCoSim USD assembly with a realistic, dimensionally checkable presentation.
LunCoSim/lunco-sim
Author and review LunCoSim behavioral, asset-backed, component, mission, visual, and requirements-verification tests.
LunCoSim/lunco-sim
Create, extend, register, or debug a reusable LunCoSim Rhai tool library for live USD authoring, component linting, inspection, or test support.
LunCoSim/lunco-sim
Author an interactive tutorial, guided lesson, onboarding flow, coach-mark tour, or objectives checklist in LunCoSim.
Categories
Author vehicle controllers in LunCoSim so spacecraft, landers, rovers, and drones can move, fly, drive, land, or accept pilot control. Authoring Vessel Controllers is an agent skill from LunCoSim/lunco-sim. Author vehicle controllers in LunCoSim so spacecraft, landers, rovers, and drones can move, fly, drive, land, or accept pilot control.
Authoring Vessel Controllers fits situations like: debugging autopilot; waypoint following; thruster response; manual takeover.
Run `npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a claude-code`. Or copy the skill folder (skills/authoring-vessel-controllers in LunCoSim/lunco-sim) into .claude/skills/authoring-vessel-controllers in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a codex`. Or copy the skill folder (skills/authoring-vessel-controllers in LunCoSim/lunco-sim) into .agents/skills/authoring-vessel-controllers in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LunCoSim/lunco-sim --skill authoring-vessel-controllers -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/authoring-vessel-controllers, .gemini/skills/authoring-vessel-controllers, .github/skills/authoring-vessel-controllers and .opencode/skills/authoring-vessel-controllers in your project.
SKILL.md names no scripts, command-line tools or credentials: Authoring Vessel Controllers is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Authoring Vessel Controllers is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.8k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Authoring Vessel Controllers: Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 297k stars), Typescript Advanced Types (rolling-scopes/rsschool-app, 10k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LunCoSim (a GitHub organization) maintains it in LunCoSim/lunco-sim, which has 107 GitHub stars. The repository holds 40 skills in this directory. The repository was last updated on October 10, 2026.
Source: LunCoSim/lunco-sim on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.