02 project context + project hub
Several projects, and one private Hub above them
Each project keeps its own project-context/, exactly as on the first tab. What they share — the guardrails, the workflows, and the goal each project serves — belongs in one place rather than copied into four. The projects under one Hub need not be the same kind: a coding repository, a research folder, a manuscript and a planning folder sit side by side, because the records are the same either way.
one private repository · one owner · builders hold no permission on it
Project Hub
- global/ authored here
- projects/<id>/blueprint/ authored here
- projects/<id>/pulled/ a stamped copy, read side by side
- owners_window/ never leaves
- pushthe owner sends the shared tier down — onto a hub-sync branch, as a pull request the repository reviews
- pullthe owner brings each repository's authored records up — read-only against the repository, writing nothing there
-
a coding repository
project-context/
builder-authored
pushed · read-only
-
a research folder
project-context/
builder-authored
pushed · read-only
-
a manuscript or a plan
project-context/
builder-authored
pushed · read-only
Both arrows start with the owner, from the Hub, and only in the direction their access already allows. Nothing in a project repository ever reaches out to a Hub: no call home, no registration, no credential.
The builder's view — what changes in your repository
You are working in one project, on the first tab's arrangement. An owner runs a Hub above it. Here is everything that is different for you.
Two folders appear, and they are not yours to edit
global/ and blueprint/ show up inside your project-context/. They are the pushed set: authored elsewhere, copied in, and read-only here. The stamp lives in the marker and never in the file — a pushed file stays clean Markdown, while .project-context.json records its sha256, the source commit and the push time.
A push arrives as a pull request, never on your default branch
A push does not write to your default branch. It commits to a long-lived hub-sync branch and opens a pull request, so what an owner sends arrives as a change you review like any other. Repeated syncs stack commits on that one branch and update the same request rather than scattering branches. Nothing force-pushes, and nothing merges — merging stays with you.
You push back by raising something, not by editing
If you disagree with something pushed to you, raise a question in your own project-context/, or run project-context capture --kind proposal. It reaches the owner the next time they pull, and it arrives with the project context that explains it. That is the only path back up — nothing in your repository ever contacts the Hub by itself.
an edit is refused, not overwritten
Editing a pushed file does not win the argument, and it does not get overwritten either. The Hub recorded that file's hash, so the next push sees the change and refuses. One edited file is a conflict that stops the owner's entire push to your repository, naming your file and saying the place to change it is the Hub. So the edit just stops the sync — and the owner still never learns what you objected to.
The owner's view — one place, a folder per project
A Hub is one private repository you make from the public scaffold and administer yourself. It is plain Markdown in Git: no database, no service to log into, no runtime dependency.
One place the global tier is authored
Identity, guardrails, workflows, goals and resources. You write them once, in global/, and push them into the projects that need them — rather than copying the same guardrail into four repositories and watching three of them drift.
A folder per project
projects/<id>/ holds that project's mark — remote, branch, visibility, who builds it — your summary of it, and the blueprint you author for it: EPIC.md, the goal the project serves, and ARCHITECTURE.md, the shape it has to keep.
pull brings the builders' own records up to you
pull copies each repository's plan, tasks, decisions, learnings, open questions, designs, and incidents into projects/<id>/pulled/, stamped with repository, branch, commit and time. You read them here, together, without cloning anything. It is also your inbox: a question or a proposal a builder raised arrives on this path, and nothing moves until you pull.
what never travels
The Hub's IDENTITY.md never reaches a project repository, at any setting — a project may have collaborators outside your organisation, so identity stays with you. GOALS.md, RESOURCES.md, people/ and agents/ are opt-in per project rather than default. And owners_window/, where you write about what is coming, is never pushed anywhere at all.