Harness spec: one path form, the file tools' texts, the list tree, skills

filesystem.md, spec 3.0.0-draft, and the CLI made to match:

- Paths: absolute in every answer except a result's bracket (context.md),
  which keeps the call's path. glob and grep now give full paths.
- A missing file is `No such file or directory: {path}` for every tool
  that needs it, with no hint after it: in a chat a hidden file must read
  as a missing one. The CLI's "does not exist. Use write to create it." and
  "Write it first." are gone; an edit of a directory is `Is a directory`,
  glob over a file `Not a directory`.
- write/edit refusals, exactly: "{path} exists and has not been read in
  this session. Read it first." and "{path} changed since you last read
  it. Read it again before changing it." (no "on disk"), absolute path.
- A listing sorts names in code-point order; `list` with a depth is a
  tree indented two spaces a level, marks as in a single listing, cut at
  400 lines with a line saying so.
- Skills: where they are found and in what order on each side (the
  session's own place first, the person's next, what is shared last), and
  the name rule ^[a-z0-9][a-z0-9-]{0,63}$ that skill_manage checks. The
  CLI no longer makes names with _ or .; such skills still load.

README's 3.0.0 notes say so; CHANGELOG [Unreleased].

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HomerandClaude Opus 5.5 committed 2026-10-28 01:20:42 +00:00
1 parent 4ca6af12b1
commit b1dcaded72
15 files changed
+167 -41

No files matched your search

+9 -4
View File
@@ -95,18 +95,23 @@ this design.
- **`filesystem.md`** — the file system as a contract: paths, the kinds `dir`, `file`, `mount`, the
levels `none`, `ro`, `stage`, `commit`, grants and floors, the exact error texts, and the rule
that a granted path under one that is not is reached only by its full path, its ancestor denied
for reading and writing and never listed. Search results and **indexing by tokens** (at most 480
for reading and writing and never listed. Paths absolute in every answer but a result's bracket;
one `No such file or directory` for every tool, the `write`/`edit` refusals' texts, the `list`
tree; where skills are found and in what order, and the name rule
(`^[a-z0-9][a-z0-9-]{0,63}$`). Search results and **indexing by tokens** (at most 480
tokens a piece, 64 repeated; a piece the embedder refuses is split, never dropped).
**Instruction files stack** from the boundary down to the start directory, outermost first, one
per directory (`AGENTS.md`, else `CLAUDE.md`), none from a directory the session cannot read —
the CLI took only the nearest one before. `blocks/workspace.md` (LLeMbas) tells a chat's model its
view.
- **`context.md`** — context hygiene, insert-time only, nothing sent ever rewritten: every result
has an id (`#a3f2`); a read carries its lines and content hash; an unchanged re-read, or a range
inside an earlier unchanged read, is a stub; output over 400 lines or 40,000 characters keeps its
has an id (`#0001`: its number in the session, in hex, at least 4 digits); a read carries its
lines and content hash, under the path as the call gave it; an unchanged re-read, or a range
inside an earlier unchanged read, is a stub — naming only a result in the request being built; output over 400 lines or 40,000 characters keeps its
head and tail with `[N lines elided, full output #id]`; `recall` shows any stored result; edits
answer with their diff; the same listing or search with the same result is a stub; compaction
adds a table of reads and empties the dedupe table; earlier reasoning is left to the chat
adds a table of the reads it covers (those since the previous compaction, in turns still in the
history) and empties the dedupe table; earlier reasoning is left to the chat
template. `loop.json` `context` holds the texts and numbers, `blocks/context.md` tells the model.
- **`acp.md`**: **link protocol 3** — LLeMbas 2.0 and LLeMbas CLI 2.0 speak it alone, and a 1.x peer
and a 2.0 one refuse each other, each saying what to update (discovery's `protocol` is raised to 3