Skip to content

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

Part of external-workspaces — An external workspace is read the way this repository reads anything else, and its content never becomes public by accident.

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

coverstypecommandresultat commit
kind_registeredtestgrep -A8 '^ workspace:' share/kinds.yamlthe workspace kind is declared with schema majordomus.workspace/v1 and identity [id]3d9c929
keys_closedbuildmajordomus generateshare/allow/workspace.txt generated from the schema; 23 key patterns, additionalProperties false3d9c929
directory_contractartifactcat .ai/repo/workspaces/README.mdcontext/v1 document, tracks the schema and share/kinds.yaml, states what is authoritative and what is never here3d9c929
object_indexedtestbash test/run.sh 93_workspace_kind1 passed; majordomus://workspace/chatgpt-majordomus is indexed and served on the deployed /registry/ page with no Rust written for it3d9c929

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.