6.7 KiB
Project Workspace Contract
OpenRig's Project TUI is a file-backed view over a workspace root. The folder shape is intentionally simple so humans and agents can create or repair it without daemon-internal knowledge.
This subtree is part of the wider OpenRig Instance Layout. The instance initializer delegates these exact workspace bytes to this owner.
Default Shape
rig config init-workspace creates the default workspace at
~/.openrig/workspace unless --root or workspace.root points elsewhere.
workspace/
SPEC.md
project.yaml
workspace.yaml
.gitignore
missions/
exhaust/
The scaffold is additive: it creates missing canonical entries and never
overwrites existing files, including with the deprecated --force flag.
exhaust/ and local .openrig/ runtime projections are ignored; authored
project context and mission/slice files remain versionable. workspace.yaml
is the project-location catalog. The project manifest exposes empty
install.context and install.skills selectors for ordered Markdown
addresses and stable managed-catalog skill IDs, but neither skill source nor a
System World belongs in this tree.
Project-world install
project.yaml may select project context and managed skills together:
schema: openrig.project/v0alpha1
kind: project
install:
intent: SPEC.md
context:
- conventions.md
skills:
- repository-maintenance
install.context contains project-relative Markdown addresses. install.skills
contains stable skill identities only. Skill source bytes live in the single
configured managed catalog (skills.root, default $OPENRIG_HOME/skills),
never under the project or workspace. rig context work-install --runtime <claude-code|codex> resolves both parts; add --apply-skills to reconcile the
selected exact bytes into .claude/skills/ or .agents/skills/ under the
caller's current working directory. Use --cwd when the receiving agent works
somewhere else; the project-world metadata root is never assumed to be its code
working directory.
The generated harness directories and .openrig/skill-loadouts/ ownership
receipts are projections, not source. Product repositories should ignore them.
Reconciliation removes a deselected entry only when its current bytes still
match OpenRig's last owned projection; unrelated and locally modified entries
are preserved or reported as conflicts.
Seats of the same runtime commonly share one working directory. Their topology selectors are retained per canonical seat identity and projected as a union, so starting one role cannot remove another role's skill. A changed projection is visible only to a fresh harness process; reconciliation reports that boundary instead of claiming a running seat hot-reloaded it.
An installed project selection is also retained in that working directory's
ownership receipt. A later seat start with no project-world input preserves it;
an explicit install whose install.skills is empty clears it. This keeps
"project not supplied" distinct from "project deliberately selects no skills."
TUI project selection
Open PROJECTS (or enter projects) to choose an ID and root from the
configured workspace catalog. project <id> selects an exact catalog entry;
mission <directory> then opens that project's execution view. The historical
scopes machine section ID remains valid. Project selection and its canonical
root travel through mission, slice, source-file and Back navigation. Changing a
catalog root requires selecting it again. Missing or malformed sources remain
unavailable; another project's matching work ID is never a fallback.
source opens the current project, mission or slice's actual source through the
existing file-reader allowlist. Catalog membership does not grant file-read or
execution permission. These views only read; they do not select a lifecycle
operation or activate a mission. Execution and slice queue membership require
an exact project:<id> tag; lifecycle instances use their authored project
identity. Unscoped historical queue rows and global review artifacts without
project binding are excluded from project-specific claims.
The read API adds GET /api/scopes/projects and optional project and
projectRoot parameters to scopes, execution and slice-detail reads. Slice
detail also requires the selected mission directory. Existing reads without a
project parameter keep their legacy contract.
UI Mapping
workspace.rootmaps to the Project workspace.workspace.catalog_pathmaps to theworkspace.yamlproject catalog.workspace.projects_rootis the default home for catalogued project worlds.workspace.root/missions/<mission-id>maps to a Project mission.workspace.root/missions/<mission-id>/slices/<slice-id>maps to a Project slice.- Mission
PROGRESS.mdfrontmatter supplies the mission status badge when the file root is allowlisted. - Mission and slice
SPEC.mdfrontmatter supplies intent, advisory sibling build-orderdepends_on, lifecycle status, and queue linkage hints. - Slice
PROGRESS.mdis the durable acceptance checklist;PROOF.mdandproof/retain evidence paired to the SPEC proof contract.
Mission and slice ids should be stable kebab-case strings. Keep slice ids
unique inside the workspace so /project/slice/<slice-id> resolves without
ambiguity.
Queue Mapping
Queue items attach to a slice when their body or tags mention one of:
- the slice id;
- the mission id;
- the legacy
rail-itemvalue in slice frontmatter.
For new work, include both mission and slice ids in the queue item body or tags. Example:
Mission: idea-ledger
Slice: capture-product-ideas
This makes Story, Queue, Tests, and Topology tabs line up with the filesystem slice without adding a separate project database schema.
Compatibility
The default discovery root is workspace.slices_root=<workspace.root>/missions.
The slice indexer also supports legacy flat roots such as
workspace.slices_root=<workspace.root>/slices, where each direct child folder
is a slice. Flat roots remain readable, but the mission-aware shape is the
default setup contract.
Repair Checklist
If Project shows a mission discovery warning:
- Run
rig config get workspace.root --show-source. - Run
rig config get workspace.catalog_path --show-source. - Run
rig config get workspace.slices_root --show-source. - Confirm
workspace.slices_rootpoints at a folder containing mission directories withslices/children. - Confirm
files.allowlistincludesworkspace:<workspace.root>so the TUI can read missionPROGRESS.md. - If the workspace is missing, run
rig config init-workspaceafter operator approval.
No daemon restart is required for most config reads. Restart when changing
startup-time roots such as files.allowlist or progress scan roots.