ouroboros/docs
Ouroboros 49421ec165 fix(v6.61.3): project-room chat lens — the room's chat lane looks at the project folder
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.
2026-07-09 16:39:20 +03:00
..
ARCHITECTURE.md fix(v6.61.3): project-room chat lens — the room's chat lane looks at the project folder 2026-07-09 16:39:20 +03:00
CHECKLISTS.md feat: release v6.54.0 follow-up audit hardening 2026-07-01 14:50:35 +03:00
CREATING_SKILLS.md skills: remove bundled weather skill from core (now OuroborosHub-only) 2026-06-25 06:45:37 +03:00
DEPLOYMENT.md v5.8.3-rc.2: centralize state helpers 2026-05-08 02:12:09 +03:00
DEVELOPMENT.md feat(v6.61.0): adaptive planning — plan_class, tiered reviewer docs, task-fit scouts (Phase 5) 2026-07-09 03:26:02 +03:00