loomyard

module
v0.0.0-...-c20b2e5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 3, 2026 License: Apache-2.0

README

LoomYard

LoomYard (LY) is a task-orchestration system for Claude Code. It manages the lifecycle of coding tasks — from a discussion of what to build, through planning, implementation, and review, to the merge back — with each task isolated in its own git worktree.

The central idea: replace as much of the agent loop as possible with deterministic Go.

An agentic system built out of prompts asks a model to do work a program does better. Deciding what runs next, parsing a plan, walking a directory, staging a commit, checking whether an artifact satisfies its format, retrying a failed step, resuming after a crash — every one of those is a program, and every one of them is slow, expensive, and non-reproducible when a language model does it instead. Worse, it fails differently each time.

So LoomYard draws a hard line. Control flow, state, git, parsing, validation, geometry, routing, retry, and resume are Go — tested, deterministic, and cheap. A model is called only where judgment is genuinely irreducible: is this plan sound, does this diff match its plan, write this code. Those calls are made through a narrow file contract — a prompt goes in, named files come out — so even the LLM steps have a machine-checkable shape around them.

The practical payoff is that the same run does the same thing twice, a crashed run resumes exactly where it stopped, and the parts most likely to break are the parts covered by go test rather than by hope.

At its center is lyx — a single Go binary (LoomYard eXecutable) that owns the task board, the git topology, and the orchestrator. The full spine now ships: lyx run in a worktree bootstraps a task and drives it through a seventeen-row phase machine to a merge-back, unattended.

Built on Millhouse's ideas, not a port of it. LoomYard started as a Go rebuild of Millhouse and still owes it the core premise — task orchestration for Claude Code, isolated worktrees, AI subagents for the judgment steps. It has since grown well past that: the orchestrator is a data-driven phase machine rather than a skill set, review is a Go-owned gate loop, and the git topology is a model Millhouse has no equivalent of.

Inspiration

Through Millhouse, LoomYard builds on ideas from three projects:

  • claude-code-plugins by Craig Motlin — task tracking and skill plugins for Claude Code
  • autoboard by Willie Tran — autonomous agent orchestration patterns
  • skills by Matt Pocock — Claude Code skill conventions

Naming: lyx · loom · ly

Three names for three layers, deliberately non-overlapping:

  • lyx — the binary/CLI (LoomYard eXecutable): one binary with a namespaced subcommand tree (lyx board, lyx fabric, lyx webster, …).
  • loom — the orchestrator module (lyx loom run), a domain like board or fabric that drives a phased run.
  • ly — the skill / orchestration plugin; skills are /ly-*. Still a plan rather than a shipped set — see docs/skills.md for which mill skills become lyx verbs and which survive as skills.

Convenience alias: lyx runlyx loom run (the everyday autonomous call).

Design principles

  1. Go where it can be; LLM only for judgment. The principle above, stated as a build rule: deterministic work — verbs, control flow, parsing, distillation, geometry, git — is Go; a model handles only what a program cannot (review verdicts, batch implementation, an orchestrator's recovery decisions). When a step could plausibly go either way, it goes to Go.
  2. Toolkit-first. Build small, composable primitives (board, fabric, reed) before the orchestrator that ties them together.
  3. One-shot, daemonless, file-coordinated. A command does its work, writes JSON to stdout, and exits. Concurrent processes cooperate through files and locks, not a server.
  4. cwd-authoritative. Config and state resolve from the current working directory, which need not equal the git-repo root.
  5. Told, never derived. Every layer from reed up is handed its geometry — absolute paths, already resolved — instead of computing it. That is what lets the same producer run inside a hub or against a plain checkout with no hub at all; see the Told-Geometry Invariant in CONSTRAINTS.md.
  6. Correctness by tool design, not by recall. A lyx command makes the correct path the path of least resistance and makes drift detectable, rather than relying on an operator or agent to remember a rule.

Fabric: the warp and the weft

An orchestrator has to keep state somewhere — config, task board, plans, review verdicts, run status. Putting that in your repo pollutes it; putting it outside your repo means it doesn't travel, doesn't branch with the work, and can't be resumed on another machine.

LoomYard's answer is a piggyback repo woven into your own. Your repository is the warp; a second git repository, the weft, carries everything LoomYard generates. Every warp worktree gets a weft sibling on a matching branch, and the two are wired together on disk so that state written while working in a worktree lands in the weft — invisibly, without a single LoomYard file ever appearing in your repo's history or its .gitignore.

Woven together, the two sides are one thing: the Fabric. That is the name that matters — warp and weft are only used where the two sides genuinely have to be told apart. From the outside the Fabric behaves as a single repository, because lyx fabric is the seam that keeps it coherent and moves both sides as one: add and remove create and destroy a worktree pair, checkout switches both branches together and re-points the wiring, pull reconciles both sides against their remotes, status is one both-sides view of uncommitted work, and diff reports the change since a given commit across the pair. You say "switch this task to that branch" once, against the Fabric, and never think about which of the two repositories underneath had to move.

<hub>/                                (top-level Hub, NOT a git repo)
  ├── <prime>/                        (your repo, main branch)   ┐ one Fabric,
  ├── <prime>-weft/                   (its weft side)            ┘ two checkouts
  ├── <slug>/                         (a task worktree)          ┐ likewise, on
  ├── <slug>-weft/                    (its weft side)            ┘ the task branch
  ├── _board/                         (the task store, on weft's main branch)
  ├── _portals/                       (per-worktree entry points into the weft side)
  └── _launchers/                     (per-worktree launcher scripts)

Because the weft is a real git repository that branches in lockstep with the warp, a task's whole state is versioned, pushed, and recoverable: pick the task up on another machine and it resumes where it stopped. And because state is per-branch rather than global, two agents working two tasks never see each other's plans, verdicts, or run status.

Holding that illusion up is a hard rule rather than a convention: every git operation LoomYard's own code performs, on either side, goes through the fabric engine in Go — never raw git, and never an agent. An agent commits its own code to the warp and nothing else; the weft is committed by Go, at boundaries the orchestrator controls. When a pair does drift or get broken by hand, lyx fabric reconcile converges it back onto the recorded layout.

All path resolution goes through a single package, internal/lyxcwd, so this geometry has exactly one owner; see CONSTRAINTS.md and docs/overview.md for the on-disk detail.

Modules

Every user-facing module is a lyx <module> namespace, assembled into one cobra root. All commands print JSON: {"ok":true, ...} on success, {"ok":false,"error":"..."} on failure.

  • board — the task-tracker board, plus a parallel not-yet-claimable notes surface and promote-note between them.
  • config — view/edit module configs; lyx config reconcile reconciles all configs against their templates; lyx config <module> --set key=value writes values non-interactively.
  • fabric — the sole warp↔weft git-coordination module, unifying topology (clone, dual-worktree add/remove, coordinated checkout, reconcile, status, prune, cleanup), weft content-sync (status|commit|push|pull|sync|diff), and a merge/conflict lifecycle (merge-in|merge|merge-stage|merge --continue|--abort) in one command tree. lyx fabric clone is the hub creator and does the whole job in one call — there is no separate activation step (the former lyx init dissolved into it).
  • ide — one-shot IDE launcher for worktrees, with an interactive menu.
  • reed — the tmux overlay + strand bookkeeping + render, with a watchdog daemon that reconciles resize geometry and reaps dead panes.
  • shuttle — runs one LLM agent as an interactive tmux strand over a file contract, via a swappable provider engine (Claude today), classifying every run as done/asking/died/timeout.
  • burler — one review+fix round over an artifact: A-review → B-fix, one agent, no self-grading, driven entirely by a profile YAML so the round itself carries zero domain knowledge.
  • webster — the implementer: one long-lived Master session reads the flat card-list plan once and forks one implementer per batch in-session, bracketed by begin-batch/await-batch/record-batch, escalating a stuck fork to a cold recovery strand.
  • stencil — the operator surface over the producer prompts every agent reads from disk at call time: list|validate|diff|sync|promote.
  • loom — the phased orchestrator (run|drive|status|pause|validate-discussion|validate-plan). See the phase machine below.
  • selfreport — file bugs/enhancements against the repo via go-github, authenticated through internal/githubclient (gh is a fallback token source, not the transport).

Under these sit the internal (non-CLI) layers: proc (cross-OS process spawn), shed (the generic phase engine), the landing producers (Publish/Finalize), the precondition/geometry layer (preflight, hubgeom, standalonegeom), and the sole-parser leaves each on-disk format gets exactly one of — planparser, discussionparser, summaryparser. treadleengine is shipped but consumer-less on purpose: it is the generalized round-loop engine kept for the future Tenter. See docs/overview.md for the full map and manifest/designs/ for what is designed but not yet built.

Orchestration stack

The orchestrator is a layered stack, each layer knowing only the one below. It has this shape because agents run as interactive tmux sessions, never headless claude -p — so spawning an agent is "place a pane, launch a provider, drive it, detect completion," not a plain exec.

internal/proc     spawn any OS process, cross-OS                     [OS primitive]
internal/reed     tmux overlay + strand bookkeeping + render         [builds on proc]
internal/shuttle  run ONE LLM agent via a swappable engine           [builds on reed]
burler            one review+fix round: review → fix                 [builds on shuttle]
shed              walk a flat producer list to a terminal outcome    [engine; adapters wrap the above]
loom              shed + loom's own producer list                    [builds on shed]

webster branches off shuttle directly (an LLM orchestrator driving fat Go verbs, not a review-gate loop). The whole stack runs headless (auto mode): strands exist, agents run, output files are read, nobody need watch.

The stack has two entry modes. In hub mode a command resolves its geometry from the surrounding hub; in standalone mode it is told a target directory instead, so lyx burler run --target-dir … and lyx webster run --target-dir … work against a plain git checkout with no hub, no fabric, and no orchestrator seed.

The phase machine

shed (internal/shedengine) is a generic engine with no predefined slots — no Preflight slot, no Finalize slot, no review slot. It walks one flat, ordered list of producers, honoring resume, crash-recovery, and pause uniformly at producer granularity. What makes a product a product is purely which producers are in its list.

Routing is per-producer and explicit, never positional: a Done verdict follows that row's own on_done, a Stuck verdict follows its on_stuck (bouncing back to any row, forward or backward, within a per-producer bounce budget) or escalates to a human when on_stuck is empty. List order is display order only.

loom is therefore shed plus one list, and that list is data rather than code: contracts/recipes/loom-recipe.yaml, embedded into the binary and assembled into producers by internal/loomrecipe against internal/shedrecipe's engine registry. Its seventeen rows:

Preflight → Loom-Preflight
  → Discussion-Write → Discussion-Validate → [Discussion-Review segment]
  → Plan-Write → Plan-Validate → [Plan-Review segment] → Plan-Revalidate
  → Batchifier → Webster → [Webster-Review segment]
  → Publish → Finalize

Each […-Review segment] is two rows: a Bouncer (the judge — reads the artifact against a rubric, writes a verdict and a cross-round ledger) and a BurlerRound (one burler review+fix round). The two are bound by a shared segment: label, and shedengine's validator refuses an on_stuck that crosses a segment boundary — so the pair's mutual bounce edges are structurally enforced rather than conventional. The Bouncer returns Done only on an APPROVED verdict; the round producer never returns Done at all, handing back to its judge every time. Re-entering a settled segment re-judges from a fresh round 1 rather than replaying the old approval.

From loom's side every segment is the same black box with two exits. Only three things differ per phase: the rubric, the round's fix-scope (overlay for discussion and plan, whose targets are weft content the loop owner must commit; source for Webster, where the agent commits each fix to the warp repo itself), and the segment's commit seam. That split is the Fabric Git Invariant: every weft commit belongs to the loop owner in Go, and the agent's own commit-per-fix to the warp repo is the single named exception.

See manifest/designs/loom.md and manifest/designs/shed.md for the design record, and the internal/shedadapters package documentation for the round-artifact contract the two rows share.

Contracts

contracts/ holds what crosses a module boundary, versioned with the code that reads it:

  • contracts/stencils/ — every prompt an agent is given, shipped as an embedded default and read from the hub's stencils directory at call time, never from a compiled-in copy, so an operator can edit a live prompt without a rebuild. lyx stencil is the surface over that: diff shows upstream changes not yet taken (or, with --all, board edits not yet ported back), and promote copies an edit back into this source tree.
  • contracts/specs/ — the on-disk format contracts (loom-plan-spec.md, loom-status-spec.md, webster-spec.md, final-summary-spec.md, llm-model-spec.md), each with exactly one parser package in internal/.
  • contracts/recipes/loom-recipe.yaml, the producer list above.

Building

go build ./cmd/lyx        # build the lyx binary
go test ./...             # run the full suite (structural invariants included)

./deploy (deploy.cmd on Windows) builds and installs lyx onto PATH; ./deploy-dev targets a derived .dev-bin instead, so a dev build never overwrites the production install.

To start a hub, run lyx fabric clone <weft-url> [<warp-url>] — it clones both repos, wires the junctions, materializes every module's config, and creates _board, in one call. Then lyx fabric add <slug> for a task worktree, and lyx run inside it.

Sandbox Hub

The sandbox Hub is a dedicated bench for dogfooding lyx against itself, exercising the real deployed binary end to end against a throwaway hub cloned from lyx-test/lyx-test-weft. Each suite is an agent script driving the binary and reporting findings.

Build it with sandbox/posix/build.sh (sandbox/win/build.cmd on Windows), run a suite with sandbox/posix/core-suite.sh — plus fabric-, reed-, reed-watch-, shuttle-, burler-, and webster-suite.sh for the per-module benches — and collect findings with sandbox/posix/fetch.sh. See docs/sandbox-howto.md for the runbook.

Plugins

plugins/ ships two Claude Code plugins from this marketplace (.claude-plugin/marketplace.json), each its own Go module or skill set:

  • prowler — fetch blocked, restricted, or JS-rendered web pages and output readable markdown, plus cross-repo code search.
  • scribe — code-writing conventions: quality, comments, testing, and Go mechanics.

tools/ holds the repo's own dev tools (deploy, the sandbox driver, and the mdreflow/godocreflow/wordswap text-mechanics sweepers).

Requirements

  • Claude Code
  • Go 1.26+
  • Git 2.42+ (for git worktree add --orphan)
  • tmux (for the orchestration layers; on Windows via psmux)
  • A resolvable GitHub token for selfreport and Publish: set GH_TOKEN or GITHUB_TOKEN, or have the gh CLI installed and authenticated (gh auth login) as a fallback token source — gh is not required when either environment variable is set

Documentation

  • CONSTRAINTS.md — the repo's structural invariants (authoritative).
  • docs/overview.md — architecture, naming, module and shared-lib map.
  • docs/shared-libs/ — the shared infrastructure packages under the modules.
  • manifest/roadmap.md — what's planned and what's shipped.
  • manifest/designs/ — per-module design docs for planned, not-yet-built modules.
  • crucible/crucible, the hand-run serial review+fix loop for hardening a live-substrate module before merge (not documentation of shipped code, so it lives at the repo root, not under docs/).

Per-package documentation lives in each package's own doc.go and is the durable detail for anything shipped; a design doc under manifest/designs/ is deleted once its module ships.

Directories

Path Synopsis
cmd
lyx command
Package main is the cobra root for the lyx CLI.
Package main is the cobra root for the lyx CLI.
testtiming command
Command testtiming runs the repo's Go test suite and prints a wall-clock timing table, so a slow package or test is visible on its own rather than hidden in one combined number.
Command testtiming runs the repo's Go test suite and prints a wall-clock timing table, so a slow package or test is visible on its own rather than hidden in one combined number.
contracts
internal
batcher
Package batcher groups a plan's flat card list into the execution units webster forks each run: a library of batchifier implementations behind the Batcher interface, a name-keyed registry those implementations self-register into, Select, which resolves a batcher by name, and Active, the config entry point callers reach for.
Package batcher groups a plan's flat card list into the execution units webster forks each run: a library of batchifier implementations behind the Batcher interface, a name-keyed registry those implementations self-register into, Select, which resolves a batcher by name, and Active, the config entry point callers reach for.
boardengine
sync.go — the background pusher that backs up the board to the remote.
sync.go — the background pusher that backs up the board to the remote.
boardengine/boardtest
Package boardtest holds Loomyard's cross-cutting ("on-the-side") test suites for the boardengine module: benchmarks and concurrency stress tests.
Package boardtest holds Loomyard's cross-cutting ("on-the-side") test suites for the boardengine module: benchmarks and concurrency stress tests.
buildinfo
Package buildinfo is a stdlib-free leaf existing solely so cmd/lyx and every future standalone CLI package can read the build channel with no cycle risk.
Package buildinfo is a stdlib-free leaf existing solely so cmd/lyx and every future standalone CLI package can read the build channel with no cycle risk.
burlerengine
Package burlerengine runs one review+fix round over an artifact and returns a verdict.
Package burlerengine runs one review+fix round over an artifact and returns a verdict.
clihelp
Package clihelp provides the shared cobra infrastructure used by cmd/lyx and every module's RunCLI seam.
Package clihelp provides the shared cobra infrastructure used by cmd/lyx and every module's RunCLI seam.
discussionparser
Package discussionparser is the SOLE reader of `_lyx/discussion/`'s on-disk format: the decision record's required H2 sections and the support log's existence.
Package discussionparser is the SOLE reader of `_lyx/discussion/`'s on-disk format: the decision record's required H2 sections and the support log's existence.
envsource
Package envsource reads environment variables from a .env file and OS environment.
Package envsource reads environment variables from a .env file and OS environment.
fabriccli
envelope.go declares the helpers every mutating verb handler routes its output through: okWithRecord for the success path, errWithRecord for the failure path, and errConflictsWithRecord for the dedicated conflict-result failure path a merge verb takes when MergeResult.Conflicts is non-empty.
envelope.go declares the helpers every mutating verb handler routes its output through: okWithRecord for the success path, errWithRecord for the failure path, and errConflictsWithRecord for the dedicated conflict-result failure path a merge verb takes when MergeResult.Conflicts is non-empty.
fabricengine
dirtiness.go holds the package's sole `git status --porcelain` probe.
dirtiness.go holds the package's sole `git status --porcelain` probe.
fslink
Package fslink provides a unified cross-platform link primitive that abstracts the differences between Windows junctions and POSIX symlinks.
Package fslink provides a unified cross-platform link primitive that abstracts the differences between Windows junctions and POSIX symlinks.
fsx
githubclient
Package githubclient owns GitHub token resolution, token caching, and construction of an authenticated *github.Client -- nothing else.
Package githubclient owns GitHub token resolution, token caching, and construction of an authenticated *github.Client -- nothing else.
gitignore
Package gitignore manages a single lyx-managed block in .gitignore that is shared across multiple modules.
Package gitignore manages a single lyx-managed block in .gitignore that is shared across multiple modules.
gitkit
Package gitkit is the below-fabric leaf holding git primitives only: MustRun, SeedConfig, HermeticGitEnv, and CopyRepo.
Package gitkit is the below-fabric leaf holding git primitives only: MustRun, SeedConfig, HermeticGitEnv, and CopyRepo.
gitrepo
Package gitrepo provides a typed Repo over a single local git checkout, split across two backends: go-git for local object and ref reads, and internal/gitexec's raw command runner for anything that authenticates to a remote or mutates the working tree.
Package gitrepo provides a typed Repo over a single local git checkout, split across two backends: go-git for local object and ref reads, and internal/gitexec's raw command runner for anything that authenticates to a remote or mutates the working tree.
hubforge
Package hubforge is the repo-wide real-hub fixture factory: it builds every hub fixture through fabriccli.CloneAndWire and never replicates that wiring by hand.
Package hubforge is the repo-wide real-hub fixture factory: it builds every hub fixture through fabriccli.CloneAndWire and never replicates that wiring by hand.
hubgeom
Package hubgeom is the hub-mode adapter that tells engines their geometry: it converts a resolved *lyxcwd.Location into the geometry struct each engine holds, so no engine derives its own coordinates from a Location itself.
Package hubgeom is the hub-mode adapter that tells engines their geometry: it converts a resolved *lyxcwd.Location into the geometry struct each engine holds, so no engine derives its own coordinates from a Location itself.
landingshed
Package landingshed owns landing's two general producers, Publish and Finalize, which any producer list may name -- neither is special-cased by the engine that drives them.
Package landingshed owns landing's two general producers, Publish and Finalize, which any producer list may name -- neither is special-cased by the engine that drives them.
logger
Package logger is a minimal log/slog wrapper shared across lyx's internal packages, extended with a process-wide trace identity, explicit-parent diagnostic spans, and a durable per-process trace-file sink.
Package logger is a minimal log/slog wrapper shared across lyx's internal packages, extended with a process-wide trace identity, explicit-parent diagnostic spans, and a durable per-process trace-file sink.
loomcli
cli.go builds the cobra command tree for the loom module and the RunCLI seam that wires it into the standard io.Writer-based call contract.
cli.go builds the cobra command tree for the loom module and the RunCLI seam that wires it into the standard io.Writer-based call contract.
loomengine
Package loomengine implements loom's own seed-coherence check, CheckSeed: one of the four preconditions a task must meet before it is fit to run, with the other three now internal/preflight's orchestrator-agnostic tier-1/tier-2 checks (worktree geometry, worktree cleanliness, fabric readiness/sync).
Package loomengine implements loom's own seed-coherence check, CheckSeed: one of the four preconditions a task must meet before it is fit to run, with the other three now internal/preflight's orchestrator-agnostic tier-1/tier-2 checks (worktree geometry, worktree cleanliness, fabric readiness/sync).
loomrecipe
Package loomrecipe owns loom's recipe-backed producer-list construction and is the drop-in replacement for loomshed.New.
Package loomrecipe owns loom's recipe-backed producer-list construction and is the drop-in replacement for loomshed.New.
loomshed
Package loomshed owns loom's own eight producer constructors, its seventeen durable row names, its status seeder, and its own cancellation helpers.
Package loomshed owns loom's own eight producer constructors, its seventeen durable row names, its status seeder, and its own cancellation helpers.
lyxcwd
Package lyxcwd is the entry gate that converts "the process started somewhere" into "these are the coordinates of a legal lyx worktree, or here is why this is not one".
Package lyxcwd is the entry gate that converts "the process started somewhere" into "these are the coordinates of a legal lyx worktree, or here is why this is not one".
lyxdirs
Package lyxdirs is a stdlib-free leaf existing solely so internal/configengine, internal/logger, internal/gitkit, internal/fabricengine and every module engine can name the two lyx directory tokens without any of them owning the pair, and without risking the internal/fabricengine -> internal/logger -> internal/lyxcwd import cycle.
Package lyxdirs is a stdlib-free leaf existing solely so internal/configengine, internal/logger, internal/gitkit, internal/fabricengine and every module engine can name the two lyx directory tokens without any of them owning the pair, and without risking the internal/fabricengine -> internal/logger -> internal/lyxcwd import cycle.
mergeresolve
Package mergeresolve merges a source branch into the current pair and, on conflict, resolves it through a fresh, higher-capability LLM session run in a clean context, never a `/model` switch inside a polluted one.
Package mergeresolve merges a source branch into the current pair and, on conflict, resolves it through a fresh, higher-capability LLM session run in a clean context, never a `/model` switch inside a polluted one.
modelspec
Package modelspec parses and resolves the model-spec notation every agent-spawning config in the stack uses to say which LLM runs a role (webster's roles, burler reviewers and judges, loom's producers).
Package modelspec parses and resolves the model-spec notation every agent-spawning config in the stack uses to say which LLM runs a role (webster's roles, burler reviewers and judges, loom's producers).
pattern
Package pattern answers one question for every code-touching lyx agent — is PATTERN active in this worktree, and what should the agent be told? — and returns the role-appropriate directive text, read from a stencil file, to inject into that agent's prompt.
Package pattern answers one question for every code-touching lyx agent — is PATTERN active in this worktree, and what should the agent be told? — and returns the role-appropriate directive text, read from a stencil file, to inject into that agent's prompt.
planparser
Package planparser is the SOLE parser AND SOLE writer of the on-disk plan format written under `_lyx/plan/` (see contracts/specs/loom-plan-spec.md, the pinned spec this package implements).
Package planparser is the SOLE parser AND SOLE writer of the on-disk plan format written under `_lyx/plan/` (see contracts/specs/loom-plan-spec.md, the pinned spec this package implements).
preflight
Package preflight is the orchestrator-agnostic home of the tier-1 and tier-2 preconditions every composing orchestrator — today only loomengine — validates before it runs: worktree geometry, worktree pair cleanliness, and fabric readiness/sync, plus the two cheap predicates and the mode resolver a standalone-capable CLI's pre-run consults before every command.
Package preflight is the orchestrator-agnostic home of the tier-1 and tier-2 preconditions every composing orchestrator — today only loomengine — validates before it runs: worktree geometry, worktree pair cleanliness, and fabric readiness/sync, plus the two cheap predicates and the mode resolver a standalone-capable CLI's pre-run consults before every command.
preflightshed
Package preflightshed owns the general Preflight producer -- a content-free shedengine.ShedProducer wrapping internal/preflight.Check -- which any producer list may name, the same way internal/landingshed frames Publish and Finalize as producers "shared by reference" rather than owned by one product.
Package preflightshed owns the general Preflight producer -- a content-free shedengine.ShedProducer wrapping internal/preflight.Check -- which any producer list may name, the same way internal/landingshed frames Publish and Finalize as producers "shared by reference" rather than owned by one product.
reedengine
Package reedengine is the domain kernel for lyx's tmux window manager: the tmux subprocess overlay, strand bookkeeping, persisted state, config, and (in the operations layer) the lifecycle verbs that compose them.
Package reedengine is the domain kernel for lyx's tmux window manager: the tmux subprocess overlay, strand bookkeeping, persisted state, config, and (in the operations layer) the lifecycle verbs that compose them.
reedengine/render
Package render owns the closed display vocabulary and the deterministic Rules(strands, box, params) -> (layout, focus) function that turns a set of strands into a tmux window_layout string.
Package render owns the closed display vocabulary and the deterministic Rules(strands, box, params) -> (layout, focus) function that turns a set of strands into a tmux window_layout string.
selfreportcli
Package selfreportcli provides the cobra command tree for filing LoomYard bugs and enhancements as GitHub issues directly from lyx.exe.
Package selfreportcli provides the cobra command tree for filing LoomYard bugs and enhancements as GitHub issues directly from lyx.exe.
selfreportengine
Package selfreportengine provides the domain kernel for filing GitHub issues via githubclient's authenticated go-github client.
Package selfreportengine provides the domain kernel for filing GitHub issues via githubclient's authenticated go-github client.
shedadapters
Package shedadapters holds the four shedengine.ShedProducer adapters that let a Shed-built product drive shuttle, Webster, one burlerengine round, and the generic review-gate Bouncer as ordinary producers in its own flat producer list.
Package shedadapters holds the four shedengine.ShedProducer adapters that let a Shed-built product drive shuttle, Webster, one burlerengine round, and the generic review-gate Bouncer as ordinary producers in its own flat producer list.
shedbuild
Package shedbuild owns the recipe file format: decoding a recipe document into a Recipe and assembling a Recipe plus a caller-supplied shedrecipe.Env into the []shedengine.ProducerDef that shedengine.Shed already consumes unchanged.
Package shedbuild owns the recipe file format: decoding a recipe document into a Recipe and assembling a Recipe plus a caller-supplied shedrecipe.Env into the []shedengine.ProducerDef that shedengine.Shed already consumes unchanged.
shedcheck
Package shedcheck is an authoring-time structural analysis of an assembled shedengine producer graph: it walks the OnDone/OnStuck routing the same way shedengine.Run would, without ever calling a producer, and reports every structural defect it finds.
Package shedcheck is an authoring-time structural analysis of an assembled shedengine producer graph: it walks the OnDone/OnStuck routing the same way shedengine.Run would, without ever calling a producer, and reports every structural defect it finds.
shedengine
Package shedengine is a generic outer phase-FSM: it walks one flat, ordered list of producers, with no predefined slots, honoring resume, crash-recovery, and pause uniformly at producer granularity.
Package shedengine is a generic outer phase-FSM: it walks one flat, ordered list of producers, with no predefined slots, honoring resume, crash-recovery, and pause uniformly at producer granularity.
shedrecipe
Package shedrecipe owns the engine registry: the name to shedengine.ShedProducer-constructor mapping a future recipe loader resolves each row's Engine field against.
Package shedrecipe owns the engine registry: the name to shedengine.ShedProducer-constructor mapping a future recipe loader resolves each row's Engine field against.
shuttleengine
Package shuttleengine runs one LLM agent as an interactive session and returns its result.
Package shuttleengine runs one LLM agent as an interactive session and returns its result.
shuttleengine/claudeengine
Package claudeengine is the Claude adapter behind shuttleengine.Engine: all Claude-specific knowledge — CLI flags, the settings.json hook schema, TUI startup/trust markers, and pane key choreography — lives here and nowhere else.
Package claudeengine is the Claude adapter behind shuttleengine.Engine: all Claude-specific knowledge — CLI flags, the settings.json hook schema, TUI startup/trust markers, and pane key choreography — lives here and nowhere else.
standalonegeom
Package standalonegeom is the told-mode sibling of internal/hubgeom: it builds engine geometry structs from told strings alone, never resolving cwd and never reading the environment.
Package standalonegeom is the told-mode sibling of internal/hubgeom: it builds engine geometry structs from told strings alone, never resolving cwd and never reading the environment.
standalonestate
Package standalonestate is a stdlib-only leaf that derives a per-target-directory hash8 and per-OS state directory, so every standalone CLI package can import it with no cycle risk.
Package standalonestate is a stdlib-only leaf that derives a per-target-directory hash8 and per-OS state directory, so every standalone CLI package can import it with no cycle risk.
state
Package state provides generic locked typed JSON I/O for persistent state, and states the rule that governs a locked-JSON read-modify-write: it must hold one lock across both the read and the write.
Package state provides generic locked typed JSON I/O for persistent state, and states the rule that governs a locked-JSON read-modify-write: it must hold one lock across both the read and the write.
stencilstore
Package stencilstore owns the entire stencil lifecycle -- seeding, hash-stamping, edit detection, reading, and validation -- against a caller-supplied absolute stencils directory.
Package stencilstore owns the entire stencil lifecycle -- seeding, hash-stamping, edit detection, reading, and validation -- against a caller-supplied absolute stencils directory.
summaryparser
Package summaryparser is the sole declarer of the final-summary artifact's filename and the sole parser of its format.
Package summaryparser is the sole declarer of the final-summary artifact's filename and the sole parser of its format.
tokenvocab
Package tokenvocab is the shared token vocabulary for prompt/template rendering across lyx: today reed's header text pipeline, later loom's prompt templates.
Package tokenvocab is the shared token vocabulary for prompt/template rendering across lyx: today reed's header text pipeline, later loom's prompt templates.
treadleengine
Package treadleengine is the generalized round-loop engine: it spawns a round via a caller-supplied RoundRunner each iteration, gates convergence (llm-verdict / command / both), runs an ephemeral progress judge against a milestone-capped round ladder, and persists per-round state for crash/pause resume — all of it behind a seam, so a consumer supplies a round-runner without duplicating any of this machinery.
Package treadleengine is the generalized round-loop engine: it spawns a round via a caller-supplied RoundRunner each iteration, gates convergence (llm-verdict / command / both), runs an ephemeral progress judge against a milestone-capped round ladder, and persists per-round state for crash/pause resume — all of it behind a seam, so a consumer supplies a round-runner without duplicating any of this machinery.
webstercli
awaitbatch.go implements the `await-batch` webster verb: the bounded long-poll Master calls between forking a batch's implementer and recording it.
awaitbatch.go implements the `await-batch` webster verb: the bounded long-poll Master calls between forking a batch's implementer and recording it.
websterengine
Package websterengine is the domain kernel behind webster, a fork-based implementer loop: instead of spawning a fresh reed/tmux strand per batch, one long-lived Master session reads the codebase and the whole plan once, then forks one implementer per execution batch in-session (Claude Code's Agent tool, subagent_type "fork"), sequentially — one fork at a time, one worktree — in an order sequence.go derives from the cards' own declared dependencies, not the plan's declared order.
Package websterengine is the domain kernel behind webster, a fork-based implementer loop: instead of spawning a fresh reed/tmux strand per batch, one long-lived Master session reads the codebase and the whole plan once, then forks one implementer per execution batch in-session (Claude Code's Agent tool, subagent_type "fork"), sequentially — one fork at a time, one worktree — in an order sequence.go derives from the cards' own declared dependencies, not the plan's declared order.
tools
deploy command
Command deploy builds lyx and installs it into a directory on PATH.
Command deploy builds lyx and installs it into a directory on PATH.
godocreflow command
Command godocreflow reflows the text of Go doc-comment blocks -- file-level header comments, package doc comments, and comments immediately preceding an exported declaration -- to semantic line breaks (one sentence per line, plus a break at an internal independent-clause boundary), per the golang-comments skill's "Line-wrap style" section.
Command godocreflow reflows the text of Go doc-comment blocks -- file-level header comments, package doc comments, and comments immediately preceding an exported declaration -- to semantic line breaks (one sentence per line, plus a break at an internal independent-clause boundary), per the golang-comments skill's "Line-wrap style" section.
internal/devbin
Package devbin locates the repository root and the derived `.dev-bin` directory used to install and resolve dev/test builds of lyx, keeping that derivation in exactly one place in the codebase.
Package devbin locates the repository root and the derived `.dev-bin` directory used to install and resolve dev/test builds of lyx, keeping that derivation in exactly one place in the codebase.
mdreflow command
Command mdreflow is a one-shot (and repeatable) repo sweep tool for the mill:markdown skill's semantic-line-break rule: reflow markdown prose and list-item paragraphs to one-sentence-per-line, with extra breaks at internal clause boundaries (semicolon, or comma+coordinating- conjunction+explicit-subject).
Command mdreflow is a one-shot (and repeatable) repo sweep tool for the mill:markdown skill's semantic-line-break rule: reflow markdown prose and list-item paragraphs to one-sentence-per-line, with extra breaks at internal clause boundaries (semicolon, or comma+coordinating- conjunction+explicit-subject).
sandbox command
wordswap command
Command wordswap performs a case-preserving whole-token substitution of one word for another across files of any language: identifiers, comments, string literals, shell variables, and markdown prose all substitute through the same mechanism.
Command wordswap performs a case-preserving whole-token substitution of one word for another across files of any language: identifiers, comments, string literals, shell variables, and markdown prose all substitute through the same mechanism.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL