skills/ship-sails-app/SKILL.md
Use when a builder needs the top-level router for a standard Gear/Vara Sails app workflow from spec through gtest and local smoke. Routes ethexe-specific work to dedicated ethexe skills. Do not use for raw gstd-only programs or non-Sails tasks.
npx skillsauth add gear-foundation/vara-skills ship-sails-appInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
_VS_DIR=""
for _d in \
"${VARA_SKILLS_DIR:-}" \
"$HOME/.claude/skills/vara-skills" \
".claude/skills/vara-skills" \
"$HOME"/.claude/plugins/cache/vara-skills/vara-skills/*; do
if [ -n "$_d" ] && [ -f "$_d/bin/vara-skills-update-check" ]; then
_VS_DIR="$_d"; break
fi
done
if [ -n "$_VS_DIR" ]; then
export VARA_SKILLS_DIR="$_VS_DIR"
_UPD=$("$_VS_DIR/bin/vara-skills-update-check" 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
fi
If output shows UPGRADE_AVAILABLE <old> <new>: read ../vara-skills-upgrade/SKILL.md and follow the "Inline upgrade flow" (auto-upgrade if configured, otherwise ask user with 3 options, write snooze if declined). If JUST_UPGRADED <from> <to>: tell user "Running vara-skills v{to} (upgraded from v{from})!" and continue.
Use this as the first stop for the provisional Sails-builder pack. Route the builder by repo state and next required artifact, then hand off to the narrower skill.
../../references/gear-execution-model.md../../references/gear-messaging-and-replies.md../../references/gear-gas-reservations-and-waitlist.md../../references/sails-rs-imports.md../../references/delayed-message-pattern.md../../references/sails-program-and-service-architecture.md../../references/sails-idl-client-pipeline.md../../references/sails-gtest-and-local-validation.md../../references/scale-binary-decoding-guide.md../../references/voucher-and-signless-flows.mdgstd. Use sails-rs 1.0.0 as the current baseline unless the target repo already pins a different version.cargo build runs build.rs: program or wasm crates usually call sails_rs::build_wasm(), while the repo may also emit .idl and typed client outputs from that same build flow.sails-rs = { version = "...", features = ["build"] }
with sails_rs::build_client::<Program>().sails-client-gen-v2 and sails-idl-gen wiring as a manual pipeline for explicitly non-standard repo layouts.#[program], public constructors return Self; name that constructor shape and the chosen state ownership pattern explicitly in planning artifacts.#[service], only methods tagged with #[export] are public Sails routes. Event-producing paths should use emit_event.SS58 addresses, not Ethereum 0x addresses. Local tooling commonly uses Vara prefix 137..idl as the source of truth. The normal JS or TS path is sails-js or sails-cli plus GearApi, generating outputs such as lib.ts and typed program or service classes. Use parseIdl only for an explicitly dynamic runtime path.#[codec(crate = sails_rs::scale_codec)] and #[scale_info(crate = sails_rs::scale_info)] pattern before deeper debugging.ReservationId; reservation duration is bounded and is not a value top-up.../../references/delayed-message-pattern.md instead of inventing a one-off byte layout.Syscall::gas_available().../../references/voucher-and-signless-flows.md.SS58 addresses, keep seed phrases and private keys out of commit-ready examples, and do not invent program IDs, voucher IDs, or account addresses.build.rs before inventing manual generation commands.
Prefer this order:
sails_rs::build_client::<Program>()sails_idl_gen::generate_idl_to_file::<Program>(...) plus ClientGenerator::from_idl_path(...).idl for standard Sails interface paths, ProgramMetadata for full state, and state.meta.wasm for state-function output. Use plain Decode::<T> only when the bytes are known to be a bare SCALE payload.cargo sails new <project-name>.app, client, src, tests, top-level build.rs, and baseline Cargo wiring.cargo-sails, or the gear binary: ../sails-dev-env/SKILL.md../sails-new-app/SKILL.md../sails-feature-workflow/SKILL.md#[program], #[service], state, or service boundaries: ../sails-architecture/SKILL.md../gear-message-execution/SKILL.mdbuild.rs, missing IDL, or generated client drift: ../sails-idl-client/SKILL.mdgtest: ../sails-gtest/SKILL.mdgtest is green and the next step is a typed live-node smoke run: ../sails-local-smoke/SKILL.md../awesome-sails-vft/SKILL.mdnpx create-vara-app <name> --idl <idl-path>, then ../sails-frontend/SKILL.md for customization../sails-frontend/SKILL.md../gear-message-execution/SKILL.md../sails-ethexe-architecture/SKILL.md (planning) or ../sails-ethexe-implementer/SKILL.md (implementation)Keep the builder on this document chain inside docs/plans/:
YYYY-MM-DD-<topic>-spec.md -> ...-architecture.md -> ...-tasks.md -> ...-gtest.md
Use shared templates from:
../../assets/spec-template.md../../assets/architecture-template.md../../assets/task-plan-template.md../../assets/gtest-report-template.mdgtest, and local-node validation so the builder sees the full Sails path instead of just the first step.gtest, redirect to testing first.development
Use when approved tasks require Rust code changes in a Sails ethexe workspace with the ethexe feature enabled. Do not use for standard Gear/Vara Sails apps without ethexe, or when the spec or architecture is still unsettled.
development
Use when a builder needs to design or review architecture for a Sails ethexe app with dual-transport, payable methods, Solidity interface generation, or Ethereum-style events. Do not use for standard Gear/Vara Sails apps without ethexe.
development
Use when a builder needs to design or debug calls from a standard Gear/Vara Sails program into runtime builtin actors such as BLS12-381, staking, proxy, or ETH bridge, including ActorId derivation, request encoding, reply decoding, and gas or ED budgeting. Do not use for regular program-to-program messaging, Vara.eth or ethexe-only work, non-Sails repositories, or runtime-maintenance tasks inside the Gear repo.
development
Use when a builder needs a read-side indexer and query API for a standard Gear/Vara Sails app using program events, IDL-driven decoding, projected read models, and optional on-chain query enrichment. Do not use for command-side backends, generic Node APIs, non-Sails repositories, Vara.eth or ethexe-first work.