mirror of
https://github.com/razzant/ouroboros.git
synced 2026-08-11 11:43:18 +00:00
The robot-room incident (first live folder-room, 2026-07-09): the owner attached
/Users/anton/robot and asked "what is this project about?"; the chat lane's
list_files(".") resolved against the SYSTEM REPO (the conversation lane runs in
the default profile whose active_workspace is the self repo), and the agent
narrated the Ouroboros tree as the project's contents. Root cause class:
affordance-context incoherence — the room fact named the folder while the tool
surface contradicted it, and tools beat facts.
The lens (keyed STRICTLY on the direct-chat lane + no own workspace + a
host-verified room dir, so pooled/workspace/subagent/headless tasks, benchmarks,
and file-less rooms are byte-identical to before):
- tool_access.project_room_lens_dir — the single structural key; agent.py
injects the host-verified `_project_room_dir` at task build from
workspace_admission.room_chat_lens_dir (chat-lane sibling of the promote
resolver: lighter — no git requirement for reads; a set-but-broken working_dir
becomes a LOUD note, never a silent repo fallback).
- READS re-point at the room folder: read_file (absolute display path names the
resolution), list_files (same JSON-array shape), search_code, query_code.
Confinement: relative paths resolve INSIDE the room folder (traversal clamps
to the room root); the self repo stays one EXPLICIT root away
(root="system_repo" — the mario-room pattern of deliberately reading Ouroboros
internals keeps working).
- Default shell cwd = the room folder (evidence: no historical room task relied
on the repo default — room shell always used absolute paths/explicit cwd; and
a reads-folder/shell-repo split would send `pytest` to the self-repo suite).
The FIRST default-cwd command disclosed its room cwd (one-shot per task);
explicit cwds are untouched, the repo remains an allowed root.
- Default-root WRITES refuse with typed ROOM_WRITE_VIA_TASK (write_file,
edit_text, default-cwd claude_code_edit — extracted to
_room_default_cwd_edit_block to respect the function-size gate): with reads
lensed, a silent system-repo write would be a read/write split trap. Mutations
stay with promoted tasks (the one-writer lease is never contended by the chat
lane); vcs tools / commit machinery remain self-repo control-plane by design.
- The room fact (context.py) states the REAL affordances and derives from the
SAME resolver as the tool lens, so rule and surface cannot diverge; the
filesystem affordance map names project_room_dir and the lensed default cwd.
- Coherence invariant pinned: tests cover lens keying legs, folder reads +
system_repo escape hatch, traversal confinement, write refusals, shell default
+ explicit cwds + one-shot note, affordance map, resolver notes, and the
context-fact/lens-state match; file-less rooms and workspace tasks pinned
byte-identical.
Sidebar: the New Project "+" no longer overlaps the projects count — the
Projects header toggle reserves right-side space for the absolutely-positioned
button (a button cannot nest in the toggle button); overlap was invisible on
fresh installs (0 projects → empty badge) which is how the v6.59 browser pass
missed it. Verified geometrically with a seeded 8-project badge.
Tests: full suite 5207 passed / 0 failed; ruff F clean.
|
||
|---|---|---|
| .. | ||
| ARCHITECTURE.md | ||
| CHECKLISTS.md | ||
| CREATING_SKILLS.md | ||
| DEPLOYMENT.md | ||
| DEVELOPMENT.md | ||