mcps/library/ → mcps/. Added library-layer content expectations (auth patterns, tool inventory, gotchas, validation templates, version tracking). Removed the Out of Scope section; items worth flagging folded into Non-Goals (§3), the rest dropped as self-evident.systems/ (NTEK-side platforms) from clients/<slug>/mcps/ (per-client integrations). Added CI throttling tiers. Committed reports/ to git. Narrowed Airia drift push-notification. Mobile capture deferred without a specific path..claude/skills/. Renamed Airia “pipelines” → “agents” in user-facing docs._generated/ output convention.ntek-operations is a private GitHub repository that serves as NTEK AI's operational brain: the single source of truth for documentation, SOPs, runbooks, CRM data, tasks, projects, client and MCP records, time tracking, agent playbooks, and infrastructure-as-code. It sits alongside — and is actively managed by — EasyCC and Claude Code as the primary agent runtimes. Binary assets and transactional state (e-signature, invoicing, scheduling, email delivery, secrets) live in specialized SaaS tools linked from the repo. The repo holds the why, the how, and — for v1 — also what’s happening now for CRM state, task state, and logged hours.
NTEK's current operating model has three compounding issues:
A structured, git-versioned, agent-queryable operational repository addresses all three: it forces configuration to become explicit, makes state changes auditable, gives EasyCC and Claude Code a stable substrate to reason over, and — critically — accumulates MCP-level knowledge that makes each subsequent client onboarding cheaper than the last.
| User | Access | Interaction Mode |
|---|---|---|
| Ben | Admin | Direct git + EasyCC + Claude Code |
| Matthew | Write | Direct git + EasyCC + Claude Code |
| Securo | None | Generated reports only, delivered via Outlook/SharePoint |
| Tegre | None | Client-facing outputs delivered via SharePoint |
| Future contractors | Deferred | Access model TBD when need arises |
Repo visibility: Private.
| System | Role | Repo Interaction |
|---|---|---|
GitHub (ntek-operations) | Context, SOPs, playbooks, IaC, agent workflows, CRM, tasks, projects, time entries, derived intelligence | Primary read/write |
| SharePoint / OneDrive | Binary assets, client deliverables | Read + write via MCP |
| System | Role | Agent Interaction |
|---|---|---|
| Outlook | Human email (inbound + outbound) | Read for signal, draft for review |
| Resend | Transactional/automated email | Write-only via EasyCC flows |
| Calendly | Scheduling | Read for calendar context |
| PandaDoc | E-signature | Read for contract status |
| Stripe | Invoicing, payments | Read for payment state |
| Airia | AI gateway, meeting notetaker, agent runtime | Configured via IaC; notetaker read via MCP; nightly drift detection |
| 1Password Business | Secrets management | Read via MCP, op CLI, and GitHub Actions service account |
Harvest is intentionally absent — time tracking moved in-repo. See §7.7 and §11.4.
This is a conceptual split that threads through the repo structure, the matrix, and the governance rules. Worth stating carefully upfront because it shapes the inheritance model in §7.2.
systems/<slug>/.mcps/<mcp-slug>/) — everything true about the MCP itself, independent of any client. Auth models and patterns, required and optional scopes, tool inventory, platform-level gotchas and workarounds, validation test templates, upstream version notes, best practices that have accumulated across all deployments. This is the layer that compounds in value over time — every onboarding teaches the library something.clients/<slug>/mcps/<mcp-slug>/) — what’s true about this client’s deployment. Their specific auth choice (from the patterns documented in the MCP-type record), tenant/scope configuration, tool subset in use, validation state, current status in the client × MCP matrix, client-specific blockers or overrides.Some platforms appear as both a system and an MCP — SharePoint is both a system (NTEK’s own file storage, configured once) and an MCP (per-client Graph integration, configured per engagement). The records live in different directories and describe different things.
A system is a platform we operate in. An MCP is an integration we set up for a client. Systems are cross-client; MCPs are per-client but backed by a shared MCP-type record.
The MCP-type record is authoritative for everything not client-specific. The per-client record inherits from it and only captures client-specific configuration, state, and overrides. When a lesson is learned during a client onboarding, it is written to the MCP-type record unless it’s truly unique to that client.
If the same underlying platform serves both system and MCP roles, it gets one record in
systems/, one record inmcps/, and one record per client inclients/<n>/mcps/.
When systems disagree:
time/ directory) winsmcps/<slug>/ winsclients/<n>/mcps/<slug>/ wins.claude/skills/ is the shared playbook/SOP library — runtime-neutral in principle; both runtimes execute the same skills against the same conventions._generated/ rebuilds) — tiered per §7.8.Running CRM, tasks, and time in git rather than dedicated SaaS tools introduces known friction points. We accept these in v1 and address them with specific mitigations. If mitigations prove insufficient, v1.5 revisits.
| Pain Point | Expected Onset | Mitigation |
|---|---|---|
| Mobile capture deferred entirely | Week 1–2 | Desktop-only capture; end-of-day briefing nudges for anything unlogged |
| Desktop-only time entry friction | Week 1–2 | /track slash command + end-of-day nudge from briefing agent |
| Notification gaps | Week 2–3 | Resend push + Pushover/IFTTT for narrowly-scoped time-critical thresholds (§9) |
| Partner (Matthew) update friction | Month 1–2 | Slash commands that make structured commits 1-step |
| View layer pain (pipeline boards, calendars) | Month 2–3 | CI generates rendered dashboards from markdown source into _generated/ |
ntek-operations/
├── README.md # "Where does X go" decision tree + SoT hierarchy
├── CONTRIBUTING.md # Commit lane rules, PR policy, frontmatter schema, ID scheme
├── CLAUDE.md # Project instructions for Claude Code
├── .claude/
│ ├── skills/ # Playbook/SOP library — single source of truth for agent workflows
│ └── agents/ # Specialized subagents (tenant-manager, discovery-analyst, etc.)
├── .github/
│ └── workflows/
│ ├── ci-per-commit.yml # Tier 1: validation + light regeneration on every push
│ ├── rollups-hourly.yml # Tier 2: time rollups, cron @ :15 every hour
│ ├── staleness-daily.yml # Tier 3: staleness + heavy reports, cron nightly
│ └── airia-sync.yml # Tier 3: drift detection, cron nightly 03:00 ET
├── crm/
│ ├── contacts/
│ │ └── _template.md
│ ├── companies/
│ │ └── _template.md
│ ├── deals/
│ │ └── _template.md
│ └── pipeline.md # Sales pipeline stages (distinct from Airia "agents")
├── tasks/
│ ├── open/
│ ├── done/
│ └── README.md
├── projects/ # Internal initiatives and cross-client efforts
│ ├── _template/
│ └── <slug>/
├── clients/ # Active client engagements (target shape; see §6.1 for migration)
│ ├── _template/
│ └── <slug>/
│ ├── profile.md # Engagement scope, retainer terms, pillar mix
│ ├── iac/ # Declarative config for this client's configured systems
│ │ └── airia/
│ │ ├── config.yaml
│ │ └── tenant.yaml
│ ├── mcps/ # Per-client MCP integrations (one folder per MCP)
│ │ ├── _template/ # Scaffolds from mcps/<slug>/ with inheritance
│ │ ├── sharepoint/
│ │ │ ├── README.md # Status, auth choice, overrides, blockers for THIS client
│ │ │ ├── config.md # Client-specific config (tenant IDs, scopes selected)
│ │ │ └── validation.md # Client-specific validation runs (refs library tests)
│ │ └── outlook/
│ ├── mcp-status.md # Client × MCP status matrix (this client's row)
│ ├── strategy/ # Discovery artifacts
│ ├── use-cases/ # Per-use-case enrichment (lifecycle state lives in Airia)
│ ├── deliverables/ # Client-facing documents by pillar
│ ├── onboarding-log.md # Timestamped state changes, sign-offs
│ └── reports/ # Generated weekly reports + MBRs (committed)
├── systems/ # NTEK-side platforms we operate in (cross-client)
│ ├── _template/
│ ├── airia/
│ ├── easycc/
│ ├── github/
│ ├── 1password/
│ ├── stripe/
│ ├── pandadoc/
│ ├── outlook/
│ ├── resend/
│ └── calendly/
├── mcps/ # MCP-type records — platform-level knowledge per MCP type
│ ├── _template/
│ ├── sharepoint/
│ │ ├── README.md # Overview, version tracking, upstream changelog notes
│ │ ├── auth.md # Auth models, scopes (required + optional), scope selection guidance
│ │ ├── tools.md # Full tool inventory with descriptions and usage notes
│ │ ├── gotchas.md # Platform-level known issues, workarounds, edge cases
│ │ ├── validation.md # Reusable validation test templates per tool
│ │ └── best-practices.md # Patterns learned across deployments
│ ├── outlook/
│ ├── stripe-mcp/
│ ├── pandadoc-mcp/
│ └── 1password-mcp/
├── time/
│ ├── YYYY-MM/
│ │ └── <client>.md
│ └── README.md # Schema, pillar enum, conventions
├── use-cases/
│ └── library/ # Reusable cross-client use case patterns
├── sops/
│ ├── onboarding.md
│ ├── mcp-integration.md # References mcps/ library records
│ ├── admin-cred-handling.md
│ ├── use-case-lifecycle.md
│ └── notifications.md
├── email/
│ ├── templates/
│ ├── automations/
│ │ └── triggers.md
│ └── README.md
├── iac/ # NTEK-level IaC (not client-specific)
│ ├── gateway-templates/
│ └── easycc-scaffolds/
├── index/
│ ├── README.md
│ ├── systems-and-mcps.md # The two-layer MCP model and system/MCP distinction
│ ├── crm.md
│ ├── tasks.md
│ ├── time.md
│ ├── sharepoint.md
│ ├── outlook.md
│ ├── resend.md
│ ├── calendly.md
│ ├── pandadoc.md
│ ├── stripe.md
│ ├── 1password.md
│ ├── sites.md
│ ├── vendors.md
│ └── integrations.md
├── agent/
│ ├── briefings/
│ └── capture/
├── scripts/
│ ├── new-contact.sh
│ ├── new-company.sh
│ ├── new-deal.sh
│ ├── new-task.sh
│ ├── new-project.sh
│ ├── new-mcp-type.sh # Scaffold an MCP-type record in mcps/
│ └── new-client-mcp.sh # Scaffold a per-client MCP, inheriting from mcps/<slug>/
├── _generated/
│ ├── contacts.csv
│ ├── contacts.json
│ ├── pipeline-dashboard.md
│ ├── client-mcp-matrix.md # Aggregated client × MCP status
│ ├── staleness-report.md
│ ├── time-by-client-YYYY-MM.md
│ ├── time-by-pillar-YYYY-MM.md
│ ├── retainer-status-YYYY-MM.md
│ └── airia-drift-YYYY-MM-DD.md
└── docs/
├── prd/
├── decisions/
├── architecture/
└── templates/ # Reusable deliverable templates by pillar
tenants/ → clients/ migration (deferred)The existing tenants/ directory stays operational during v1. The target shape is clients/<slug>/ per §6. Cutover happens once the target structure is proven out with Tegre as the pilot (see §15 step 9) and the Airia sync workflow has run cleanly for two weeks.
Existing (tenants/<n>/) | Target (clients/<n>/) |
|---|---|
config.yaml | iac/airia/config.yaml |
tenant.yaml | iac/airia/tenant.yaml |
.env | 1Password item airia-<n> (see §10.1) |
strategy/ | strategy/ |
use-cases/ | use-cases/ |
deliverables/ | deliverables/ |
reports/ | reports/ (committed) |
New profile.md, mcp-status.md, mcps/ subdirectories, onboarding-log.md, and iac/ subdirs for non-Airia systems are authored fresh during migration.
Three separate concerns, three separate record types.
relationship_type that moves through stages over time.clients/<slug>/ folder exists only while the company is an actively-delivered engagement.Contacts are stable people. Companies are relationships. Clients are engagements. A contact belongs to a company for their employment tenure. A company moves through relationship stages over its lifetime. An engagement exists only while active and is archived when it ends.
The MCP model is two-tier with explicit inheritance. This is the mechanism that makes onboarding the Nth client cheaper than the first.
MCP-type record (mcps/<slug>/) holds everything that’s true about the MCP independent of any client deployment:
README.md — overview, version tracking, upstream changelog notesauth.md — auth models available, required and optional scopes, scope selection guidancetools.md — tool inventory with descriptions and usage notesgotchas.md — platform-level known issues and workaroundsvalidation.md — reusable validation test templates per toolbest-practices.md — patterns learned across deploymentsEvery client onboarding writes to the MCP-type record unless the lesson is genuinely client-specific. This is how the library compounds.
Per-client MCP record (clients/<slug>/mcps/<mcp-slug>/) holds only what’s specific to that client:
README.md — frontmatter with based_on: mcp_<slug>, status, auth choice (selected from the library’s options), current blockersconfig.md — client-specific configuration (tenant IDs, selected scopes, tool subset)validation.md — which library validation tests have been run for this client, with timestamps and resultsRule for where a lesson lives: if it’s about the MCP platform (auth quirks, scope behavior, tool edge cases, version issues), it belongs in mcps/<slug>/. If it’s about this specific client’s environment or choices, it belongs in clients/<n>/mcps/<slug>/. When unsure, default to the library — it’s easier to demote later than to promote learnings scattered across client folders.
Every record carries a stable, prefix-scoped ID in frontmatter:
contact_<company>_<firstname>_<lastname> → contact_tegre_john_smithcompany_<slug> → company_tegredeal_<slug> → deal_securo_partnership_2026client_<slug> → client_tegreproject_<slug>task_<yyyymmdd>_<slug> or auto-incrementingsystem_<slug> → system_airiamcp_<slug> → mcp_sharepointmcp_<client>_<slug> → mcp_tegre_sharepointTime entries are embedded in monthly log files and are not individually addressable.
Cross-references use @<id> syntax inline. IDs must never change — if a record must be renamed, add an alias in frontmatter rather than reissuing.
---
id: <stable_id>
title: <string>
owner: <ben|matthew>
status: draft | published | stale | archived
last_verified: YYYY-MM-DD
criticality: low | medium | high | critical
pillar: strategy | governance | enablement | development | internal # where applicable
tags: [<freeform>]
---
The pillar field applies to: projects, tasks, client profile.md (pillar mix), deliverables, time entries. Contacts, companies, deals, systems, and MCPs do not carry a pillar — they cross-cut.
Record-type-specific frontmatter extends this. Key examples:
MCP-type (mcps/sharepoint/README.md):
id: mcp_sharepoint
upstream_version: <mcp-server-version>
auth_models_supported: [admin_consent, user_delegated, hybrid]
tools_inventory_version: 2026-04-15
Per-client MCP (clients/tegre/mcps/sharepoint/README.md):
id: mcp_tegre_sharepoint
based_on: mcp_sharepoint
client: client_tegre
auth_model: admin_consent
status: not_started | admin_configured | user_authed | validated | live | broken
owner: ben
last_validated: YYYY-MM-DD
blocker: <optional text>
published is the active source of truth.stale is auto-flagged by CI when last_verified exceeds thresholds (90 days default, 30 days for criticality: critical, 14 days for contact.last_contact on active deals).stale → published.archived records are kept for reference but excluded from agent queries by default.Use case lifecycle state is not managed here — it lives in Airia. The repo’s clients/<n>/use-cases/<n>.md carries enrichment; status comes from Airia at query time.
Each clients/<slug>/mcp-status.md contains a table with one row per MCP integration for that client. Columns:
mcps/<slug>/ and the per-client record clients/<slug>/mcps/<slug>/)not_started | admin_configured | user_authed | validated | live | brokenCI generates _generated/client-mcp-matrix.md aggregating this across all clients.
Time entries live in time/YYYY-MM/<client>.md. Each entry is a list item with inline YAML:
- date: 2026-04-20
hours: 1.5
pillar: governance
client: tegre
ref: @use_case_copilot_rollout
note: "Reviewed guardrail config, drafted injection test cases"
Pillar enum (enforced globally):
strategy — pre-use-case planning, MBRs, workshops, roadmapgovernance — security, compliance, guardrails, red teamingenablement — SSO, gateway, training, onboardingdevelopment — use case lifecycle workinternal — NTEK-internal (non-billable) work; client slug must be _internalClient slug must match a clients/<slug>/ directory or be _internal.
CI validates: pillar enum correctness, client slug existence, ref: target resolution, daily-sum sanity (flag >12h days), and missing-weekday warnings for active engagements.
_generated/ is committed but never hand-edited. CI regenerates on three tiers based on how often the underlying data changes and how fresh consumers need it.
Tier 1 — Per-commit (.github/workflows/ci-per-commit.yml). Runs on every push to main and on PRs.
@<id>) resolution checkcontacts.csv regenerationcontacts.json regenerationpipeline-dashboard.md regenerationclient-mcp-matrix.md regenerationTarget runtime: under 60 seconds.
Tier 2 — Hourly (.github/workflows/rollups-hourly.yml). Runs on cron at :15 every hour, plus workflow_dispatch.
time-by-client-YYYY-MM.md regenerationtime-by-pillar-YYYY-MM.md regenerationretainer-status-YYYY-MM.md regenerationTier 3 — Daily (.github/workflows/staleness-daily.yml + airia-sync.yml). Runs on cron overnight.
staleness-report.md regenerationairia-drift-YYYY-MM-DD.md (Airia drift detection)Manual workflow_dispatch is enabled on Tier 2 and Tier 3 jobs so any rollup can be forced when needed.
Operational commits → direct to main:
last_contact, deal stage changes, new contact/company/deal recordstime/YYYY-MM/<client>.md)onboarding-log.md entriesclients/<n>/mcp-status.md state transitions during onboarding)_generated/ regeneration (CI-authored)System commits → feature branch + PR:
mcps/ (platform knowledge, auth patterns, gotchas)systems/clients/<n>/iac/ (Airia drift fixes land via auto-PR from the sync workflow).claude/skills/The split between operational and system is reinforced by the two-layer MCP model: per-client status changes are operational; MCP-type library updates are system changes reviewed via PR. This is deliberate — library updates affect every future client onboarding.
main requires Tier 1 CI checks to pass (linting, frontmatter validation, ID uniqueness, link check)main allowed for Ben, Matthew, and agent identityStandard git history. No additional audit layer for v1. Revisit if Securo governance requires stronger attestation post-investment.
All capture is desktop-only via EasyCC and Claude Code slash commands (/track, /note, /task, etc.). Mobile capture deferred per §3.
Two tiers:
critical record exceeding SLAPush-tier rules live in sops/notifications.md. Reviewed monthly to prevent alert fatigue.
op://<vault>/<item>/<field> URIs, resolved at runtime via the 1Password CLI, MCP server, or GitHub Actions integration.NTEK-Internal — NTEK’s own secrets. Not accessible to automation service accounts.NTEK-Clients — per-client credentials. Read-only access for the Actions service account.airia-<client-slug> with fields api_key, tenant_idsharepoint-<client-slug> with fields per auth model<system-or-mcp>-<client-slug>sops/admin-cred-handling.md, with an explicit elimination roadmap tracked per-client.index/1password.md.GitHub Actions use 1password/load-secrets-action@v2 backed by a 1Password Service Account scoped to the NTEK-Clients vault only. The service account token is the only secret stored in GitHub (OP_SA_TOKEN); all other secrets dereference at workflow runtime:
- uses: 1password/load-secrets-action@v2
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SA_TOKEN }}
AIRIA_API_KEY: op://NTEK-Clients/airia-${{ matrix.client }}/api_key
AIRIA_TENANT_ID: op://NTEK-Clients/airia-${{ matrix.client }}/tenant_id
Rotate the service account token yearly or on personnel change.
.claude/skills/ is the playbook libraryAll agent-executable workflows live in .claude/skills/<n>/SKILL.md. Single source of truth for agent procedures. EasyCC and Claude Code both execute skills against the same conventions.
Skill categories map to the Four Pillars plus cross-cutting ops:
| Pillar | Skills |
|---|---|
| Strategy | /discovery, /plan, /client-overview, /use-cases |
| Governance | /guardrails, /governance, /redteam |
| Enablement | /users, /gateway, /deliverables |
| Development | /use-cases, /lifecycle, /run, /projects |
| Ops (cross-cutting) | /status, /import, /diff, /onboard, /reports, /track, /pr, /ci-status, /lint, /new-client, /new-mcp-type, /new-client-mcp |
The continuous learning system (.claude/skills/continuous-learning/) captures operational patterns as instincts from tool usage. Instincts graduate into formal skills via periodic evolve review.
Runs locally via EasyCC, triggered on a schedule. Reads:
last_contact thresholds, active tasks, open client × MCP matrix cells, playbook triggers, open airia-drift PRs)Produces:
agent/briefings/YYYY-MM-DD.mdemail/automations/triggers.md/track.github/workflows/airia-sync.yml runs nightly (default 03:00 ET) and on manual dispatch:
clients/*/iac/airia/ (only clients with an Airia engagement)python -m airia.cli diff <client>python -m airia.cli import <client> to regenerate config from live stateairia-drift with the diff in the bodyprofile.md frontmatter)critical-drift and fire a push notification per §9.2_generated/airia-drift-YYYY-MM-DD.mdCritical constraint: the action only flags resource config drift. It does not overwrite use case lifecycle state — Airia remains authoritative for AgentRequest status, and the repo’s use-cases/ enrichment is never touched by the sync.
Weekly reports (/reports <client>): per-client HTML/PDF/EML generated from time/YYYY-MM/<client>.md, client use case activity (read from Airia), and delivered artifacts. Runs on Fridays. Output lands in clients/<n>/reports/weekly-YYYY-WW.{html,pdf,eml} — committed to git for historical auditability.
Monthly Business Reviews (/reports --mbr <client>): pillar-hour breakdown, use cases advanced, deliverables shipped, roadmap progress, retainer status with rollover math. Output lands in clients/<n>/reports/mbr-YYYY-MM.{html,pdf} — committed to git. Template in docs/templates/strategy/mbr.md.
Retainer rollover math is driven by profile.md frontmatter (retainer.contracted_hours, retainer.rollover_enabled, retainer.rollover_cap) and reads directly from the time log — no external dependency.
/reports --all generates reports across every active client in one pass.
Report file size is a known future concern; revisit at v1.5 if repo size becomes an issue.
main, post-hoc review via git historyWhen an agent (or human) learns something during a client MCP onboarding, the classification step is explicit:
mcps/<slug>/ via PR (system commit).clients/<n>/mcps/<slug>/ via direct commit (operational).Skills that run MCP onboarding (/onboard, /new-client-mcp) prompt explicitly for this classification at the end of each session.
| Term | Definition |
|---|---|
| Airia Agent | A runnable AI pipeline in the Airia platform. Called “pipelines” in the Airia API and Python client code; called “agents” in all user-facing NTEK documentation. Code matches the API; docs match the mental model. |
| Agent Request | A use case record in Airia (AgentRequest API). Drives the use case lifecycle. Distinct from an Airia Agent. |
| Pipeline | In this repo, refers exclusively to the CRM sales pipeline (crm/pipeline.md). Never used for Airia agents in NTEK-authored docs. |
| Client | A company with an active engagement, represented under clients/<slug>/. Not every company is a client. |
| Company | Any organization NTEK tracks (prospect, active client, former client, partner, investor, vendor). Engagement state lives in relationship_type. |
| Contact | A person. Stable across company changes. |
| Deal | A sales opportunity on the CRM pipeline, owned by a company. |
| Project | An internal initiative or cross-client effort, distinct from a client engagement. Lives under projects/. |
| Use case | A specific delivery work item within a client engagement. Enrichment in clients/<n>/use-cases/; lifecycle state in Airia. |
| System | A platform NTEK operates in (Airia, EasyCC, GitHub, 1Password, Stripe, etc.). Cross-client. Lives in systems/. |
| MCP (type) | The platform-level knowledge for an integration type, independent of any client. Lives in mcps/<slug>/. Compounds value over time as lessons are written back. |
| MCP (per-client) | The specific deployment of an MCP for one client. Lives in clients/<n>/mcps/<slug>/ and references the MCP-type record via based_on. |
| Pillar | One of the Four Pillars (Strategy, Governance, Enablement, Development) — activity categorization for time tracking, skills organization, and reporting. internal is a reserved pillar slug for non-billable NTEK work. |
time/ may need to move to a private submodule to control visibility.tenants/ → clients/ migration timing (target shape defined in §6.1; execution gated on pilot + 2 weeks of stable Airia sync).Timeline: fast (no fixed date). Delivered in order. Each step is a committable unit; no step blocks the next — the repo is usable after step 1 and gets more valuable with each subsequent step.
README.md, CONTRIBUTING.md, CLAUDE.md. Covers: ID scheme, commit lanes, frontmatter schema, pillar enum, naming conventions, 1Password item naming, CI tiers._template/ records for contacts, companies, deals, tasks, projects, clients, systems, MCP-types, per-client MCPs, use cases.new-contact.sh, new-company.sh, new-deal.sh, new-task.sh, new-project.sh, new-mcp-type.sh, new-client-mcp.sh.@<id> resolution, link check, light _generated/ regeneration.OP_SA_TOKEN stored as the sole GitHub repo secret. Airia client creds migrated from existing tenants/*/.env files.clients/tegre/ built in target shape, including mcps/ subdirectories that reference the library records from step 9.clients/tegre/iac/airia/ populated from existing Tegre config.time/README.md + pillar enum + entry format. Rewrite /track skill. Harvest backfill handled manually./reports reads from time/ instead of the Harvest API. Retainer rollover logic ported. Verify Tegre rollover math matches prior output for the last three months./reports --mbr implemented. Template in docs/templates/strategy/mbr.md. First MBR generated for Tegre as acceptance test.sops/notifications.md.tenants/* to clients/*. Remove legacy tenants/ directory.