logicsrc/docs
Anthony Ettinger 9ae7ad8962
OpenFleet reference implementation: @logicsrc/openfleet, logicsrc fleet, and Claude Code hooks (#185)
* OpenFleet reference implementation: @logicsrc/openfleet 0.1.0 and logicsrc fleet

Ship what docs/openfleet.md describes. The new workspace package holds the
record (write once, never overwrite, 0600), the ledger (append-only JSON
Lines, merged across ledger*.jsonl by at), the ceiling rules (whole fleet
ceiling, narrowed swarm keys, a merge that never widens, refusals by key),
claiming and deriving exactly as the spec's "Claiming and deriving" and
rule 13, and fold(), which turns any $OPENFLEET_HOME plus the engine
rosters into the tree the landing page shows.

logicsrc fleet open|cap|tree|stop|log are the sysop's verbs, every one with
--json. open and cap exit 4 when OPENFLEET_MEMBER is set; stop exits 4
outside the caller's subtree, ends nested swarms first, goes through each
member's own engine (claude stop, moshcode herd kill, tmux kill-pane, a
signal for claude-p) and writes one swarm.end per swarm. tree reads claude
agents --json --all and ~/.moshcode/herd/sessions.json when it can, draws
recordless sessions as roster roots of the implicit fleet, and writes
member.end lost for a recorded member its engine no longer lists.

Claude Code takes part through hooks: logicsrc fleet hooks install merges
SessionStart, UserPromptSubmit, PreToolUse, Stop and SessionEnd into
~/.claude/settings.json without clobbering it, and logicsrc fleet hook
<Event> runs each one. SessionStart claims, derives or writes a root record
and hands the member its variables through CLAUDE_ENV_FILE; UserPromptSubmit
checks the ceiling with the permission mode the engine reports and writes
member.start, or refuses the first prompt with exit 2 and ceiling.refuse;
PreToolUse denies an edit outside piece.owns; Stop and SessionEnd write
member.end. A hand-started root takes the engine's reported approvals
before member.start, since the command line only guesses them. Hooks
never fail the engine: everything is caught and logged to hooks.log.

The spec and the landing page now say what ships, keep Status 0.1, and
record the two verified Claude Code limits: a background job dispatched from
claude agents gets no launcher environment, and OPENFLEET_* exported at
SessionStart reach the member's tools but not later hooks, so hooks key on
session_id through $OPENFLEET_HOME/sessions/<session_id>.json. PRD 0008
covers the work. CLI 0.2.1 -> 0.3.0; build and build:cli chains build the
package before the CLI; README and docs/cli.md list the group.

Tests: 95 in the package (record, ledger merge, every narrower case, the
worked example's claim and derive, the folded tree, hook install
idempotence, each hook handler including the exit-2 refusal and the
PreToolUse deny, every verb with fake deps) and 4 in the CLI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZV4zJ2pDZLNN3kE5jFCmV

* OpenFleet fix round: rebuild the ceiling from the ledger, once-markers, rule 6 in tree, lost only for what a roster can hold

The review of the reference implementation against moshcode found the two
readers disagreeing on the same files. This round applies the shared
rulings so both sides read a ledger the same way.

Ceiling (R-A, R-B, R-C, R1, R6, R10, R15, R17): memberCeiling rebuilds the
effective ceiling from the ledger on every read. The latest fleet-target
fleet.cap (else fleet.open, else the implicit fleet's) replaces the copy in
a record, so a sysop's widening cap reaches running members; then each
swarm.spawn narrowing down the path, then swarm caps last. In the implicit
fleet a parentless record's own approvals enters at the root; a ceiling a
writer left without the key is never read as native, and startMember fills
it with the engine's word while the record is unclaimed. A fleet.open or
cap with no hosts means the host it was written on (R23).

Once-markers (R-G, R28): member.start, member.end and swarm.end each take
an exclusive create under fleets/<fleet>/marks/<event>.<id> before the
append; a lost end takes <id>.lost so a real end can still supersede it.
The hooks let a real end follow a lost line (R9).

tree (R-F, R20): run by the sysop it enforces rule 6, stopping a member
past its effective until with state timeout and the members of a swarm or
fleet at its budget with state budget, then writes swarm.end for each swarm
touched once it is complete. An agent's tree stops nothing. lost is written
only for a member its engine's roster can hold: a claude-code background job
(8-hex member or session) or a moshcode pane, never an interactive session
claude agents does not list (R-E, R3, R14). A nested swarm is drawn under
the member that spawned it and its row shows the effective ceiling (R25).

stop and cap (R-D, R-H, R22, R27): swarm.end is written only once every
member and every nested swarm has an end line that counts; an engine that
will not end a member leaves it without an end line and the verb exits
non-zero. claude stop takes the job id: the member of a background job,
else the first eight characters of a session UUID; an interactive session
with no job id cannot be stopped and the tool says so. cap on a swarm
refuses a key that would widen. A derived claude-code job is named by its
job id and carries no pid.

Also: R-I (endMember ends only the engine-minted swarm of one), R35 (a
derived record's guessed approvals corrected at UserPromptSubmit), R32
(the UserPromptSubmit hook passes only exit 2 through), R31 (package
README), R36 (rule 13 says the launcher test is unimplemented in 0.1),
docs and PRD 0008 updated for lost, rule 6 and the markers. 113 openfleet
tests, 93 CLI tests, contract green.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZV4zJ2pDZLNN3kE5jFCmV

* openfleet hooks: no member.end for a member that never started

A first prompt refused by the ceiling still lets the session wind down through Stop and SessionEnd; those handlers now write nothing when the ledger holds no member.start for the member, so a refused member is never drawn as done.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01RZV4zJ2pDZLNN3kE5jFCmV

* logicsrc-mcp test: the next free PRD id is 0009 now that PRD 0008 exists

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01RZV4zJ2pDZLNN3kE5jFCmV

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 10:58:55 +00:00
..
opencontext Add the LogicSRC OpenContext specification (#132) 2026-08-09 11:46:11 -07:00
opencreds Add the LogicSRC OpenCreds specification (#140) 2026-08-29 04:11:38 -07:00
openprd Add Tech Stack and Monetization sections to OpenPRD (0.3) (#144) 2026-09-06 16:50:11 -07:00
openstream/reports docs: OpenStream benchmark reports, published per release (#150) 2026-09-12 06:23:46 -07:00
openswarm OpenServer 0.2: the provider says how to install its CLI (#171) 2026-09-12 21:46:01 -07:00
agent-screening.md Add AgentByte screening plugin spec 2026-06-06 15:54:08 +00:00
agentad-marketplace.md feat(agentad): AgentAd Marketplace PRD + reference exchange (M5) 2026-07-01 10:29:36 +00:00
agentad.md feat(agentad): AgentAd Marketplace PRD + reference exchange (M5) 2026-07-01 10:29:36 +00:00
agentgit.md Add AgentGit M1: agent-native git layer over a Forgejo backend 2026-06-14 15:15:06 +00:00
agentstack.md feat(agentstack): add @logicsrc/agentstack coordination module (#5) 2026-06-10 16:39:32 -07:00
ans-sdk.md docs(ans): spec the @logicsrc/ans TypeScript SDK 2026-06-24 14:41:00 +00:00
arcade.md Add waiting arcade MVP 2026-06-06 22:09:22 +00:00
asdlc.md Add ASDLC, the Agentic Software Development Lifecycle 2026-09-06 15:02:31 +00:00
cli.md OpenFleet reference implementation: @logicsrc/openfleet, logicsrc fleet, and Claude Code hooks (#185) 2026-09-13 10:58:55 +00:00
communication-accounts.md Ship OpenFleet contracts and the OpenWall draft proposal (#177) 2026-09-13 00:57:45 -07:00
config.md fix(credentials): one vault per user, in the config dir (#119) 2026-07-31 22:53:17 -07:00
credential-sharing.md Add SSH keys and config to credential sharing (#139) 2026-08-13 17:03:00 -07:00
data-model.md Merge master; OpenFleet keeps its name, PR 177's rental descriptor becomes OpenRental 2026-09-13 08:45:33 +00:00
openabtest.md Add OpenABTest draft experiment and accounting contracts (#180) 2026-09-13 02:17:35 -07:00
openaccess.md OpenAccess 0.1: OAuth 2.1 with a grant you can carry (#158) 2026-09-12 12:26:15 -07:00
openaffiliate.md OpenAffiliate 0.1: one file a merchant serves about the commission it pays (#166) 2026-09-12 19:36:59 -07:00
openapi.yaml Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
openbandwidth.md docs: OpenCPU, OpenMemory, OpenGPU and OpenBandwidth, the resources of a server purchase (#163) 2026-09-12 18:59:05 -07:00
openbroadcast.md docs: OpenBroadcast and OpenGuest, the broadcaster-and-guest framework as OpenProfile.md sections (#168) 2026-09-12 20:30:42 -07:00
openconnection.md OpenConnection: a setup token you paste, a bridge that honours it (#174) 2026-09-12 22:22:39 -07:00
opencontext.md Add the LogicSRC OpenContext specification (#132) 2026-08-09 11:46:11 -07:00
opencoupon.md docs: OpenCoupon and OpenRecipe.md, the first two niche specs (#165) 2026-09-12 19:16:34 -07:00
opencpu.md docs: OpenCPU, OpenMemory, OpenGPU and OpenBandwidth, the resources of a server purchase (#163) 2026-09-12 18:59:05 -07:00
opencreds.md Add the LogicSRC OpenCreds specification (#140) 2026-08-29 04:11:38 -07:00
opendisk.md OpenFile and OpenDisk carry OpenServer 0.2's developer block, and OpenFile names fi1zes.com (#173) 2026-09-12 22:05:06 -07:00
openfile.md OpenFile and OpenDisk carry OpenServer 0.2's developer block, and OpenFile names fi1zes.com (#173) 2026-09-12 22:05:06 -07:00
openfleet.md OpenFleet reference implementation: @logicsrc/openfleet, logicsrc fleet, and Claude Code hooks (#185) 2026-09-13 10:58:55 +00:00
opengpu.md docs: OpenCPU, OpenMemory, OpenGPU and OpenBandwidth, the resources of a server purchase (#163) 2026-09-12 18:59:05 -07:00
openguest.md docs: OpenBroadcast and OpenGuest, the broadcaster-and-guest framework as OpenProfile.md sections (#168) 2026-09-12 20:30:42 -07:00
openjob.md docs: OpenJob and OpenResume.md (#148) 2026-09-08 16:16:05 -07:00
openmcp.md logicsrc CLI 0.2.0: every LogicSRC tool is a word after logicsrc (#157) 2026-09-12 11:16:40 -07:00
openmemory.md docs: OpenCPU, OpenMemory, OpenGPU and OpenBandwidth, the resources of a server purchase (#163) 2026-09-12 18:59:05 -07:00
openontology-governance.md feat(openontology): implement OpenOntology Phase 0 + local engine and CLI (#99) 2026-07-26 02:10:13 -07:00
openontology-interoperability.md feat(openontology): Phase 2 + Phase 3 — storage, REST/SSE, MCP, RDF/SHACL, adapters, TUI, explorer (#101) 2026-07-28 05:10:33 -07:00
openontology.md feat(openontology): Phase 2 + Phase 3 — storage, REST/SSE, MCP, RDF/SHACL, adapters, TUI, explorer (#101) 2026-07-28 05:10:33 -07:00
openprd.md Add Tech Stack and Monetization sections to OpenPRD (0.3) (#144) 2026-09-06 16:50:11 -07:00
openprofile.md OpenProfile 0.3: Gender and Voice in the identity block (#172) 2026-09-12 21:50:52 -07:00
openrecipe.md docs: OpenCoupon and OpenRecipe.md, the first two niche specs (#165) 2026-09-12 19:16:34 -07:00
openrental.md Merge master; OpenFleet keeps its name, PR 177's rental descriptor becomes OpenRental 2026-09-13 08:45:33 +00:00
openresume.md docs: OpenJob and OpenResume.md (#148) 2026-09-08 16:16:05 -07:00
opensaas.md OpenSaaS 0.1: one file a subscription service serves about the way in and the way out (#176) 2026-09-12 22:29:24 -07:00
openserver.md OpenServer 0.2: the provider says how to install its CLI (#171) 2026-09-12 21:46:01 -07:00
opensite.md OpenSite: one record about a page or a site, the card a reader would draw (#175) 2026-09-12 22:30:41 -07:00
openspec-comparison.md feat(agentstack): add @logicsrc/agentstack coordination module (#5) 2026-06-10 16:39:32 -07:00
openstream.md docs: OpenStream benchmark reports, published per release (#150) 2026-09-12 06:23:46 -07:00
openswarm.md Merge master; OpenFleet keeps its name, PR 177's rental descriptor becomes OpenRental 2026-09-13 08:45:33 +00:00
openthreat.md docs: OpenThreat, one file a security tool serves about what it found in the open (#167) 2026-09-12 20:30:22 -07:00
openwall.md Ship OpenFleet contracts and the OpenWall draft proposal (#177) 2026-09-13 00:57:45 -07:00
openwebring.md OpenWebring: a webring that says who made it (#178) 2026-09-13 01:27:27 -07:00
permissions.md Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
plugins.md Add AgentGit M1: agent-native git layer over a Forgejo backend 2026-06-14 15:15:06 +00:00
positioning.md Add credential sharing openspec 2026-06-06 18:47:41 +00:00
roadmap.md Add communication account plugin scaffolds 2026-06-09 10:02:07 +00:00
tui.md Add waiting arcade MVP 2026-06-06 22:09:22 +00:00