LOG 010.4: Building the SharePoint 9OS Command Deck and Teams Channels
This is Part 4 of the Nine / 9OS series. Part 3 built the identity layer — the M365 account, NordVPN dedicated IP, and Conditional Access policy. This entry builds the workspace: the SharePoint site Nine operates from, the Teams command channels, and the naming architecture that makes the whole system coherent and scalable.
Series hub: LOG 010: Building Nine — A Headless AI Agent Operating Layer for Paragon9
01. THE SYSTEMS SOURCE: THE NAMING ARCHITECTURE
Before creating a single SharePoint library or Teams channel, get the naming right. This decision affects everything downstream — documentation, client deployments, future migrations, and how legible the system is to anyone who has to operate it besides you.
The system has three distinct layers. Don't conflate them:
| Layer | What It Is | Name |
|---|---|---|
| The agent identity | The persistent "who" — the name, the M365 account, the entity that survives runtime changes | Nine |
| The M365 infrastructure | SharePoint, Teams, Exchange — the operating environment the agent lives in | 9OS |
| The runtime bot | The software currently running the agent — this changes over time | 9Claw (OpenClaw) / 9Bot (Hermes, when we migrate) |
Nine is the entity. 9OS is where Nine lives. 9Claw is how Nine currently communicates through Teams.
Why this separation matters: when we eventually migrate from OpenClaw to Hermes, Nine's identity and the entire 9OS infrastructure stay constant. Only the bot name changes. Every piece of documentation, every client deployment built on this pattern, every SharePoint log entry referencing Nine — all of it remains coherent. You don't rebuild the workspace every time the runtime evolves.
The Insight: Name the layers separately because they change on different timescales. The identity is permanent. The infrastructure is durable. The runtime is replaceable. Build the naming architecture to reflect that — and you'll never have to explain to anyone why "Nine" is the same agent even though the bot name changed.
02. THE BUILD SOURCE: THE DEPLOYMENT ROADMAP
Phase 1: Create the SharePoint 9OS Site
Navigate to your SharePoint admin center or directly to https://[yourtenant].sharepoint.com.
Active sites → + Create → Team site
- Site name:
9OS - Site address: Auto-populates as
[yourtenant].sharepoint.com/sites/9OS - Description:
The operational core of Paragon9's AI agent infrastructure. 9OS is the command layer where autonomous workflows are staged, reviewed, and executed — built on Microsoft 365, secured by design. - Privacy: Private — only members you explicitly add can access this site
- Owners: Your Global Admin account only
- Members:
[email protected]
Click Create and wait 30–60 seconds for provisioning.
On the name: We considered several options — 9Command, 9Deck, Command9, Forge. We landed on 9OS because it's the most architecturally accurate. You're not just building a command dashboard — you're building an operating system layer for the agent.
paragon9.sharepoint.com/sites/9OSreads exactly right.
Phase 2: Create the Five Document Libraries
Nine's workspace needs five document libraries — not folders. Libraries give you proper metadata, versioning, and per-library permission scoping. That last point matters when we lock Reference to read-only in Phase 4.
From the 9OS site home page, create each library via + New → Document library:
| Library | Description |
|---|---|
Inbox |
Tasks and requests staged for Nine to act on. |
Outbox |
Completed deliverables staged for human review before release. |
Drafts |
Email drafts, proposals, and documents in progress awaiting review. |
Reference |
Documents and resources explicitly granted to Nine for context and retrieval. |
Research |
Finished research artifacts and media produced. |
Logs |
Activity logs, decision trails, and audit records for all Nine operations. |
Create them one at a time and verify each appears in site navigation before creating the next.
Note: SharePoint auto-creates a default
Documentslibrary. Leave it — don't delete it. Nine will have six libraries visible; five are operational.
Phase 3: Scope Nine's Permissions at the Site Level
When you added [email protected] as a member during site creation, SharePoint may not have actually added it to the members group. Verify this before proceeding.
Navigate to Site Settings (gear icon) → Site permissions → Advanced permissions settings
Click on 9OS Members and check whether [email protected] is listed. If it isn't:
Click Grant Permissions at the top of the page:
- User/Group:
[email protected] - Permission level: Contribute
- Uncheck "Send an email invitation"
Click Share to confirm.
Phase 4: Lock the Reference Library to Read-Only
Nine can read from Reference but cannot modify it. This is where you place client briefs, templates, and reference material Nine needs for context — without any risk of the agent overwriting the source documents.
Navigate to the Reference library → gear icon → Library settings → Permissions for this document library
Click Stop Inheriting Permissions and confirm the warning dialog.
Find [email protected] in the permissions list, check its checkbox, click Edit User Permissions, and change from Contribute to Read. Click OK.
On populating Reference: You don't need to copy documents in from other SharePoint sites. Use SharePoint Shortcuts to create links to documents on other sites — they appear local but aren't copies. You'll need to create a share link from the source document and add it as a link to the Reference document library. For documents that should flow in automatically, Power Automate can watch source libraries and sync to Reference on change. Both approaches can coexist: shortcuts for standing reference material, Power Automate for dynamic content.
Phase 5: Create the 9OS Teams Team
Open Teams and navigate to Teams → Join or create a team → Create team → Private
- Team name:
9OS - Description:
Command and control channel for the Paragon9 Nine AI agent infrastructure. Internal use only.
Click Create. When prompted to add members, add [email protected] as a Member — not Owner.
Phase 6: Create the Four Command Channels
Create each channel via three dots (...) next to the 9OS team → Add channel:
For each channel:
- Privacy: Standard
- Check Add Channel Agent ✔ (enables native Teams agentic capability)
- Layout: Posts (not Threads — keeps command/output flow linear and chronological)
| Channel | Description |
|---|---|
tasks |
Drop tasks and requests here for Nine to act on. |
drafts-review |
Completed drafts staged by Nine for human review before release. |
research |
Research requests and synthesis outputs from Nine. |
code-review |
Code review requests and PR summaries staged by Nine for human approval. |
The routing logic is intentional and worth stating explicitly:
tasks— You write here, Nine reads and actsdrafts-review— Nine writes here, you reviewresearch— Nine writes here, you reviewcode-review— Nine writes here, you review
Nine needs write access to three channels. The tasks channel is inbound only — it's how you issue work, not how Nine responds to it.
Phase 7: Install 9Claw in the 9OS Team
Nine communicates through the Teams bot — 9Claw in this deployment, named after the OpenClaw runtime. The bot needs to be installed at the team level so it can post to all channels.
In Teams: 9OS team → three dots (...) → Manage team → Apps tab → Upload an app
Select your OpenClaw bot zip file and install it scoped to the 9OS team.
When prompted to choose a channel, select any one — it doesn't matter which. Team-level installation gives the bot access to all channels. You do not need per-channel installation.
Note: After installation, if you try to add the bot to additional channels through the Apps list it will show as already installed. This is correct behavior, not an error.
Phase 8: Register Each Channel with the Bot
OpenClaw's bot framework only registers a channel conversation when there's an actual message interaction — installation alone is not enough. @mention the bot in each channel to trigger registration.
In each of the four channels, send:
@9Claw hello
The bot should respond in each channel. After all four, verify the channel registrations on the OpenClaw machine:
cat ~/.openclaw/msteams-conversations.json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for cid, conv in data['conversations'].items():
ctype = conv['conversation']['conversationType']
print(f'Type: {ctype:10} | ID: {cid[:35]}...')
"
You should see:
- 1 entry with
conversationType: personal(your DM with the bot) - 4 entries with
conversationType: channel(one per channel)
⚠️ Gotcha #6 — Two groups named 9OS in the Graph API
When you query Microsoft Graph for the 9OS team by display name, you'll find two groups named 9OS. SharePoint creates a backing Microsoft 365 group when you provision a Teams team, resulting in a duplicate name.
To identify which group is the actual Teams-enabled one, check the
resourceProvisioningOptionsfield:python3 << 'EOF' import json, urllib.request, urllib.parse with open('/home/paragon9/.openclaw/msgraph.json', 'r') as f: mg = json.load(f) data = urllib.parse.urlencode({ 'grant_type': 'client_credentials', 'client_id': mg['clientId'], 'client_secret': mg['clientSecret'], 'scope': 'https://graph.microsoft.com/.default' }).encode() with urllib.request.urlopen( urllib.request.Request( f"https://login.microsoftonline.com/{mg['tenantId']}/oauth2/v2.0/token", data=data, method='POST' ) ) as r: token = json.loads(r.read())['access_token'] filter_query = urllib.parse.quote("displayName eq '9OS'") with urllib.request.urlopen( urllib.request.Request( f"https://graph.microsoft.com/v1.0/groups?$filter={filter_query}&$select=id,displayName,resourceProvisioningOptions", headers={'Authorization': f'Bearer {token}'} ) ) as r: for g in json.loads(r.read())['value']: is_teams = 'Team' in g.get('resourceProvisioningOptions', []) print(f"ID: {g['id'][:8]}... | Teams-enabled: {is_teams}") EOFUse the ID where
Teams-enabled: True.
03. THE LEGACY SOURCE: THE WORKSPACE IS LIVE
At this point Nine has a place to work, a structured way to receive tasks, and defined channels for where output lands.
✔ SharePoint 9OS site — private, scoped, provisioned
✔ Five document libraries — Inbox / Outbox / Drafts / Reference / Research / Logs
✔ Reference library locked to Read-only for [email protected]
✔ Teams 9OS team — private, agent as member
✔ Four command channels — tasks / drafts-review / research / code-review
✔ 9Claw bot installed at the team level
✔ All four channels registered via @mention
The workspace isn't just file storage and chat rooms. It's the audit trail. Every task Nine receives comes through the tasks channel. Every deliverable Nine produces lands in Outbox before it goes anywhere. Every significant action Nine takes gets logged to the Logs library. The structure enforces accountability without requiring a custom framework — it uses the infrastructure Microsoft already built and that you already pay for.
Nine has an identity. Now Nine has an address. The final entry in this series wires the two together.
The Lesson: Structure defines what accountability looks like in practice. A well-organized workspace isn't overhead — it's the difference between an agent you can begin to trust and one you have to watch constantly.
[SYSTEM NOTES]
- Naming convention: Nine (identity) / 9OS (infrastructure) / 9Claw (runtime) — three separate layers, three separate names
- Library structure: Inbox / Outbox / Drafts / Reference / Research / Logs — Reference is read-only for
[email protected] - Channel routing: tasks (inbound to Nine) / drafts-review, research, code-review (outbound from Nine)
- Bot installation: Team-level only — per-channel installation is not required and appearing as already installed is correct behavior
- Channel registration: Requires @mention in each channel — installation alone does not register the conversation
- Graph API duplicate: Two groups named 9OS exist — use
resourceProvisioningOptionsto identify the Teams-enabled one
Stay Resilient.
— Greg Scott Kirk (Tek)
Part 4 of the Nine / 9OS series.
← Previous: LOG 010.3: Setting Up a Dedicated M365 Identity for Nine
→ Next: LOG 010.5: Connecting OpenClaw to Microsoft Graph and Bringing Nine Online
This is the architecture Paragon9 installs for mid-market firms — modernized, documented, and built to run without its operator. If you want it running in your business, the conversation is free.