A version-controlled operating system for how Ascend works with AI: shared standards, shared knowledge, and shared change-tracking on a remote plane, paired with per-person tool surfaces on a local plane. Every contributor inherits the same baseline intelligence and contributes discoveries back through a deliberate, PR-reviewed promotion path.
The operating system I am envisioning has a remote and a local plane. On the remote plane we sync via GitHub (version control of the shared workspace) and project-manage via Linear (source of truth) and Slack (two-way sync). The remote plane is also where we sync team-level config: CLAUDE.md, settings, shared MCP servers, shared skill definitions, shared hooks. The local plane is two-fold: human setup (Claude Code CLI, Desktop, Cowork — inherits remote, configurable with local overrides) and autonomous setup.
— Manny E. Reimi to Marcelo, 2026-05-12
Lifts the floor on how every team member operates with AI. The shared layer means no contributor starts from zero, and local overrides are always permitted.
Shared artifacts: CLAUDE.md · skills · hooks · MCP server configs · plugin definitions
Grounds every decision in the same canonical surfaces. No archaeology required when tracing why something was built the way it was.
Canonical surfaces: Linear · GitHub PRs · /knowledge/ ADRs · */specs/ (SHA-pinned behavior evidence, v2.2) · Slack (ephemeral, 2-way sync)
Two planes connected by directory nesting. The hub physically nests the spokes as subdirectories; each spoke mounts its code repos under work/ via a manifest. The remote plane is shared and versioned; the local plane is per-person and inherits the remote by composing CLAUDE.md down the directory tree.
CLAUDE.md hub resolver, at the repo root.claude/ shared skills · hooks · rules · settings.mcp.json shared MCP server declarationsknowledge/ ADRs · primers · conventions · people · backbonerepos.yaml code-repo → spoke-mount manifestOWNERS root + per-subdir ownership
Because the spokes nest physically, each inherits the hub CLAUDE.md and .claude/ by directory position — no per-spoke replication. Each spoke mounts its @AscendFi code repos under work/ per repos.yaml.
Nesting + manifest is chosen over submodule (pinned-commit indirection that confuses non-technical contributors) and over a monorepo-of-everything (entangled release cadence, fights the engineering team's standalone workflow). Subtree is retained only for the graduation case — when a spoke moves to its own repo.
Access: Cowork reads via GitHub connector · Code-in-Desktop and CLI read+write via MCP + git. The gitignored capture lives under .obsidian/ in the workspace (contributor / spoke / hub level), promoted into knowledge/ via /promote-to-knowledge.
No per-spoke replication to sync: the layering is the directory tree. No bespoke release tooling needed in Phase 0–1.
Nesting over submodule (pinned-commit indirection confuses non-builders) and over a monorepo-of-everything (couples release cadence, fights the standalone clone). CLAUDE.md composes by directory position; a spoke contributor sees a normal directory.
All four are standing teams, and each gets a spoke — the team is the durable unit; the ephemeral unit is the workstream (a dated specs/ entry inside a spoke). The spoke shape is uniform across all four types — what changes is the team's domain, its OWNERS, and the contents of work/. Phase 1 stands up product, protocol, and compliance; platform and quant graduate as those teams form.
One spoke, one shape — no code/non-code distinction. What flexes is only work/: a code team mounts its @AscendFi repos there; a non-code team tracks its artifacts there directly. The structure — CLAUDE.md, specs/, decisions/, work/, OWNERS — is identical. Treating a React app, Solidity, regulatory procedures, and product strategy as the same kind of work — versioned, spec-driven, decision-traceable, reviewable — is what makes the Product++ triad coherent at the filesystem level. The three are disciplines inside one stream-aligned team, not three separate teams.
A thing read by every team still belongs to one spoke if one team authors and owns it: the written-supervisory-procedures are read firm-wide but owned by compliance, so they live in the compliance spoke. Only genuinely shared substrate with no single owning team lives in the hub — conventions, glossary, the people directory, cross-team ADRs, and the product-backbone everything-doc. Readership is broad for both; ownership is the discriminator.
Two kinds of session data accumulate locally, both gitignored, neither shared as-is. /promote-to-knowledge is the single path that distills both into durable, tracked knowledge/:
.obsidian/{daily, _inbox, _thinking} — gitignored, per-contributor. daily/ is the running log (human + Claude); _inbox/ is Claude-generated captures to triage; _thinking/ is human-authored reflection. The capture lives under .obsidian/ — this is simply where unstructured notes live (Obsidian can still open it, incidentally). The vault-"overlay" framing is dropped: on GitHub it doesn't earn its keep.
docs/ — gitignored. The compound-engineering plugin auto-generates plans · solutions · brainstorms · todos per session: signal-bearing noise, useful to the person who ran the session but not curated for sharing.
Two sources, one sink. /promote-to-knowledge reads both, proposes what's durable, and lifts it (via PR) into knowledge/ — the only path either takes into the shared repo. Everything in the capture is gitignored and never shared until promoted. (This replaces the v1.x per-user vault concept; capture now lives in the workspace.)
knowledge/ is the durable record; /gbrain (gstack's cross-instance context layer) is how a contributor queries it — semantic recall across every promoted learning, ADR, primer, and convention, without hunting the folder tree.
Per-user local. Each Tier-3 contributor runs /gbrain over their local clone of knowledge/; no shared backend. Proves the retrieval is useful before any infra spend.
Shared backend. Evaluate a shared store (Supabase or equivalent) so a query hits the team's knowledge and Cowork/Tier-1 users reach it without a local index. Gate: only once cross-spoke retrieval is a real, felt need.
Boundary. /gbrain indexes the promoted, tracked knowledge/ — NOT the gitignored capture (.obsidian/, docs/). Capture becomes queryable only after /promote-to-knowledge lifts it.
Cowork in the Claude Desktop app, with GitHub, Drive, and Slack connectors
Lowest-friction entry point. Reads shared knowledge and follows shared CLAUDE.md rules via its hosted VM. Stays a valid endpoint — not all roles need to escalate.
Claude Code via the Claude Desktop app (not the standalone CLI)
Runs Claude Code through the Desktop app. Adds shared MCP servers and skill invocation on top of Tier 1. Natural transition toward the full CLI.
Claude Code CLI with full local toolchain
Full capability surface: git ops, event-driven hooks, MCP, skills, agents, and the compound-engineering plugin. The full-toolchain surface, for those who maintain the shared layer day to day.
CLAUDE.md + rules + resolvers · knowledge/ (markdown) · .claude/skills/ (read + invoke) · agent definitions · settings the VM can honor.
Hooks via settings.json (event-driven) · env vars + local config · MCP servers requiring a local process · developer-environment-specific config.
Authors of shared knowledge can assume Cowork users benefit, not degrade. The portability rule is permissive by default.
Session noise stays noisy. Two gitignored session-data sources — unstructured .obsidian/ and noisy CE docs/ — both feed /promote-to-knowledge, which lifts the durable signal into shared knowledge/ through a deliberate, human-reviewed PR path.
Because the shared layer lives once at the hub and composes by directory position, there is no per-spoke replication to sync — a hub change reaches everyone on their next git pull of ascend-os. The mechanism narrows to two things: refreshing the code-repo mounts and notifying people a change landed. Pull-based, not push-based.
Cowork (Tier 1) users receive updates for free: they read GitHub canonical, so every merged change is visible immediately without any manual pull. Graduated spokes (any spoke moved to its own repo) are the one case that still pulls the shared .claude/ via subtree, exactly as a detached repo would.
Phase 1 ownership split. OWNERS files at the hub root and per-subdirectory enforce routing. Owners are assigned by expertise domain, not seniority — and ownership is independent of tooling tier. Cross-cutting changes require all three.
| Domain | Owner | Notes |
|---|---|---|
| Strategy · operating-model · narrative/voice canon · org adoption | Marcelo (lead) · Manny | strategy + narrative; co-owned as AI partners |
| AI-Ops architecture · skills · technical CLAUDE.md | Manny | architect of the operating system |
| Engineering · code · specs/ · workflows (per spoke) | Dennis | scoped to engineering execution |
| Compliance · WSP · regulatory | Warren | owns the compliance spoke |
| Cross-cutting config (root CLAUDE.md, .mcp.json, settings) + cross-team ADRs | Marcelo · Manny · Dennis | the three co-sign |
Named OWNERS (not CODEOWNERS) because it routes non-code paths too. The split is by what kind of change it is, not by seniority. Cross-cutting config + cross-team ADRs need all three.
Owners' incentive is built in: invest in CI gates to stop being a manual bottleneck for your domain.
Linear is the single source of record for what the team is doing. Slack and GitHub PRs sync two-way against it; PRs reference Linear IDs. The deliberate negatives matter as much as the positives.
| Surface | Role | Sync |
|---|---|---|
| Linear | Source of record — OKRs, projects, issues | ↔ Slack ↔ GitHub |
| GitHub PRs | Code and config change-management; reference Linear IDs | ↔ Linear |
| Slack | Ephemeral coordination | ↔ Linear |
| /knowledge/decisions/ | ADRs — durable architectural decisions, in-repo | git |
| */specs/ | Canonical behavior evidence — SHA-pinned, provenance-tagged acceptance baselines (forward + preservation genres, §08) | git |
One place to ask "what are we doing" (Linear) and one place to ask "why was it built this way" (ADRs in /knowledge/decisions/). No competing trackers.
Code-bearing spokes use SDD for any new feature or behavior change. Two spec genres, one dated folder shape: forward specs (net-new behavior) and preservation specs (pin current behavior before a rework, so nothing is silently unshipped). v2.2 patches this section to proven reality — the semantics below are the ones the two shipped specs actually exercised; canonical wording lives in the OS at knowledge/conventions/sdd-preservation-specs.md.
One Feature per file, parseable by a real runner. Every criterion is tagged — current behavior vs on-chain rule vs design intent vs a decided rework change — so inherited behavior and new product decisions never blur. Stakeholder-signable: "Given X, When Y, Then Z."
Deterministic oracle and tolerance cases — numbers read from the running system, never copied from source constants (the live oracle catches what the constants hide) — and/or statistical LLM evals when an AI surface is in scope. Every claim carries a verify status: verified-live > code-traced > pending.
Test code and harnesses. Test code defaults to the mounted code repo, next to the implementation it exercises. Spec-local verification harnesses are permitted when they enforce the spec rather than restate it — the design-system spec's harness/ (deterministic layout checker + calibrated judge council) is the proven precedent.
ADRs in knowledge/decisions/ cross-reference specs by date-name, so the rationale survives even when the spec itself evolves. Coverage-gate CI + the spec-pin staleness tripwire landed 2026-07-06 (ASC-61 items 1–2, capture mode; --enforce flips at rework-merge); the scripted oracle pass + the runner remain tracked in Linear as ASC-61.
Phases run sequentially — each starts as the prior completes; within a phase, bars run in parallel. Actual history diverged productively: Phase 0 landed 2026-06-19–22 and the OS then proved out single-player (the design-system spec + harness, then the borrow/onboarding preservation spec) before any onboarding — so Phase 1 is now Dennis-first, and Phase 2 flips the capture-mode gates (coverage-gate + spec-pin staleness, landed 2026-07-06) to --enforce and adds the remaining ASC-61 items. Phase-0 day-by-day detail (historical plan) is in section 10.
Proven 2026-06-19..22: hub (ascend-os) + three spokes with code repos mounted + manifest + skills, single-operator. Exit criteria gated per §9 (ticked or waived).
Each person onboarded across Claude tiers + Slack + Linear + Granola: Dennis first, then Marcelo, then Warren, Paul, Simon (Tier 1). Existing docs migrated into knowledge/.
Auto-update tooling stable. Slack and Linear cloud agents introduced. CI gates and optimistic merge enabled.
Per-user local autonomous agents (OpenClaw/Hermes) for Tier 3 builders. Shared cloud agents debate for cross-spoke coordination.
Phase 1 does not begin until every item below is confirmed.
| Day | Workstream | Owner | Output |
|---|---|---|---|
| D1 | Hub repo + repos.yaml/bootstrap + root & per-subdir OWNERS | Manny | Hub skeleton + manifest + OWNERS |
| D2 | Seed knowledge/ (conventions, glossary, people, 2 primers, first ADR) | Manny | knowledge/ skeleton |
| D3 | /sync-ai-ops v1 + Slack #ai-ops + release-tag GitHub Action | Manny / Marcelo | Sync skill + channel + action |
| D4 | Pilot spoke (product) + mounts + /promote-to-knowledge v1 | Manny | Working spoke + promote skill |
| D5 | Round-trip + promotion dry-runs + exit review (ratify OWNERS) | Dry-runs: Manny + Dennis · exit sign-off: Marcelo + Manny + Dennis | Phase 1 unblocked |
| Risk | Mitigation |
|---|---|
| Mount/bootstrap easy to trip on first try | Pair on the first bootstrap; document the steps in a mounting-spokes primer |
| /sync-ai-ops harder to build than expected | v1 is a thin wrapper around the bootstrap (clone/update per repos.yaml) + git diff; intelligence in v2 |
| /promote-to-knowledge confused by CE noise | v1 lists unstaged docs/solutions/ entries and asks the human to select |
| Mounted repo paths drift from repos.yaml | /sync-ai-ops reconciles mounts against the manifest; bootstrap is idempotent |
| 5-day Phase 0 is tight | Day breakdown is parallelizable (D2/D3 don't block each other); the D5 dry-runs can slip a day without blocking onboarding prep |
| OWNERS too restrictive before CI gates exist | Cross-cutting changes require multi-owner approval; routine changes auto-route to a single owner |
| Remote plane | Shared, versioned layer — GitHub, Linear, Slack, /knowledge/ |
| Local plane | Each person's tool surface (their tier) |
| Hub | ascend-os — the hub repo holding shared .claude/ + knowledge/ and nesting the spokes as subdirectories. (ascend-core is reserved for a future microservices architecture.) |
| Spoke | A team's working surface: a subdirectory of the hub holding CLAUDE.md + specs/ + decisions/ + work/ + OWNERS. One per team, uniform shape. Phase 1: product (stream-aligned), protocol (complicated subsystem), compliance (permanent specialist) |
| Mount | A code repo (canonical in @AscendFi) cloned into a spoke's work/ per repos.yaml, gitignored from the hub; keeps its own CLAUDE.md |
| Manifest (repos.yaml) | Declarative map of code-repo → spoke-mount path; a bootstrap step reconstructs the workspace from it |
| Team Topologies | Skelton/Pais framework: stream-aligned, complicated subsystem, platform, enabling (the team is permanent; only the facilitating interaction is time-boxed). All four are standing teams that each get a spoke; team type informs ownership + cadence |
| Subtree | Native git subtree — retained only for the spoke-graduation case; the default topology nests instead of replicating |
| SoI | System of Intelligence — shared quality (CLAUDE.md, skills, hooks, MCP) |
| SoR | System of Record — shared accuracy (Linear, GitHub PRs, knowledge/, Slack) |
| Tier 1 / Cowork | Cowork in the Claude Desktop app, with connectors — no terminal, no MCP CLI |
| Tier 2 / Claude Code in Desktop | Claude Code via the Claude Desktop app — adds MCP servers + skills; not the standalone CLI |
| Tier 3 / CLI | Claude Code CLI + full toolchain. A tooling surface, not a rank |
| OWNERS | Per-directory ownership file (renamed from CODEOWNERS for non-code paths) |
| SDD | Spec-Driven Development — spec.md → acceptance/ (one Gherkin Feature per file) → evals.md (the quantitative gate) → coverage-matrix.md on preservation specs → the verification ladder. Two genres: forward + preservation. Test code defaults to the mounted repo; spec-local harnesses permitted when they enforce the spec |
| ADR | Architecture Decision Record — durable decision in knowledge/decisions/ |
| /gbrain (G-Brain) | Gstack's cross-instance context layer that queries the durable knowledge/ — per-user local for Tier 3 in Phase 1; shared backend (Supabase) deferred to Phase 2. Indexes promoted knowledge/, not the gitignored capture |
| OpenClaw · Hermes | Local autonomous agents (Phase 3+) |
| Claude Managed Agents | Cloud autonomous agents (Phase 2+) |