From ef9dcf33c9994828c3101b54694e3d2c987aa215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Bene=C5=A1?= Date: Wed, 28 Oct 2026 01:20:42 +0000 Subject: [PATCH] Harness spec: conformance names the server's modules; python's limits instructions.json and fs_access.json pointed at services/files/*.py, which LLeMbas never had: the chain is services/workspace.py, the view services/fs.py with security/access.py. context.json no longer says "to be written". python's {{seconds}}, {{memory}}, {{output}} and {{packages}} are implementation-defined; their descriptions record what LLeMbas 2.0 fills (30 s, 512 MB, 20,000 characters, the standard library only). Co-Authored-By: Claude Opus 5.5 --- harness/conformance/fs_access.json | 2 +- harness/conformance/instructions.json | 2 +- harness/tools/python.json | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/harness/conformance/fs_access.json b/harness/conformance/fs_access.json index 05d71ea..b23eaaf 100644 --- a/harness/conformance/fs_access.json +++ b/harness/conformance/fs_access.json @@ -1,5 +1,5 @@ { - "about": "The file system as one session sees it (filesystem.md): `tree` (paths; a directory ends with `/`, parents are implied), `mounts` (directories that are forge repositories), `grants` (path → level none/ro/stage/commit, covering everything below; the most specific wins; none by default), `floor` (path → the most a session may have there; the most specific applies), `cwd` (the start directory, default `/`), and one `op` on `path`: `level` (the session's level there, and whether it is a passage: at none with something granted below), `list` (the entries the session sees: directories and mounts with `/`, a mount ` [mount]`, an entry at ro in a writable directory ` [read-only]`; directories first, then by name), `read`, `write` (a file), `mkdir`, `rm`, `commit`. Answers `{ok: true}`, `{entries}`, `{level, passage}` or `{error}` with the exact text, naming the resolved absolute path. A path the session cannot see is answered by what the model already knows: by its nearest ancestor that is visible (No such file or directory) or a passage (Access denied) — so a hidden entry and a missing one read the same; creating a name taken by an entry at none is denied. LLeMbas: services/files/view.py (to be written); CLI: not run until it has a view of its own (an agent's disk is one level for the whole working directory).", + "about": "The file system as one session sees it (filesystem.md): `tree` (paths; a directory ends with `/`, parents are implied), `mounts` (directories that are forge repositories), `grants` (path → level none/ro/stage/commit, covering everything below; the most specific wins; none by default), `floor` (path → the most a session may have there; the most specific applies), `cwd` (the start directory, default `/`), and one `op` on `path`: `level` (the session's level there, and whether it is a passage: at none with something granted below), `list` (the entries the session sees: directories and mounts with `/`, a mount ` [mount]`, an entry at ro in a writable directory ` [read-only]`; directories first, then by name), `read`, `write` (a file), `mkdir`, `rm`, `commit`. Answers `{ok: true}`, `{entries}`, `{level, passage}` or `{error}` with the exact text, naming the resolved absolute path. A path the session cannot see is answered by what the model already knows: by its nearest ancestor that is visible (No such file or directory) or a passage (Access denied) — so a hidden entry and a missing one read the same; creating a name taken by an entry at none is denied. LLeMbas: services/fs.py (the view) with security/access.py (levels and grants); CLI: not run until it has a view of its own (an agent's disk is one level for the whole working directory).", "cases": [ { "tree": [ diff --git a/harness/conformance/instructions.json b/harness/conformance/instructions.json index 5f8a306..c0a2d05 100644 --- a/harness/conformance/instructions.json +++ b/harness/conformance/instructions.json @@ -1,5 +1,5 @@ { - "about": "The instruction files a session starts with (filesystem.md, Instruction files, stacked): `files` that exist, the `boundary` and the `start` directory (outside the boundary: read as the boundary), and `grants` as in fs_access (absent: everything readable). From the boundary down to the start directory, outermost first, each directory gives the first of AGENTS.md, CLAUDE.md that is a file the session can read — never both; a file at none (in a passage, or taken away) is not loaded and the walk goes on below it. The answer is the loaded paths, in order. The CLI's global AGENTS.md, before the chain, and its configured `instructions`, after it, are not part of these cases. LLeMbas: services/files/instructions.py (to be written); CLI: prompt/assemble.ts instructionFiles (today: the nearest file only — 3.0.0 changes it).", + "about": "The instruction files a session starts with (filesystem.md, Instruction files, stacked): `files` that exist, the `boundary` and the `start` directory (outside the boundary: read as the boundary), and `grants` as in fs_access (absent: everything readable). From the boundary down to the start directory, outermost first, each directory gives the first of AGENTS.md, CLAUDE.md that is a file the session can read — never both; a file at none (in a passage, or taken away) is not loaded and the walk goes on below it. The answer is the loaded paths, in order. The CLI's global AGENTS.md, before the chain, and its configured `instructions`, after it, are not part of these cases. LLeMbas: services/workspace.py chain; CLI: prompt/assemble.ts instructionChain.", "cases": [ { "files": [ diff --git a/harness/tools/python.json b/harness/tools/python.json index 9eca9db..829cd81 100644 --- a/harness/tools/python.json +++ b/harness/tools/python.json @@ -15,10 +15,10 @@ "llembas": [] }, "variables": { - "packages": "the packages the instance provides beyond the standard library, as a list, or \"none\"", - "seconds": "the time limit of one call, in seconds", - "memory": "the memory limit of one call, with its unit", - "output": "how much printed output comes back, with its unit" + "packages": "the packages the instance provides beyond the standard library, as a list, or \"none\" — implementation-defined; LLeMbas 2.0: none (the standard library only)", + "seconds": "the time limit of one call, in seconds — implementation-defined; LLeMbas 2.0: 30", + "memory": "the memory limit of one call, with its unit — implementation-defined; LLeMbas 2.0: 512 MB", + "output": "how much printed output comes back, with its unit — implementation-defined; LLeMbas 2.0: 20,000 characters" }, "description": "Run Python for calculations and for working with files — parse JSON or CSV, transform text, compute. It runs in the user's browser (Pyodide), sandboxed: no network, no shell, no packages beyond the standard library and these: {{packages}}. Returns what the code printed and the value of its last expression.\n\n- `files` are copied in before the run, at the same paths, from what this session can read.\n- Files the code writes come back only when listed in `save`: each is written as the write tool would write it, with this session's permissions.\n- At most {{seconds}} seconds and {{memory}} of memory per call; printed output past {{output}} is cut.\n- Every call starts fresh: nothing is kept between calls.", "parameters": {