I1301 — A workspace is a declared object of the layer; only its content is local
Register `workspace` as a kind — allowed keys, schema, directory contract — and declare the first workspace under .ai/repo/workspaces/, so that the catalogue of what may be synced is the repository's own tracked statement while the synced content stays out of the tracked tree.
DONE wave 0 · p0 · deep-work profile · parallel safe
Objective
Register `workspace` as a kind — allowed keys, schema, directory contract — and declare the first workspace under .ai/repo/workspaces/, so that the catalogue of what may be synced is the repository's own tracked statement while the synced content stays out of the tracked tree.
Why
ADR 0025 established that .ai/local reaches no surface: the Rust index knows one discovery, tracked files through the git index, and excludes the local half at three points. A synced corpus therefore cannot ride the kind pipeline — but the declaration of which workspace exists, who holds it, what the operator authorised and how it is reached carries none of the private content and all of the useful metadata. Declared as a kind it is indexed, readable, listable and projectable for free, exactly as tests/external_extension.rs proves for any other kind.
Current state
No workspace kind, no .ai/repo/workspaces directory, no allow file and no schema exist.
Desired state
A workspace object states vendor, workspace identity, the human name, what the operator authorised, the browser profile reference by name only, and the capabilities the adapter is expected to negotiate. It is indexed, closed by an allow file, and carries a context README per ADR 0011.
Scope
- .ai/repo/workspaces
- share/kinds.yaml
- share/allow/workspace.txt
- share/schemas
Out of scope
- Any synced content; the store is I1303
- Any credential, cookie or token value; the declaration names a profile, it does not hold one
- Any Rust that special-cases the kind
Dependencies
None. This issue is a root of the graph.
What waits on this
Acceptance criteria
- The object states vendor, upstream workspace identity, display name, the authorisation the operator asserts, the browser profile reference by name, and the expected capability set
- Keys are closed by share/allow/workspace.txt and an unknown key is refused
- The directory carries a context README stating what is authoritative and what is generated, per ADR 0011
- The object is listed and read through the existing object surface with no code that special-cases it
- No secret value and no credential name appears in the object or its schema
Validation
- bash test/run.sh
- bin/majordomus doctor
- majordomus generate --check
Evidence required
- kind_registered
- keys_closed
- directory_contract
- object_indexed
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| kind_registered | test | grep -A8 '^ workspace:' share/kinds.yaml | the workspace kind is declared with schema majordomus.workspace/v1 and identity [id] | 3d9c929 |
| keys_closed | build | majordomus generate | share/allow/workspace.txt generated from the schema; 23 key patterns, additionalProperties false | 3d9c929 |
| directory_contract | artifact | cat .ai/repo/workspaces/README.md | context/v1 document, tracks the schema and share/kinds.yaml, states what is authoritative and what is never here | 3d9c929 |
| object_indexed | test | bash test/run.sh 93_workspace_kind | 1 passed; majordomus://workspace/chatgpt-majordomus is indexed and served on the deployed /registry/ page with no Rust written for it | 3d9c929 |
Risk
A schema written for ChatGPT becomes a ChatGPT file with a generic name. It has to state only what a second vendor would plausibly restate, and push everything else into a named vendor block.
Timeline
- started
- 2026-09-09T18:25:15Z
- verified
- 2026-09-09T18:26:21Z
- completed
- 2026-09-09T18:26:36Z
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I1301.yaml. Read it back with majordomus plan show I1301.