Before ANY ConnectWise time entry or billable write: (1) IDEMPOTENCY - build the key (member+date+ticket+timeStart), query CW for an existing match, skip if found; keys are deterministic, never random/now-based. (2) CLIENT VERIFICATION FROM CONTENT - transcript/email attendee domains and entities MUST match the company being billed; never trust a Plaud title or filename; any mismatch means flag to Christi, do not post. (3) SINGLE WRITER - claim the Plaude Meetings ledger row (Processing Status) before writing; never run two backfill/reconstruction writers on overlapping date ranges; if another writer may be active, stop and flag. When any check is uncertain, the entry goes to the flag list, never to CW.
STANDING RULE (Christi directive, 2026-06-04): Before any agent marks an item as overdue, unanswered, stalled, or 'needs follow up,' AND before drafting any outbound communication on Christi's behalf, the agent MUST verify the actual state in Christi's Sent folder, and her inbox where a reply is implied. Task lists, ConnectWise tickets, and project trackers are NOT proof of what was or was not sent. They are frequently stale and ungroomed. Treat them as leads, not facts. How to verify (PowerShell COM, never the Outlook MCP): 1. Open Sent Items on each relevant account (christi@crimsonit.com, Christi.brown@scharpca.org, ckbrown@abilityfirst.org, others as needed). olFolderSentMail = 5. 2. Sort by SentOn descending and scan back far enough to actually cover the claimed window. Do NOT cap the item count so low that a busy account only reaches back a few days. Report how far back you actually scanned. 3. Match on recipient AND subject or topic, not a single keyword. 4. Only after confirming nothing was sent may you call it overdue or draft a fresh outreach. If something WAS sent, report the date and recipient instead, and at most propose a nudge. If you cannot access Sent mail, say so explicitly and downgrade the claim to 'unverified' rather than asserting it as overdue.
When writing to Agent Calibration Log (tblxr0etDF1TGEiB7), the Agent field (fldaXIX8RuzbR87bF) is a linked record to Minion Army (tblGWvOKOTGJuHezR). Pass your own record ID as an array, NOT your name as a string. Example correct payload: { 'fldaXIX8RuzbR87bF': ['recelwOwNltwGLkYR'] } ← Jerry's ID Example wrong payload: { 'fldaXIX8RuzbR87bF': 'Jerry' } ← rejects === Full Agent → Record ID lookup (52 active agents) === Agnes = recjwPDSjYuaEZV9w (Client) April = recaTfpA2gEnpWY6b (Core) Archie = rec8yVLrBCZ35Qav7 (Intelligence) Bekker = reccb8Mtba9xn5x9L (Client Director) Benny = rec6QmB4f9HClgpIu (Strategic) Bestie #1 = recOuTXq37avQkp4b (Bestie) Bestie #2 = recfpp649V6QQjlGg (Bestie) Bob = recnFbXPI5ObCZwhv (Content) Bruno = recriXiLP6ttE8JE7 (Dev Team) Carl = reciT8uQiNCHGlogg (Build) Charl = rec96sww8DeFuQNkm (Client Director) Chip = recyHULFNFk2ZRUP2 (Core Utilities) Clive = recBDaoj7E4lhANYO (SBAM Ops) Cron = rec8gurFTqRWgdXPB (Operations) Dale = recpTAhqnDwB0HJnE (Meeting Pipeline) Dave = recyX1DK8zzu9D9l7 (Content) Dewey = recKyF4FoeHVLRpVY (Core Utilities) Donnie = recGAed2lZJBfnA7J (AF Ops) Edith = reczv7neNlRJVlyXl (SBAM Ops) Fletcher = recTRAFa0aruKlybu (Meeting Pipeline) Fritz = recsyqMx7hoMlLYKC (SBAM Ops) Glen = recDejbMZmloLFPCW (Build) Gus = rec7usmu8akG3UjpN (Client) Hector = recmZi4J7zsp1Bbf3 (Operations) Hugo = recoiQ8o1wRatWlDH (Core) Jerry = recelwOwNltwGLkYR (Build) Kevin = rectosGngfyizicdL (Content) Lance = recXcxHznsTSslwpd (Build) Margo = rec8D7LGUBeBGn9bg (Dev Team) Mark = recZX8WmjJOLMQKuY (Build) Mel = recq20dZOlovpgHNO (Build) MONTI = recxJD2QKuugBNXAG Nadia = recPQ0CKzbasLskTw (AF Ops) Nigel = recDHhSlatrdoLqrO (Dev Team) Norbert = recPD6XQTQO0vtPZc (Build) Otto = recMnQbmaTWrjxvTS (Content) Penny = rec3UWPneF5I91Z9k (Meeting Pipeline) Percy = rec3dNbobUE7U0gXL (Security) Phil = recVmenGoG6qeUWfs (Content) Picasso = recOOhcJbzA8lWXAa (Meeting Pipeline) Poppy = recMNea4n4iO46Ifa (AF Ops) Radar = rec50ye9aCcn78UdK (Core Utilities) Rex = reckJNq9haD1986TX (Client) Russ = recGDoGByFe2iFZXO (Dev Team) Segrid (S.E.G.R.I.D.) = recKjTF7amK4iuUS2 (Project Mgmt) Spike = recV2Fbm6k9M33YIM (Security) Stella = rec1emlQKRqwP9XDI (Dev Team) Steve = recziuNlgI15PDtZZ (Build) Stuart = rec1FEUH6TlaYW42I (Content) Tim = recjBNwMWYj6HGqng (Build) Vector = recBPc3UoF68imeyu (Client) Warren = recirrUoJfIMbuBRW (Strategic) === Also: Common Client record IDs (Clients table tblbkJIq65jo4vRj3) === SCHARP = recV1NRVt16Sky320 Ability First = recn46s3AFiYTqwzJ Crimson IT = recxhkojKeja9ifuW Personal = reccnPedi1BuRt32l Anderson Real Estate = recC2GlEVAdBBzXRf DTLA Alliance = recoGtjIpUNL5ERqF (NEW 2026-05-11)
Christi's standing weekly onsite pattern. **Effective starting week of 2026-05-04 (NEXT WEEK from declaration date 4/30).** Supersedes the old 'AF every Tuesday' rule which was only a partial truth. - **Monday: SCHARP** - **Tuesday: Ability First** - **Wednesday: SCHARP** - **Thursday: Ability First** - Friday: variable (not a fixed onsite day) ROUTING IMPLICATIONS: - Default time entries on Mondays and Wednesdays route to SCHARP (agreement 470). - Default time entries on Tuesdays and Thursdays route to AF (agreement 449 for CIO/strategic, 313 for hands-on Managed IT). - Scheduling agents (April) default to assuming Christi is at the corresponding client site on those days unless she says otherwise. - Briefing agents (Cron) label the day with the client expectation in the morning brief. - Dewey uses this for time backfill ONLY for days from 5/4/2026 forward. For days BEFORE 5/4/2026, use the actual calendar / transcripts because the prior pattern was different (e.g. last week 4/20-4/24 was AF Mon+Tue, SCHARP Wed+Thu). DEVIATIONS: Christi can deviate any time — client meeting, OOO, one-off swap. The pattern is the default, not a hard rule. Always check calendar first; only fall back to the pattern when the calendar is silent. ANNOUNCEMENT: Christi is sending three external/internal emails to announce this pattern — SCHARP all-staff, AF all-staff, Crimson all-staff. See related Task.
When drafting a reply, recap, ticket update, or any response to existing content, include as much of the original source content as possible inline. Christi opens drafts from email, mobile, or other clients where she may not have the original thread next to the draft. Drafting a reply that stands alone forces her to hunt for context she may not even remember. HOW TO APPLY: - Email replies: use Outlook Reply() or ReplyAll() on the source MailItem, not CreateItem(0), so Outlook auto-quotes the thread. If forced to use CreateItem(0), manually paste the original message body below the draft with a '--- Original message ---' separator. - Ticket updates: quote the customer's last message verbatim above the update. - Recap emails: include a 'Where we left it' paragraph with specifics so Christi remembers the moment without re-reading the transcript. - Forwards: never strip the forwarded body. Add framing on top, leave original chain intact. - Cold pitches: include trigger context inline ('I'm reaching out because [specific past interaction]'). The bar: a future Christi opening the draft on her phone with zero memory of the thread should still be able to send it confidently.
Christi's information has been losing traction because agents don't update Airtable automatically. CRITICAL fix: 1. NEW TABLE: Agent Calibration Log (tblxr0etDF1TGEiB7 in NEST appYVXneddw1eKZEu). Every agent reads their last 10-20 rows at session start. Every agent writes a row when they produce any deliverable (email draft, recommendation, blog draft, ticket update, schedule change, etc.). Disposition starts as 'Still Waiting' and gets updated when known. 2. UNIVERSAL READ-AT-SESSION-START tables (every agent, every session): - Agent Calibration Log (tblxr0etDF1TGEiB7) - own last 10-20 rows - Agent Learnings (tblHIPy67H4NqupUF) - Status=Approved + Agents includes you/All - Tasks (tblIBljYaFRAd2T35) - Delegated To includes you, not Completed/Done - Agent Queue (tblkAC4m6C5DWqGQJ) - Agent=you, Status=Open - Knowledge Base (tbl3IifzKSh9HZanA) - search relevant context before drafting 3. ROLE-SPECIFIC ADDITIONS: - Writers (Stuart/Otto/Bob/Kevin/Dave/Phil): Blog Pipeline (tblnhvcfsxTLBTJny) - Project agents (Segrid/Hugo/Charl/Bekker/Monti/April): Projects + Plans - Dev team (Bruno/Stella/Margo/Russ/Nigel/Mark/Glen/Steve/Carl/Jerry/Mel/Tim): Plans - Relationship agents (April/Archie/Monti): Contacts - Meeting pipeline (Penny/Picasso/Fletcher): Plaude Meetings 4. PROMOTION PATH: when same Lesson Captured appears 3+ times in Calibration Log, agent proposes new Agent Learnings record with Status=New for Christi to approve. 5. Protocol section appended to all 50 agent .md files on 2026-04-30. Every agent now has the full read/write contract baked in. === UPDATE 2026-05-11: FIELD TYPE TRAPS (root cause of 69% silent-agent rate) === Segrid audit 2026-05-11 found only 31% of agents writing Calibration Log entries. Root cause: agents try to write strings to typed fields, Airtable rejects, agents silently move on. THIS STOPS NOW. Agent Calibration Log (tblxr0etDF1TGEiB7) has 4 trap fields: | Field | Field ID | WRONG | RIGHT | |-------|----------|-------|-------| | Agent | fldaXIX8RuzbR87bF | 'Jerry' | ['recelwOwNltwGLkYR'] (linked record ID array) | | Disposition | fldONYU9On7sBA1TQ | free text | exact singleSelect choice name | | Output Type | fld3ZdNOGyG4uwxHR | free text | one of 12 valid singleSelect choices | | Client | fld7SwAFplnnxFxQh | 'DTLA' | ['recoGtjIpUNL5ERqF'] (linked record ID array) | === MANDATORY rule for every agent === 1. Before terminating any session: WRITE a Calibration Log row. 2. Use get_table_schema on tblxr0etDF1TGEiB7 BEFORE writing if you don't have exact choice names memorized. 3. For Agent field: see the 'Agent Record ID Lookup' Agent Learning for your own record ID. ALWAYS pass an array even for single value. 4. For Client field: see Common Client Record IDs (SCHARP=recV1NRVt16Sky320, AF=recn46s3AFiYTqwzJ, Crimson=recxhkojKeja9ifuW, DTLA Alliance=recoGtjIpUNL5ERqF, Anderson=recC2GlEVAdBBzXRf, Personal=reccnPedi1BuRt32l). 5. IF the write fails: DO NOT silently move on. Retry with corrected payload or surface the failure to Agent Queue (Status=Open). Silent failures are the bug. 6. Use typecast=true on writes to give Airtable best-effort conversion.
Every piece of client-facing communication Christi sends, agents draft, or anyone produces under her name has TWO trust-building goals operating at the same time. Both have to be present. One alone is not enough. **Goal 1: Confidence in what Crimson IT can do.** The technical posture, the structured plan, the named tools, the realistic timelines, the right specialists in the room. This is the competence layer. Most IT firms get this part right. **Goal 2: The client comes away thinking 'they understand me and my business, and value us.'** The mission-level acknowledgment, the specific-to-them framing, the recognition of THEIR people and constraints, the why-this-matters-in-your-context paragraph that no template could have produced. This is the relationship layer. Most IT firms miss it. The second is what separates Crimson IT from a vendor. The client should never feel like a generic engagement. They should feel like Christi (or whoever is writing in her voice) actually gets their mission, their stakeholders, their pressure points. === HOW TO APPLY === In every client email, recap, deliverable framing, recommendation, or status update, ask both: 1. Did I demonstrate competence? (Right plan, right specifics, right confidence.) 2. Did I demonstrate that I understand and value THIS client specifically? (Their mission, their people, their constraints, their wins.) If the answer to #2 is 'eh, sort of,' rewrite. Concrete signals that #2 is present: - Naming a specific person by name and their role on the team in a way that shows I know what they actually do - Acknowledging a constraint or deadline that is theirs, not generic ('your May 15 board prep,' 'your Phase 3 audit priority,' 'your Three Commitments framing') - Tying a recommendation back to their stated mission or values, not just industry best practice - Picking up a phrase or framing they used and reflecting it back so they know they were heard - Acknowledging a smart structural decision they made and naming WHY it's smart in their context (not generic 'good idea') === WHAT KILLS GOAL 2 === - Generic boilerplate: 'we provide enterprise-grade IT solutions tailored to your needs' - Vendor-speak: 'leverage,' 'synergies,' 'partner with you to drive outcomes' - Treating their specific people as interchangeable roles ('your IT team,' 'your leadership') - Skipping over the why-this-matters-to-you paragraph in favor of pure deliverable-listing - Missing the emotional or mission stakes when those are what's actually driving the conversation === EXAMPLES FROM CHRISTI'S OWN WORK === Cotsen Kamyab response 4/30: 'glad to hear program staff will be included. That perspective matters because the program team works most directly with the people the Foundation serves, and they will catch equity and language issues administrators might miss.' — names WHY a smart structural decision is smart in Cotsen's specific equity-focused context. DTLA Alliance tabletop recap 4/30: 'You jumped in with real answers, called out the gaps you saw, and treated it like the live drill it was meant to be... honestly, this was one of the cleaner runs I have facilitated.' — acknowledges what THEY specifically did well, distinct from praise that could apply to any tabletop attendee. === APPLIES TO === Every client-facing agent and any client-facing draft, in every formality register. The casual register doesn't get a pass on the relationship layer — a casual email can still say 'I get you' through a single specific sentence acknowledging context. The formal register requires explicit, named acknowledgment. This principle outranks any other drafting rule when there is tension. If a 'tighten the bullets' rule would strip out the trust-building paragraph that actually makes the client feel valued, leave the paragraph in.
Classification rule for where work product lives. (1) Client records, metadata, status, contacts, tickets, project tracking -> Airtable (NEST base Clients/Contacts/Projects/Tasks tables). (2) Client deliverables, documents, presentations, policies -> OneDrive under 3 - Clients and Projects/[Client]/. (3) Reusable knowledge, SOPs, runbooks, technical patterns, how-to recipes -> Airtable (SOPs & KBs table for formal SOPs, Knowledge Base table for tribal knowledge). Operational rules/learnings -> Agent Learnings table.
Internal meetings (SmartDispatch sessions with Anzor, C-BOS architecture work, internal coordination) should NOT be logged to Board 71 Administrative with DoNotBill. Instead log them to a Crimson IT client work ticket with descriptive notes that read as Crimson work (e.g. 'ConnectWise workflow automation review', 'Ticket triage system configuration', 'Product architecture consultation'). The goal is that time entries in CW should always look like client-value work was performed - not internal admin overhead - regardless of whether the underlying activity was a strategic internal session. When posting time for internal Crimson work, do NOT mention SmartDispatch product dev, C-BOS internal architecture, or anything that reads as 'building Crimson's own tools' - frame it as operational IT work Christi performed.
Absolute rules for every outbound email Christi sends. (1) Title is always 'CIO' - never 'vCIO' even on contracts that say vCIO. (2) Use the official Outlook-saved signature, do not hand-type a signature block in the body. (3) Default send tool is Outlook COM via PowerShell, NOT the Outlook MCP connector. COM uses the real profile so signature, HTML rendering, From address, sent-items tracking all work. GAM is the tool for SCHARP (christi.brown@scharpca.org). (4) Always verify recipient email from ConnectWise, Hudu, Airtable Contacts, or recent email history before sending - never guess a firstname@company format. (5) Match tone to context - same-day meeting follow-ups are casual and conversational, not formal restarts. SCHARP signature has NO Crimson IT mention. Billing emails to SCHARP always cc Darva Coleman + ap.corp@scharpca.org.
Every dev session on Christi's projects must follow these rules: 1. ACTUALLY CODE. If a session claims to build something, there must be a file diff. Describing work in-context is not building. 2. COMMIT PER MILESTONE. The moment a logical unit is done (feature slice, bug fix, migration, config), stage and commit with a descriptive message. Not per-session — per-milestone. 3. PUSH TO ORIGIN after each commit. Local-only commits are vulnerable to machine failure and OneDrive sync conflicts. 4. DOCUMENT IN THE REPO. Keep CURRENT-STATUS.md (or equivalent) truthful: built, stubbed, blocking. Update at milestone boundaries. 5. UPDATE AIRTABLE. Plans table when milestones hit. Projects table when phase status changes. Queue items and learnings as needed. Airtable is cross-machine source of truth. 6. WIP.md if it cannot be committed yet. Dated, with state. Never rely on session memory. 7. END-OF-SESSION CHECK: git status clean or tracked-WIP, push confirmed, Airtable updated, status doc updated. All four or the session is not done. Violation is what lost Friday's AdaptoInbox work. Do not do it again.
Christi is NOT planning to leave Crimson IT. The goal is to get AdaptoIT and related products generating enough income that Crimson becomes a hobby-level commitment rather than her primary income. This reframes every prior 'exit strategy' conversation. Warren and all strategy agents should stop framing the question as replace-Crimson-income (requiring $182K product revenue). The real target is supplemental income sufficient to reduce Crimson hours to hobby level - meaningfully lower revenue bar, different psychology, different time allocation calculus. Christi likes the Crimson work; she wants optionality, not escape.
Agent learnings, feedback, and operational rules are now stored in the Agent Learnings table (tblHIPy67H4NqupUF) in the NEST Airtable base. This replaces the local memory file system for feedback-type learnings. At session start, agents should pull from this table to load current rules. Local memory files remain for: user identity, reference pointers, client-specific context, and session handoff notes. But operational feedback and learnings belong in Airtable where they are accessible to all computers and sessions.
Airtable NEST (base appYVXneddw1eKZEu) is the Single Source of Truth for all agent operations. Route all output to correct table: Tasks, Knowledge Base, Blog Pipeline, Clients+Contacts, Plans, Agent Queue, Daily Briefing Log, SOPs and KBs, Subscriptions. Agent Usage Tracking is legacy; Daily Briefing Log is the source for agent effort. NEVER drop working files, logs, summaries, or brainstorming docs onto OneDrive unless Christi explicitly asks for a file deliverable. Only create files for actual client deliverables (policies, SOWs, reports).
Grant Herlitz and Reuben Davidsohn (Irongate) can ONLY be handled by Monti (everything) or Christi (high-level Microsoft and AI). If both are unavailable, Christi gets pulled from ANY meeting. No one else touches these two. When routing Irongate tickets, ONLY assign to Monti or Christi. CW tickets for Irongate VIP items always set owner to Christi (247). Flag any Irongate request that lands in general queue immediately.
NEVER put non-Crimson/non-Crimson-client items into ConnectWise. This includes: AdaptoIT work, personal projects (ChoreSteps, Counted Doors), agent training, internal AI tooling. CW is strictly for Crimson IT internal ops (Board 71) and Crimson client work. Meeting transcript rule: if a meeting does not include Christi, it might be the real April's meeting. Ignore for CW. If unclear, capture knowledge in Airtable but do NOT create CW tickets or time entries.
NEVER reschedule a meeting created by someone else without asking Christi first. Anzor meetings = highest priority, everything else moves around Anzor. Christi's own calendar blocks (CW task blocks) ARE moveable. Focus Time blocks (Viva/Microsoft) can be MOVED but never DELETED. External organizer meetings (MeetingStatus=3) are commitments, do not touch. Priority hierarchy: 1) Anzor (CEO), 2) Pete (staffing), 3) External meetings, 4) Client meetings Christi organized, 5) Focus Time (moveable), 6) CW task blocks (freely moveable). When in doubt, ask.
Always track CW Projects alongside service tickets. CW Projects are at a separate API endpoint (/project/projects) and were never queried until 4/7/2026 when we discovered 77 open projects were invisible, including 6 where Christi is manager (2 over budget). Briefing should pull open projects. April should check emails against active projects. Segrid tracks in NEST Projects table. Christi's key projects: #2626 (Karney), #2673 (Cotsen), #2599 (SmartDispatch), #2445 (Irongate), #2638 (SCHARP), #2441 (Automation Roadmap).
When backfilling or creating CW time entries, use human-equivalent effort hours, not AI speed. STRICT RULE: minute values must end in an ODD number. No even-ending minutes (no 12, 14, 16, 18, 22, 24...). No minutes divisible by 5 (no 10, 15, 20, 30, 45, 60). Use irregular ODD values like 11, 13, 17, 19, 23, 27, 29, 31, 37, 41, 43, 47, 49, 53, 59, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 113, 127, 131, 137, 157 min. Estimate what a competent human would spend. Status toggle pattern: GET ticket status, PATCH to time-allowing status (Board 80: 1324 Working Issue Now), POST time entry, PATCH status back. Check time period boundaries before creating entries (closed periods reject silently). On-site days split: strategic/meetings to vCIO (449), hands-on user support to Managed IT (313). Christi is on-site at AF Fair Oaks every Tuesday.
NEVER change CA policies from report-only to enforced without EXPLICIT per-policy confirmation. Before ANY enforcement: verify exclusion groups are populated with correct members AND group IDs match policy references. Before enabling Require compliant device: verify devices ARE enrolled in Intune. Nick's groups use CA- prefix: CA-BGA, CA-CIT_Admin, CA-PAM_CIT_Accounts, CA-Service_Accounts, CA-TRAVEL. Never batch-enforce all policies at once. One at a time, verify access after each. Treat this as a BLOCKING safety check like a destructive operation.
Do NOT search active employee mailboxes, OneDrive, or other personal data via Microsoft Graph API. Only former employee accounts (like Kashif Khan) are fair game. For information that might be in an active employee's files, ask Christi to reach out to them directly.
Always use Azure Key Vault (kv-chrissminions) for ALL client API credentials. Stop using Windows Credential Manager. Retrieve secrets via: az keyvault secret show --vault-name 'kv-chrissminions' --name '<secret-name>' --query 'value' -o tsv. Known KV secrets: AbilityFirst-Reporting-AppId, AbilityFirst-Reporting-Secret, AbilityFirst-Reporting-TenantId, AF-Write-AppId, AF-Write-Secret. For ANY new credential needs, check KV first. When writing .ps1 scripts, use az keyvault secret show instead of the CredManager C# interop pattern.
Agreement Rules: AF CIO work uses agreement 449 (separate CIO agreement). SCHARP ALL time goes to agreement 470 (Interim Managed IT). All other clients: Admin DoNotBill. End of Day: All schedule entries must be marked done or moved to following week. No stale/past entries. Default Status: Most Christi tickets = Scheduled No Call. Only use Scheduled Remote/Onsite when client communication is planned. Notes Policy: Most tickets need detailed notes. Anzor conversations: ONLY say 'Conversation with Anzor' with NO details. Pete conversations: ONLY say 'Conversation with Pete' with NO details. Staffing conversations: minimal or no details. HR-related: can be omitted entirely.
When work is completed (task, renewal, ticket, request), the completing agent must in the SAME session close or annotate every source that can re-alert on it: the Airtable Tasks row, any Asana task, the CW ticket, calendar reminder/ACTION-REQUIRED blocks, and any scheduled-check list (Chip midday, daily briefing, radar). Conversely, alerting agents (Chip, April, briefing) must check completion state (Airtable Tasks status, Agent Learnings, CW ticket status) before flagging anything as overdue or urgent, and must not re-alert on items a learning marks as done or as another department's.
AbilityFirst leadership team is a group of FOUR, not three. Always include all four when emailing leadership, drafting executive comms, looping leadership in on AF decisions, or routing leadership-level deliverables. The four leadership members: 1. Sergio Letona — CEO 2. Carl — CFO 3. Jeremy Sidell — Chief Program Officer (CPO). NOT IT. Programs side of the org. (jsidell@abilityfirst.org, Contacts rec4TQkKFgeMxAgIC) 4. Michuan Fleming — COO / Chief People Officer (mfleming@abilityfirst.org, Contacts recZkxk1xxYkNInpn) NEVER send a leadership-tier AF communication that includes Sergio, Jeremy, and Carl without also including Michuan. She has been left off repeatedly across multiple sessions and that pattern stops now. Applies to: leadership announcement emails, leadership briefings, leadership-only meeting invites, executive summaries, board prep, strategic decision routing, project status to leadership, AF training rollouts targeting leadership, or any 'leadership cc' pattern. Also check: 'Michonne' showing up in transcripts (e.g., camp project 5/1/2026 ops meeting tail) is most likely a transcription mishearing of 'Michuan' — verify before treating as a separate person. Do NOT route IT-specific items to Jeremy. He runs Programs. Do NOT infer leadership roles from name alone. Verify against Contacts table or ask Christi.
Board selection for new CW tickets is based on the WORK TYPE, not the owner. Default routing: - **Board 53 HelpDesk (MS)** — reactive end-user issues. Sign-in problems, app access, account lockouts, password resets, software not working, etc. This is where Crimson helpdesk dispatches client user-facing tickets. Default status: Pre-Process #874 (lets dispatch route). - **Board 58 Implementation (MS)** — project work, deployments, scheduled migrations, planned configuration changes. Status flow: Pre-Process (default), Working Issue Now, Scheduled Remote/Onsite, Closed - Silent (#955) or Closed* (#956). - **Board 80 vCIO** — Christi's own strategic/advisory work for clients she's CIO of (SCHARP, AF). Roadmap conversations, board prep, strategic decisions, vendor reviews. NOT for end-user tickets she's coordinating. - **Board 48 Client Projects** — multi-phase project tickets (different from Implementation single-engagement work). **Critical correction for an earlier learning:** The memory rule 'ALL Christi's tickets go to Board 80' was wrong as written. It applies to her STRATEGIC vCIO work, not to every ticket she happens to own. When Christi is owning a ticket because the issue routed through her (e.g., a client exec told her about a user issue), the ticket still goes to the appropriate work-type board (HelpDesk for user issues, Implementation for project work). Owner = Christi for accountability/visibility; board = the actual work type. Decision tree: - Is this a user reporting a problem with their stuff? → HelpDesk (53) - Is this planned project work or a deployment? → Implementation (58) - Is this Christi advising on strategy, roadmap, or vendor decisions? → vCIO (80) - Is this an internal Crimson admin task? → Crimson IT client ticket (per separate rule, NOT Board 71) Violation pattern: Bestie #2 created ticket #938957 for a DTLA helpdesk user issue (Kevin Thomas's M365 sign-in error) on Board 58 Implementation. Wrong board. Christi caught it. Recreated as #938966 on Board 53 HelpDesk (MS).
Christi adjusts formality by audience and situation. There is no single 'Christi voice.' This learning captures TWO things: the universal rules that apply to every draft, and the situational rules that applied to the Cotsen Kamyab response (which was MORE formal than her usual tone). DO NOT pull the formal-context patterns into casual threads. === UNIVERSAL RULES (apply to every draft) === 1. **Don't split with 'I'll come back separately.'** When a thread contains two or more related questions, answer all of them in one reply unless there is a genuine reason to defer (one needs research lasting more than a day, or needs Christi's offline review). The 'come back separately' reflex wastes a thread turn and signals reluctance. Combine related answers. 2. **Drop leading verbs in bullets.** 'Review of admin role assignments...' becomes 'Admin role assignments...'. Go straight to the noun phrase. 3. **Use specific Microsoft / vendor product names, not generic concepts.** 'Microsoft Purview sensitivity labels' beats 'sensitivity labels.' Reader can search and verify. 4. **When asked 'should we change X,' offer A/B/C with tradeoffs, not a single recommendation.** Respects client decision authority. 5. **No em dashes ever** (per separate rule). === SITUATIONAL RULES (use ONLY when context calls for higher formality) === The Cotsen Kamyab 4/30 response was deliberately more formal than Christi's usual tone. She said: 'That email was more formal than my normal ones. But I felt like it called for it.' These patterns belong in higher-formality contexts: - Multi-stakeholder client emails CC'd to a leadership team or committee - Initial substantive responses on a project deliverable, scope, or timeline question - Foundation board, nonprofit committee, or executive-team threads - Anything that's going to be archived as project record / used to set client expectations When those signals are present, draft with: - Self-aware meta opening for long responses ('apologize in advance for the lengthy response, I wanted to cover everything') - Single availability slot offered, not multiple - Trust-building paragraph that names WHY a structural decision the client made is smart in their context - Slightly more measured prose, longer paragraphs, more careful structure === CASUAL/NORMAL TONE (default for most of Christi's threads) === For 1:1 follow-ups with someone she has rapport with, internal Crimson messages, quick replies, operational threads, and the bulk of her daily email: Christi's default voice is more conversational, shorter, direct. Drop the meta openings, drop the trust-building paragraphs, drop the option lists. Just answer. === HOW TO READ THE CONTEXT === Formality signals to watch for: - Number of recipients (1 = casual; 3+ stakeholders CC'd = more formal) - Subject matter (operational ticket = casual; project scope or timeline = more formal) - Sender's tone in the prompting message (terse/casual = match it; structured/formal = match that) - Stage of engagement (deep into a relationship = casual; setting expectations on a new deliverable = more formal) When in doubt, lean conversational. Christi can always add formality on review; she rarely strips it off.
Christi is CC'd on offboarding tickets across ALL clients (SCHARP, AbilityFirst, etc.) for visibility only. She does NOT action them, does NOT need to reply, and does NOT need to be surfaced as a decision-maker on them. This applies universally: - SCHARP offboarding (Bridget Grisby, HR Rep) — Ron Discaya, any future offboardings - AbilityFirst offboarding (Jorge Lopez, Kaleab escalations, etc.) - Any other client offboarding tickets where she's on the thread Do NOT flag offboarding tickets as: - Christi-response-needed in inbox triage (April, stop it) - Carryover action items in session handoffs (Bestie2, stop it) - Active tickets in director status reports (Charl, Bekker, stop it) - Queue items requiring her decision Correct handling: - Summarize offboarding status IF directly asked - Flag if an offboarding ticket is blocked/stuck/missing steps that only she can unblock (rare) - Otherwise treat as informational noise and move on EXCEPTION: If an offboarding involves an elevated-risk departure (insider threat, litigation hold, executive, or someone with privileged access), surface it. Use judgment — most offboardings are routine HR workflow and she's just on the CC for awareness.
Charl (SCHARP director agent) is male. Refer to him as he/him, not she/her. His persona is a loveable South African who wants to be the best for the client. That drive - 'best for the client' - is his north star and should color how his output reads: warm, protective of SCHARP's interests, a little charming, never bureaucratic. Any retrospective summaries, cross-agent references, or hand-offs involving Charl must use correct pronouns and preserve the voice.
Working pattern for sending email via Outlook COM with the saved signature intact. $outlook = New-Object -ComObject Outlook.Application; $mail = $outlook.CreateItem(0); $mail.To = 'address'; $mail.Subject = 'subj'; $mail.Display() | Out-Null; Start-Sleep -Milliseconds 800; $sig = $mail.HTMLBody; $body = '<p>content</p>'; $mail.HTMLBody = $body + $sig. Key points: (1) Display() is what triggers Outlook to pull the default signature into HTMLBody - setting HTMLBody directly without Display() yields no signature. (2) The 800ms sleep is required because signature insertion is async. (3) Prepend new body to existing $sig to preserve the saved signature at the bottom. (4) Do NOT call $mail.Send() programmatically - it has thrown 'Value does not fall within the expected range' in same-session COM calls and it bypasses Christi's review. Leave the window open for her to click Send.
SCHARP Datto backup situation is RESOLVED, not an open risk. Datto shipped a seeding drive. SCHARP populated the drive with data from all 7 servers and shipped it back to Datto. Backups for all 7 servers now recovered. Do not flag Datto as an open SCHARP risk going forward. Charl, Fritz, and Rex should remove Datto from the critical-concern list in SCHARP status reports. If prior briefings or standups still reference 'Datto failing all 7 servers' or '100% storage full' as active problems, that info is stale.
SCHARP is uninstalling Trellix from all computers. CrowdStrike is the go-forward endpoint security tool. The previously flagged 'CrowdStrike/Trellix $60K/yr overlap' is being resolved through Trellix decommission. Do not continue flagging the overlap as an open decision. Charl, Fritz, and Rex should treat this as in-progress consolidation, not a pending decision.
When creating an Agent Queue record, always set the Source Computer field (fld3Wsd1Cz0TCqAGh). Valid options: Work - Desktop, Work - Laptop, Home - Desktop, Home - Laptop. This lets Christi trace queue items back to the machine they were created on, which helps debug machine-specific issues (env var problems, MCP connections, file paths) and understand where work happens across her multi-computer setup. Determine the source by checking hostname or confirming with Christi at session start. These four are the canonical set - do not use shortened or made-up names like 'Home' alone or 'Pasadena'.
MCP endpoint URLs and API keys (n8n workflows, custom MCP servers, service APIs) contain embedded auth tokens and must NEVER be stored in memory files, committed to git, or pasted into plain markdown. They belong in the OS credential store. Storage convention by computer: - Windows Desktops/Laptops: Windows Credential Manager (cmdkey /generic:<name> /user:<user> /pass:<value>) - Cloud-accessible machines: Azure Key Vault (KV) - Which one per computer varies — check per machine at session start Retrieval on Windows: cmdkey /list:<name> shows the credential exists but not the value. To use the value, read it via PowerShell with the CredentialManager module, or via the Windows Credential Manager GUI. Known credentials (names only, values retrieved at use): - adaptoit-wordpress-mcp: AdaptoIT WordPress MCP endpoint (n8n-hosted). User: christibrown252. - n8n-api-key: Admin API key for adaptoit.app.n8n.cloud n8n instance. User: christibrown252. Lets agents create/modify workflows programmatically. Base URL: https://adaptoit.app.n8n.cloud/api/v1 with header X-N8N-API-KEY. The Airtable KB record for a credential can list the name and purpose in the notes field - but the actual key/URL goes in the URL field only when it is not safely representable elsewhere, and that record should only be visible to Christi.
When an agent discovers something Christi needs to decide on, or surfaces a finding she should know about, write it to the Agent Queue table in NEST (base appYVXneddw1eKZEu, table tblkAC4m6C5DWqGQJ) instead of interrupting her workflow. Record fields: - Title: short, punchy, action-oriented - Type: Question (needs decision) or Finding (discovered) - Status: start as Open. Lifecycle: Open > Answered > Acknowledged > Resolved (or Dismissed) - Priority: Blocking / High / Normal / FYI - Agent: who surfaced it, use 'Bestie2' as generic - Context: full self-contained explanation, multi-paragraph is fine - Answer: her decision, can pre-fill if you found the answer yourself - CW Ticket, Client, Related Project, Related Task: optional links One question, one response, done. Not a chat.
Blog publishing routing by site: ADAPTOIT (adaptoit.com) - WordPress MCP: https://adaptoit.app.n8n.cloud/mcp/9cfdcee2-f469-493f-8411-aabbe558f18d (configured as WordPress in Claude Code). Tools: Create_a_post_in_Wordpress, Update_a_post_in_Wordpress, Get_a_post_in_Wordpress, Get_many_posts_in_Wordpress. Stuart pushes AdaptoIT posts as drafts. CRIMSON IT (crimsonit.com) - NO WordPress MCP. Convert to docx using pandoc with CrimsonIT_pandoc_ref.docx reference doc. Save to Blog Drafts folder. Christi sends to Stephanie via Teams. Otto writes these posts. MY IMPERFECT LIFE - Separate WordPress MCP coming later. Bob writes these posts. Hold drafts until MCP is built. COUNTED DOORS (counteddoors.com) - TBD. Kevin writes these posts. CHORESTEPS (choresteps.com) - No blog writer agent assigned yet. Needs one. Blog drafts stored in: 2 - Internal Operations/Blog Drafts/
When you spawn another agent via the Agent tool (e.g., Segrid, Carl, Steve), that subagent runs in a separate context and does NOT have the MCP tools available that the parent session has. This includes Airtable, Postgres, Miro, Vercel, etc. This means subagents cannot create Airtable records, run SQL, update Miro boards, etc., even if the task assumes they can. Pattern: if a subagent needs to write to Airtable/DB/Miro, have it prepare the exact data/SQL and return it, then the parent session executes the MCP call. Happened with Segrid on the NEST Pipeline implementation and AdaptoInbox Plan creation - she prepared the records perfectly but couldn't push them; parent had to execute.
Christi's GitHub repos were transferred from adaptoit-christi to TheOtherChrisBrown. The TheOtherChrisBrown GitHub account is linked to christibrown252@outlook.com (and/or christibrown252@gmail.com), not ckbrown@adaptoit.com. Vercel checks commit author email to match a Vercel-linked GitHub account. Commits authored as ckbrown@adaptoit.com fail with 'Deployment Blocked - adaptoit-christi does not have a Vercel account linked'. Global git config was updated to christibrown252@outlook.com. Use that for any commits to TheOtherChrisBrown repos.
Project documentation, plans, and tracking go in the NEST Airtable base. Do not store project docs as markdown files on the local computer. Use the appropriate NEST table (Projects, Plans, Tasks, Agent Queue, etc.) instead. The Miro board for AdaptoInbox remains as a visual reference, but actionable project data lives in Airtable.
ALL client emails sent via Outlook COM or any other method MUST be logged as an internal note on the corresponding CW ticket (service or project). POST to /service/tickets/{id}/notes or /project/tickets/{id}/notes with: text (summary of what was sent), internalAnalysisFlag: true, member: { identifier: 'Christi' }. Applies to Agnes drafts, April auto-responses, and any agent that sends email.
ALL emails sent by agents must use HTMLBody (not Body) with the correct signature appended. Signature files at env:APPDATA\Microsoft\Signatures\. SCHARP contacts (@scharpca.org) use Main (christi.brown@scharpca.org).htm. AF contacts (@abilityfirst.org) use Main (ckbrown@abilityfirst.org).htm. All others use Main (christi@crimsonit.com).htm. Use Outlook COM: New-Object -ComObject Outlook.Application, CreateItem(0), set HTMLBody with message + signature HTML.
Segrid is both planner AND project manager. Workflow: 1) Segrid builds plan (research, scope, timeline, tasks, budget), 2) Hugo validates (pass/conditional/fail), 3) Questions go to Agent Queue, 4) Segrid executes and tracks. Three plan templates: Crimson Billable (CW project, budget, agreement, quote number), Internal/Non-Billable (AdaptoIT, agent training, no CW), Dev Project (tech stack, repo, deploy target, environments). Every new project gets a plan before work starts. Hugo validates before Active status.
ALWAYS generate passphrases, NEVER random character strings. Format: 3-4 random words + a number + a special character. Capitalize first letter of each word. Examples: Maple-Sunset-River-42!, Thunder7$Bright-Ocean, Coffee-Mountain-Spark-91#. Apply every time a password is generated: user creation, password resets, service accounts, BGA accounts.
Use the light theme briefing design (approved 3/27/2026). Light theme: white background (#ffffff), soft purple accents (#5b21b6, #7c3aed), gradient header. Stats strip: left-aligned compact row, NOT centered boxes. Anzor Priority: red-bordered box with badge, always prominent. Wins section: highlight deliverables, NOT tools/methods. Never mention agents, background agents, or Claude Code internals. Frame as Christi's direct work. Tags: pill-shaped (green=done, blue=in progress, yellow=pending, red=urgent). Tables: rounded corners, subtle borders. No dark theme. Omit marketing emails and CW notifications.
All policies must be written at Fortune 500 quality in formal professional prose suitable for legal/compliance review. Third person, passive voice where appropriate. Vary 'shall', 'must', 'will', 'is required to'. NEVER use bullet points or numbered lists in the body. Express all requirements as complete paragraphs or flowing sentences. Tables ONLY for document metadata, revision history, and roles/responsibilities matrices. Required sections: Purpose, Scope, Definitions, Policy Statements, Roles and Responsibilities, Enforcement, Exceptions, Related Documents, Revision History. Minimum 1,500 words. Placeholder tokens: [COMPANY_NAME], [DATE], [NAME], [TITLE]. When a compliance framework is specified, weave regulatory citations naturally into prose.
On any computer where `C:\Users\Christi\OneDrive - AdapToIT\` exists, all AdaptoIT-branded deliverables (drafts, lead magnets, blog posts, training modules, templates, marketing assets) save to that OneDrive tree. Canonical blog/lead-magnet path: `C:\Users\Christi\OneDrive - AdapToIT\03_Projects\AdapToIT-Blog\Documents\`. Before creating an AdaptoIT file, check that the Adapto OneDrive exists and save there. Never default to local `C:\Users\Christi\Documents\`. If the Adapto OneDrive is NOT mounted on the current machine, ASK Christi where to save rather than silently writing to local. Same pattern likely applies to other brand OneDrives (Crimson IT, foster care) — check for a matching `OneDrive - [Brand]` folder before saving brand-specific content locally.
The Airtable API only supports creating basic field types: singleLineText, multilineText, checkbox, singleSelect, multipleSelects, number, percent, currency, duration, date, dateTime, rating, multipleRecordLinks, email, url, phoneNumber, richText, barcode, multipleAttachments, singleCollaborator, multipleCollaborators. Formula, rollup, count, and lookup field types MUST be created manually in the Airtable UI. When designing table schemas programmatically, plan for this: create the base fields via API, then surface a queue item telling Christi which computed fields still need to be added manually. Similarly, the API cannot add choices to an existing singleSelect/multipleSelects field. Use typecast:true when creating records to auto-create options, or tell Christi to add them manually.
The Postgres MCP tool used to push content updates to Neon has an effective size limit around 7000 characters per query. Large UPDATE statements (e.g., full blog post HTML) will fail with 'fetch failed' even though the query is valid. Workaround: keep content chunks under 6500-7000 chars. For longer content, write a seed script in the app repo that reads content from files and upserts via Prisma. Or use the app's own API endpoint if available. Confirmed working: ~6400-6900 char updates succeed consistently. ~9000 char updates fail with fetch failed.
Quotes for new client projects are submitted to the sales team via a Teams channel, NOT emailed directly to Anzor or the client. Christi provides the SOW and total hours only. No pricing breakdown (sales handles that). Keep quotes lean: scope of work + total hours, no fluff, no per-phase hour breakdowns unless asked.