agentleFS
GoogleKnown publishergoogle/capsem/skills/dev-just/SKILL.md

dev-just

Skill179 starsChanged 12 days agoApache-2.0View on GitHub

Capsem's small Just surface and its boundary with the Python gate. Use when adding or changing a recipe, or deciding whether logic belongs in Just or in a gate plan.

The file

We split this skill into the rules it gives an agent

10 rules. About 0 are common, 4 are distinctive, and 6 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈4

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Treat the Justfile as a stable user interface, not as the implementation of a command.

    line 46
  2. Distinctive:

    Do not use remaining private recipes as templates for new logic.

    line 65
  3. Very specific:

    Read /dev-gate before changing Python orchestration and /release-process before changing either release plan.

    line 76
  4. Very specific:

    no shell body (no #!/bin/bash) -- build_system/tests/gate/test_gate_boundary.py

    line 84
  5. Very specific:

    No generic or combined release recipe.

    line 109
  6. Distinctive:

    No dependency-update, fixture-update, audit-only, coverage-only, cleanup, session-SQL, or extra package-install convenience recipes.

    line 113
  7. Very specific:

    No separate UI aliases. Use just dev <surface> or just build.

    line 116
  8. Distinctive:

    No public build primitives for kernel, rootfs, Docker images, architectures, or package rails.

    line 117
  9. Very specific:

    No public continuation recipe.

    line 119
  10. Distinctive:

    All checked-in automation enters through the same two public release recipes.

    line 154

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Capsem Just discipline

The Justfile is a product interface, not a script drawer. Its public surface is exactly the allowlist in config/public-surface.toml; the contract test derives the live recipe list and fails on additions, removals, renames, or count drift. A new public recipe requires explicit user/product approval and an intentional allowlist update in the same change.

Approved public commands

CommandContract
just dev [ui|frontend|tui]Select one development surface. No passthrough arguments: just joins a variadic before interpolating it, so no spelling preserves argument boundaries. Use uv run --project build_system --frozen capsem-gate dev tui … when you need them.
just build [debug|release]Build the desktop app with its embedded frontend.
just build-all [debug|release]Build all host binaries, desktop app, docs, and site.
just build-docsBuild documentation and marketing sites.
just shellStart the service and enter a temporary VM.
just exec "<command>"Run one command in a fresh temporary VM.
just run-serviceMaterialize assets/config and start the local daemon idempotently.
just logs [sandbox-id|failure]Tail service logs, show a sandbox log, or list the latest preserved failure evidence.
just doctor [fix]Validate host tools, Docker/Colima, Tart cache/boot/SSH, signing, and assets.
just fast-testExplicitly incomplete source feedback; it prints the targeted and release rails.
just focus-test <group> [reuse|clean] [slow]Rerun one existing owner: assets, binaries, benchmark, functional, greyjoy, kingslanding, install, inspect, release-system, or affected rust. inspect runs installed Inspect acceptance only; release-system is source-only; rust derives changed crates and reverse dependents from Cargo manifests.
just installOptional hands-on local package testing; never a release prerequisite and never release authority.
just test [source-commit] [normal|force] [reason]Reusable complete local verification; low-impact repeats route to focused owners, while exceptional force requires a reason. Required, passing, before any release of that source.
slow (fourth test argument, third focus-test argument)Permission to rebuild host VM assets whose expensive inputs changed: Cargo.lock, build_system/uv.lock, the toolchain, builder Dockerfiles, the kernel defconfig. Without it a run whose assets went stale that way stops at the first asset step and names the input, since the rebuild is the guest builder image, every agent, the initrd, the images and the host binaries. Source-only staleness (a capsem-core edit) rebuilds without asking.
just build-assets [arch]Build the VM runtime assets (kernel, initrd, rootfs) for one architecture, or every one.
just qualify-assets <input_dir> <workspace_root> <activation_ready>Qualify built runtime assets against the selected binary (the runtime lane's qualification step).
just release-binaries <channel> <source-commit>Dispatch qualification and publication of packages against the pulled runtime.
just release-assets <channel> <source-commit>Dispatch qualification and publication of the VM runtime against the pulled package.

just --summary must print exactly the names in [just].approved and nothing else. The count is not repeated here on purpose: this line used to say "those 13 names", which was wrong the moment the surface legitimately grew, and a number restated away from its source is a number that goes stale silently. config/public-surface.toml is the authority; the contract test compares the live recipe list against it.

The Python system replaced shell orchestration

Treat the Justfile as a stable user interface, not as the implementation of a command. For focus-test, release-binaries, and release-assets, one recipe line crosses one exact argv boundary into capsem-gate; install prints its hands-on-only warning before crossing the same boundary. From there:

ConcernOwner
Public command name, defaults, and exact argv dispatchjustfile plus config/public-surface.toml
Command shape and plan graphbuild_system/builder/gate/<domain>.py
Shared worka composable fragment(...), deduplicated with plan.shared(...) when necessary
Orderingexplicit graph edges passed through after=
Subprocess or filesystem workactions.py, fileactions.py, and their typed domain actions
Always-run setup, teardown, and failure preservationResource implementations held by the command
Paths, filenames, environment names, channels, architecture valuesconfig/gate.toml
Release mode and manifest-selected artifact pathsone Qualification value parsed by the command
Evidence and timingthe gate run log written by the execution funnel

The old system expressed orchestration through shell bodies, Just dependencies, textual order, nested recipes, ambient environment reads, and ad hoc cleanup. Do not use remaining private recipes as templates for new logic. Move each decision into the Python graph, where dry-run, graph inspection, run logging, locking, teardown, and contract tests see it.

A plan action must never invoke just or another capsem-gate command. Compose the other command's fragment instead. The machine lock is not reentrant, so a nested gate waits for the lock held by its own parent. Likewise, do not split a release with an operator-authored receipt. The complete local test owns one process, lock, workspace, plan, and runner journal. Release commands do not consume it; each hosted lane performs its own release qualification.

Read /dev-gate before changing Python orchestration and /release-process before changing either release plan.

What a recipe may contain

A recipe is a dispatch or a single command. Nothing else, and this is checked rather than advised:

  • no shell body (no #!/bin/bash) -- build_system/tests/gate/test_gate_boundary.py
  • at most five executable lines
  • no if, for, while, case, until or trap

The old justfile carried roughly 2070 lines of inline bash across thirty-five recipes, none of it reachable by a test, so every defect in it was found by running the forty-minute gate. The ratchet is what matters: do not add shell orchestration back. Logic lives in build_system/builder/gate/; see /dev-gate for how to add or change a command.

The one exception is a single command with no branching -- cargo build, cd web/app && pnpm run dev -- where routing through Python would add a uv startup and, for an interactive dev server, break TTY and signal handling, in exchange for no decision made.

What does not belong in Just

  • fast-test is exactly the incomplete test-fast module. It may not bundle compiled, VM, install, or release work.
  • focus-test aliases an existing owning gate command; it must not copy or compose a second test graph. The one addition is the shared source guards (testmodules.source_guards: Ruff, both Ty passes, collection, Citadel), which every group runs before its own first step. focus-test release-system aliases the source-only release-contract owner; package rehearsal and installed-product proof belong to qualification. Neither feedback command is release authority.
  • No generic or combined release recipe. Each of the two approved release commands refuses a source without a passing just test (same commit, or one with the identical tree), then dispatches its hosted lane, which still qualifies what it publishes; the two workflows share the per-channel lock.
  • No dependency-update, fixture-update, audit-only, coverage-only, cleanup, session-SQL, or extra package-install convenience recipes. Call the owning script/tool directly.
  • No separate UI aliases. Use just dev <surface> or just build.
  • No public build primitives for kernel, rootfs, Docker images, architectures, or package rails.
  • No public continuation recipe. Exact-commit just test derives a partial frontier only from its archived event graph and retained full-SHA prefix; working-tree diagnostic continuation is not qualification. Both release commands refuse continuation flags.

Private underscore recipes may exist only as dependencies of the approved commands or as narrow CI primitives. Specialized skills and workflows may name those internals, but general developer guidance must not present them as public commands. Prefer a tested script when orchestration has state, branching, reporting, cleanup, or resource ownership.

Canonical testing

just test owns the complete graph:

  • fail-fast bootstrap and clean install-harness proof;
  • audits, lint, frontend, Rust and Python coverage;
  • both architecture VM runtime asset lanes and real VM boot;
  • four-VM parallel integration;
  • Linux parity and both .deb architectures;
  • host package SBOM;
  • Linux systemd install plus channel glow-up;
  • on macOS, an unsigned local .pkg install in Tart, ad-hoc signature checks on the installed executable payload, and physical Apple VZ boot from that exact package.

Release CI calls the checked-in _test-fast, _test-static, _test-artifacts, _test-functional, _test-glowup, and _test-release-contracts modules. _test-fast is also the first phase of just test and just fast-test; it owns YAML/source syntax, source contracts, Clippy, Python and JavaScript checks, and every locked-ecosystem vulnerability audit. Callers must reuse it whole rather than duplicating a subset. Binary CI builds packages and pulls the runtime; runtime CI builds the runtime and pulls packages. Both retain complete functional and glow-up proof before activation. Do not fork or approximate this graph in another public recipe. All checked-in automation enters through the same two public release recipes; it must not call their scripts or workflows directly. Local verification must not import, unlock, or use Apple Developer certificates. Developer ID package signing, notarization, and stapling belong only to the tagged publication workflow.

Public-surface gate

Run:

uv run --project build_system --frozen python build_system/scripts/audit/check_public_surface.py
uv run --project build_system --frozen python -m pytest -c build_system/pyproject.toml --rootdir . tests/test_public_surface_contract.py

The gate also locks the Capsem CLI command tree and service HTTP method/path table. Review config/public-surface.toml as an API approval ledger, never as a snapshot to refresh automatically.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.