Total Initiatives
updated 9·11·26

The Punch List

Only what's still open. Tick a box as you clear it — cleared work comes off the board, history lives in ti-context. Tap a marker below to focus one lane.

Security — needs your go-ahead

approve before I touch it
  • dashpane
    No rate limit on the login endpoint
    Matters more than usual here — the container runs as root with the Docker socket mounted, so a login bypass is a bigger deal than normal. Top fix from the Dashpane audit.
    projects/Dashpane.md →
  • dashpane · ti-agent-pwa
    Ports 3010 & 3011 rely on Hostinger's edge firewall, not ours
    No ufw or iptables rule is actually protecting them — one panel change upstream would expose both. Bind both to loopback in compose; NPM already reaches them internally either way.
    projects/Dashpane.md →
  • dashpane
    QBO token encryption shares a key with session auth
    One secret (JWT_SECRET) currently covers both login sessions and QuickBooks token encryption, with an unsafe fallback if it's ever unset. Give QBO its own dedicated key.
    projects/Dashpane.md →
  • dashpane
    The VPS .env is world-readable
    Mode 644, holding every integration's credentials. chmod 600 and move on.
  • n8n
    Review the 5 high findings from the new weekly security audit
    First run of the new "TI: Weekly n8n Security Audit" workflow flagged 98 findings across 23 workflows (0 critical / 5 high / 32 medium / 61 low). The 5 high are unauthenticated webhooks on active workflows — 3 of the 5 self-gate behind a shared secret the scanner can't see, but all 5 are worth a manual look.
    stack/mcp-servers.md →
  • action1 · c&f
    Carpet & Flooring's cert expires in 33 days, patch posture is rough
    Surfaced by the new action1-mcp tools on first use: a cert expires 2026-09-23, and C&F patch posture shows 543 critical missing-update exposures (3,269 high, 5,229 past deadline) — worst endpoint CFCPC007.
    stack/mcp-servers.md →
  • c&fsophosvpn
    C&F VPN hardening — Option B was chosen 2026-09-01 and never implemented
    The decision is made and the note still reads "not yet implemented." This sits directly on top of the failed-logon root cause you traced the same day — an external VPN password-spray.
    decisions/cf-vpn-auth-hardening.md →
  • zabbixvpsfirewall
    Zabbix 10050 and 10051 are open to the entire internet
    Found while closing the MCP port exposure on 2026-09-10 and confirmed from an external host: both carry blanket ALLOW IN Anywhere ufw rules. The agent on 10050 should only ever be reached by the Zabbix server; 10051 should only accept your actual monitored hosts. Same treatment as the MCP ports — allow the tailnet plus the hosts that genuinely need it, drop the rest.
    stack/infrastructure.md →
  • dockerfirewallvps
    ufw does not actually protect anything Docker publishes
    The root cause behind the MCP exposure, worth fixing structurally rather than case by case. Docker's PREROUTING DNAT bypasses ufw's INPUT chain entirely, so a container published on 0.0.0.0 is internet-facing no matter what ufw says — port 5001 was wide open with no ufw rule at all, while 3010, 3011 and 8081 publish on 0.0.0.0 today with no allow rule either. The durable fix is to bind non-public services to 127.0.0.1: in their compose ports: and reach them over Tailscale, instead of adding more DOCKER-USER exceptions. Also verify twenty-server-1 on 3000, which carries a blanket allow.
    stack/infrastructure.md →
  • vpsfirewallhostinger
    Nobody has read the Hostinger cloud firewall — and it is the real perimeter
    Proven 2026-09-11 with tcpdump on both NICs: SYNs for 81, 3010, 3011, 8443, 21118, 21119 never reach the VPS at all. That is why ports published on 0.0.0.0 with no ufw rule and no DOCKER-USER rule are still unreachable. Dashpane on 3010 — which holds live QuickBooks tokens and mounts the Docker socket — is protected today by a rule set neither of us has seen, one panel toggle from vanishing. Photograph both rule sets.
    decisions/docker-port-exposure-model.md →
  • npmvpsfirewall
    The proxy admin panel is published on the public internet
    proxy.totalinitiatives.com serves the Nginx Proxy Manager login over 443 (proxy_host 1 → 127.0.0.1:81) — 188 hits from one address plus assorted scanners. Closing port 81 does not touch this; it is a separate decision about whether that panel should be reachable from anywhere but the tailnet.
    decisions/docker-port-exposure-model.md →
  • m365emaildns
    totalinitiatives.com has no DMARC and no DKIM
    SPF is correct. DMARC is absent entirely and neither M365 DKIM selector resolves. This is the domain that sends your lead notifications and client mail, so it is a deliverability gap as much as a spoofing one. Both are DNS records at GoDaddy.
    decisions/marketing-analytics-sources.md →
  • gitsecretsrepos
    Sweep the other repos for the gap that nearly leaked a private key
    On 2026-09-11 a GCP service-account private key was found sitting in ti-dashpane's backend/ at mode 644, in a repo that pushes to GitHub, with no .gitignore rule covering it. It was untracked so nothing leaked, but one git add -A would have published it. Fixed there (*-key.json, *credentials*.json, *.pem, *.bak-*) and the key is now bind-mounted read-only instead of copied into the image. The other repos have not been checked: ti-agent-core, action1-mcp, itflow-mcp-enhanced, zabbix-mcp, and whatever is on vps2. Same gap, same blast radius.
    projects/Dashpane.md →

Decisions only you can make

scoped — waiting on direction
  • n8n · action1
    Leftover n8n cleanup — three calls to make
    From the 2026-08-21 cleanup: the broken "Action1" workflow (plaintext client secret in its node parameters) turned out to be live-registered, so it was backed up and deactivated instead of deleted — (1) rotate the Action1 API credential it exposed, (2) decide whether the deactivated workflow gets deleted for good, and (3) whether to purge the one n8n version-history row still holding the old Gen-1 PWA token in cleartext.
    stack/mcp-servers.md →
  • zabbix · dwg
    DWG's Mac fleet isn't in Zabbix yet — proxy or direct, decide first
    Action1 can push Zabbix's official macOS agent completely silently — Bash script, plain sudo installer CLI install, no GUI wizard, runs as a background LaunchDaemon with no logged-in user or prompt required. That part's ready to go. Held on one open question before rolling it out: should DWG get its own Zabbix proxy, the way C&F already has one, or report straight to TI-VPS-01 like TI-FW does? Workstations, not critical infra, so a good low-stakes place to try the pattern once that's decided.
  • action1-mcp
    Action1 run_script build — supervised session only
    Deliberately not built in tonight's overnight capability pass — remote script execution is approval-tier work, held for a session where Blake is actively supervising. The 2026-08-29 discussion date has passed and this is still open — the supervised path is documented and proven, it just needs your yes.
    stack/mcp-servers.md →
  • itflow-mcp
    Tier itflow-mcp's new create_recurring_ticket
    Ships gated by default (the tier guard's fallback) rather than auto-classified as a write tool — needs Blake's call on where it lands.
    stack/mcp-servers.md →
  • action1-mcp
    Rename action1-mcp's list_unmanaged_devices?
    Action1's REST 3.0 API has no actual unmanaged-devices resource — the tool returns discovery/deployer posture instead and says so in its output. Worth a clearer name.
    stack/mcp-servers.md →
  • vpsdockersecurity
    Approve (or reject) the container port binding change
    Full audit done, nothing changed yet. Stays public: Zabbix 10051, RustDesk 21115-21117, 80/443, 22. To the tailnet: 3333, 5001 — which retires the whole DOCKER-USER guard script and its fragile bridge-name pin. To loopback or deleted: 3000, 3010, 3011, 81, 8081, 1514, 1515, 10050, 21118, 21119. Verified against captured traffic, not assumed. Review page: The Three Firewalls.
    decisions/docker-port-exposure-model.md →

Top capability gap, per tool

one pick each — full lists in ti-context
  • zabbix-mcp
    Can't acknowledge an alert or open a maintenance window
    Every alert still needs manual UI action, and there's no way to silence noise during planned site work.
  • action1-mcppath proven
    Zero write capability — read-only, can't deploy or run a script
    No longer blocked on the repo-reconciliation decision above — the direct-API path (OAuth2 client-credentials, no MCP involved) was proven end-to-end migrating CFCPC202 to Zabbix. Building it into the MCP itself is now a real build-queue item, not a research question.
  • n8n-mcp
    Genuinely capable, barely used
    Its built-in security-audit tool alone could sweep all 18 workflows for dead credentials in one pass, instead of finding them one at a time by hand.
  • twentycrm
    Quick Lead dies silently if the company is already in Twenty
    The form now works and creates the opportunity (fixed 2026-09-10), but Create Company is step 1 and Twenty puts a unique index on the company domain. Enter a lead from a company already in the CRM and the run aborts at step 1 and creates nothing at all — no person, no opportunity, no error in front of you. For an MSP that is the common case, not the edge case: a second contact at an existing client. Fix is the same shape the n8n contact-form workflow already uses — FIND_RECORDS + FILTER to find-or-create instead of blind create.
    decisions/twenty-automation-constraints.md →
  • hermesmcpvps2
    Hermes is running on one tool server out of five
    Its config points all five MCP servers at vps1's public IP. Only n8n answers. Zabbix is reachable but 401s because its config block has no bearer token; ITFlow, Action1 and Playwright are loopback-bound on vps1 and have never been reachable. Repointing at the tailnet fixes two; the other three need rebinding as well. Separately: the n8n token sits in that file in plaintext and is sent over plain http:// across the public internet on every call — rotate it.
    projects/Hermes-Agent.md →
  • c&fzabbixmonitoring
    A C&F Store 2 workstation reports past the proxy
    Caught in a 4-minute packet capture on the Zabbix ingest port: 12.76.103.114, TLS-PSK identity PSK_CFCPC202, reporting direct to TI-VPS-01 instead of through CFNMS01 like the rest of the site, and from a different site egress. Either Store 2 is meant to report direct, or that host was onboarded against the VPS by mistake — in which case others at Store 2 may be too.
    clients/C-and-F.md →

Build queue — ready to pick off

no decision needed, just doing
  • zabbix · sophos · c&fpriority
    Centralized firewall log collection — Sophos XG → CFNMS01 → Zabbix
    Partly done — the syslog receiver was built 2026-09-01; Zabbix ingestion is not. Second investigation blocked by this. CFFW001 reports to Zabbix over SNMP only — 68 polled counters, zero log data — so anything NAT'd behind 192.168.1.1 can't be attributed from the DC side. Cost us the scans copier hunt (08-22) and again the 08-27 LDAP-bind storm, where ~24 AD accounts were being walked and the source device stayed hidden. Fix: Sophos Configure → System services → Log settings → syslog to CFNMS01 (on-site, already the Zabbix proxy — no WAN hop, no tunnel dependency); rsyslog to /var/log/sophos/cffw001.log + logrotate; Zabbix agent logrt[] items using the same discipline as the eventlog template (regex filter, maxlines=5, short history — log items have no trends). Send Authentication / Admin / System categories only; full traffic logging will fill the disk.
    clients/C-and-F.md →
  • zabbix · c&f
    Roll CFCPC202's direct-reporting fix out to the rest of C&F
    Pattern's proven and there's a condensed 9-step checklist ready to follow. Next targets: the real servers and laptops (CFSRV001/002, CFLAP008) — not the desktop-named PCs, which have no reason to leave the proxy.
  • zabbix · c&f
    C&F's autoregistration rule won't catch future direct-reporting hosts
    CF-AutoRegister only fires for registrations relayed via the CFNMS01 proxy. Any host migrated to direct reporting needs a matching rule, or it has to be created manually every time.
  • action1 · c&f
    Patch the shared "Zabbix Agent Config - C&F" script in Action1
    Same UTF-8 BOM bug that broke CFCPC202's migration at first (Set-Content -Encoding UTF8 silently adds a BOM Zabbix Agent 2 can't parse) lives in the script used to onboard the rest of C&F's fleet. Will break the next host it's run against.
  • zabbix · c&f
    C&F's UPS isn't in Zabbix
    Confirmed on-site, confirmed not configured. SNMP-only device, so it needs the proxy (CFNMS01) — can't go direct-to-server the way agent-based hosts can.
  • headscale · low priority
    TI-FW's own mesh IP doesn't answer direct connections
    Tunnel is fully healthy (tailscale ping succeeds instantly) but real ICMP/TCP straight to 100.64.0.5 times out — likely OPNsense not answering host-directed traffic on that interface by default. Doesn't block the real use case (LAN subnet access already works end-to-end), so low priority.
  • headscale
    Confirm your laptop actually uses the office LAN route from home
    Verified working from both VPSes; never tested from ti-lap-03 itself off-site. Needs "Accept routes"/"Use subnet routes" on in the Windows Tailscale client.
  • zabbix
    Name the remaining untitled dashboard widgets
    Problems-by-severity and the SVG graph on "All Clients"; three honeycombs (CPU/Memory/Disk) on the "C&F" per-client dashboard.
  • zabbix
    Browser-verify the disk-space widgets
    Item-key naming is inconsistent across host types (Linux/Windows-server/workstation/firewall) — flagged as unverified without an actual browser check when the dashboards were built.
  • headscale
    Upgrade Headscale off v0.23.0
    It's been nagging about a newer release every time it's touched. Do this before attempting an ACL policy (see next item) — v0.23.0-era ACLs have a known bug that can break subnet routing outright.
  • headscale
    Real Headscale ACL, once upgraded
    The OPNsense-side firewall rule already scopes TI-FW's LAN access to just your laptop's mesh IP — this would be the belt-and-suspenders control-plane version of the same restriction. Not urgent given the firewall rule already works; do after the upgrade above.
  • action1-mcp
    Give action1-mcp real write capability
    The direct-API pattern (OAuth2 client-credentials, script/policy push, status polling) is fully proven from the CFCPC202 migration. Building it into the MCP server itself means future pushes don't each need a bespoke one-off script.
  • tooling
    Turn today's proven patterns into real Claude skills
    Five candidates, all reused multiple times already: Zabbix API + dashboard-widget access, Action1 direct-API calls, OPNsense→Headscale onboarding, the n8n Outlook-webhook pattern, and Zabbix direct-reporting/PSK client onboarding.
  • itflow-mcp
    Two small itflow-mcp fixes left from the 2026-08-21 repair pass
    create_ticket silently drops its priority argument (same field-name bug as the ones fixed — held back because verifying it means creating a real ticket), and the "In Progress" status can't be set through the API even though 13 real tickets use it (one-line shim change). Also: 9 old API-created tickets carry lowercase medium that UI filters won't match.
    stack/mcp-servers.md →
  • zabbix · itflow · deferred
    Resume Zabbix alert → ITFlow ticket automation
    Paused early on to organize Zabbix's structure first — that reorg is now largely done. Four original design questions still unanswered: severity threshold, duplicate/recovery handling, host→client mapping, and pipeline architecture (default proposal was Zabbix webhook → n8n → ITFlow's create_ticket).
  • mail · dns
    Confirm SPF / DKIM / DMARC for external relay mail
    First external test (to Gmail) queued OK, but spam placement is unconfirmed. Verify totalinitiatives.com SPF includes spf.protection.outlook.com and DKIM/DMARC align, so relayed mail to outside recipients doesn't land in spam.
    stack/mail-relay.md →
  • dashpane · mail
    Wire Dashpane forgot-password to the new mail relay
    The relay now removes the blocker on the old "M365 SMTP relay" backlog item — Dashpane's forgot-password still just logs the reset URL and sends nothing. Point it at mail-relay:25 to actually send resets.
    projects/Dashpane.md →
  • ti-contextgithub
    Grant the workflow scope so the knowledge graph self-updates
    Confirmed still missing on 2026-09-08 — the token has gist, read:org, repo. Run gh auth refresh -s workflow and the graph Action can be pushed; until then GRAPH.md only refreshes when it is regenerated by hand. Only you can do this one.
    GRAPH.md →
  • websiteseo
    Add the GBP and Facebook URLs to the site's JSON-LD sameAs, plus hasMap
    Unblocked now that the Google Business Profile is verified and live. Small site change; needs the two live URLs.
    projects/TI-Website.md →
  • dashpanetwentynext
    Point the Dashpane Pipeline card at Twenty
    Updated 2026-09-10: website leads are now visible — the Pipeline card was fixed to stop treating won/lost as open, and a new Sales page shows a real funnel with per-stage counts and totals. What is still true: the card reads Dashpane's own SQLite pipeline_deals and only mirrors outward to Twenty. Make it read live opportunities and write stage changes back, then retire the local table — migration is trivial, it holds one dead row.
    decisions/lead-to-cash-lifecycle.md →
  • quickbookstwentycustomer live
    Quote step: PROPOSAL → QuickBooks customer (estimate stays manual)
    Half of this shipped 2026-09-09. Moving an opportunity to QUOTE_PROPOSAL in Twenty now match-or-creates the QuickBooks customer and writes the QBO id back to Twenty as a note. The estimate stays manual by decision (2026-09-10) — line items vary too much per deal for a template to save a step. What is left here is nothing; kept on the board only until the Won trigger below is built, since that is the piece that closes the loop.
    decisions/lead-to-cash-lifecycle.md →
  • quickbooksitflowtwenty
    QuickBooks webhook: accepted estimate → Won
    QBO supports webhooks on Estimate. The payload carries only the entity id, so read the estimate back and check TxnStatus = Accepted, then set the Twenty opportunity to CUSTOMER, create the ITFlow client + contact, and store qbo_customer_id so invoicing works day one. Fallback is the CDC endpoint. Makes "won" an event you receive rather than one you remember to record.
    decisions/lead-to-cash-lifecycle.md →
  • npmvps
    Two subdomains serve 502s to the internet
    chat.totalinitiatives.com proxies to an open-webui container that does not exist, and build.totalinitiatives.com to dwg-app-designer, exited 7 weeks ago. Both answer anyone who visits. The most recent request to build was a bot fetching /.git/config. Either restore them or remove the proxy hosts and their DNS.
    stack/infrastructure.md →

Ideas — decide or kill

thought about, never chosen
  • marketing
    Client newsletter — parked, not rejected
    Quarterly advisory to the five existing clients. Plain text, from your address, no template. The point is that a client forwards it — that makes it a referral channel, not a broadcast. Success metric is replies, not opens. Parked 2026-08-28: "I like the idea and potential of it." First move is picking one thing that actually happened this quarter — do not invent a topic to have something to send.
    projects/Client-Newsletter.md →
  • marketingseo
    Publish advisories to the site once the newsletter holds a cadence
    Iteration 2 of the newsletter. The site now prerenders, so published advisories are citable by AI assistants — a client-only email is not. Blocked on the newsletter existing first; a three-post archive is worse than none.
    projects/Client-Newsletter.md →
  • marketingoffer
    IT Risk Snapshot — the free one-pager you'd lead cold outreach with
    The Hormozi research names this as your lead magnet (type 1: reveal the problem) and says the CTA should be "want the one-pager?" not "want a call?". It has never actually been specced — no template, no data sources, no example. It does not exist as anything but a reference to itself.
    business/cold-outreach-hormozi.md →
  • marketing
    Annual "Small Business IT Checklist for Central Arkansas"
    One substantial piece per year, gated or ungated, living on the site as a lead magnet. Iteration 3 of the newsletter plan — only worth doing if the quarterly cadence is already holding.
    projects/Client-Newsletter.md →
  • marketing
    Build out the Facebook business page
    Skeleton created 2026-09-08 — the page exists and nothing else does. Needs profile and cover art from the brand palette, a description matching the site's positioning, hours, service area, the 501-291-3457 number so it agrees with the site and GBP, and a first post. Then add its URL to the site's JSON-LD sameAs.
    business/brand.md →
  • marketing
    Ask Carol Auger, Jonathan Cupples and Jay Morgan for Google reviews
    Unblocked — GBP is verified and live as of 2026-09-08. All three already wrote paragraph-long testimonials unprompted. This is the only legitimate source of star ratings, and it is why rating schema was deliberately left off the site.
    projects/TI-Website.md →
  • seo
    One Little Rock city page — one only
    Approved in concept, never written. Only with genuinely local material: a named client, a neighborhood, the actual ISPs there. Five city pages were rejected as doorway pages; the same reasoning kills a thin single page too.
    projects/TI-Website.md →
  • brand
    Business card reprint
    When stock runs low. Loop/arc geometry over circuit traces (the circuit motif was dropped at the 08-28 redesign), and consider putting 501-291-3457 on it so card, site and GBP all agree.
    business/brand.md →
  • positioningwebsite
    "Systems & Automation" second track on the website
    The live site advertises managed IT only. You said on 2026-08-28 that you want to lean into systems-integration work — connecting business software, custom automations, internal tools. A second track presented alongside Managed IT with one shared CTA was drafted and never built. This is the biggest gap between what you sell and what the site says you sell.
    projects/TI-Website.md →
  • offer
    The free and paid digital offerings never landed anywhere
    Discussed as 1–3 free things plus a paid entry offer. Nothing was written to a file, so there is no spec, no price, and no delivery mechanism — only the Risk Snapshot survived as a passing reference. Decide whether this is a real ladder or drop it.
    business/model.md →
  • backuppricing
    Which product actually fills each backup tier
    The three-tier structure is decided; the products are not. Tier 1 leans Afi, tier 2 leans Veeam, tier 3 has no candidate at all. Until each tier has a named product with a real cost, none of the three can be quoted.
    decisions/backup-tier-model.md →
  • pricing
    Gross margin at $749 is still uncalculated
    Sophos, tier-1 backup and the XGS are all real COGS added on 2026-08-29 against a floor set before any of them existed. One ten-user tier-1 client priced end to end through Pax8 answers it. Until then the published floor price is a guess.
    business/model.md →
  • legalagreements
    Managed services agreement — settle 8 decisions, then an Arkansas attorney
    Draft exists with MSP-specific clauses generic templates miss. Eight bracketed decisions are still yours to make, and it has not been to a lawyer. You currently onboard clients with no written agreement at all.
    templates/managed-services-agreement.md →
  • ma-leerevenue
    MA-Lee analytics engagement — parked since June
    Growth priority #1 on your own list, untouched since 2026-06-22. Client profitability by account and account-manager workload, via the Applied Epic API. Next step is one email confirming API access. This is an upsell to your largest retainer client.
    projects/MA-Lee-Analytics-POC.md →
  • dwgrevenue
    DWG Power Automate retainer add-on
    Growth priority #2. Blocked on one discovery call with Jonathan that has never been scheduled.
    projects/SharePoint-DWG.md →
  • websitesn8n
    The web-client pipeline automation was never built
    The model needs ~20 outreach cycles a month to close 4 sites, which is not sustainable by hand alongside retainer work. Planned n8n automation covers prospect discovery, research aggregation, repo scaffold and draft emails — with an approve-to-send gate. Verdict on record: a well-prompted n8n → Claude call is enough; Hermes is overkill.
    decisions/web-client-pipeline.md →
  • websitesprospects
    A State Glass and 925 Financial are still "outcome pending" from June
    Both spec sites were built and outreach was sent. Neither note has been updated since 2026-06-22. Either they said no and the model needs rethinking, or they never replied and the follow-up discipline the Hormozi research calls for was never applied.
    projects/A-State-Glass-Site.md →
  • revenuezabbixaction1
    Hardware refresh forecasting as a product line
    Zabbix trend data plus action1-mcp's calculate_asset_age produces a quarterly "these machines are due" pack per client. Needs no agent autonomy at all, and turns monitoring data you already collect into a repeatable sales conversation.
    decisions/zabbix-mcp-capability-brainstorm.md →
  • ti-agentvision
    "Junior technician" field agent you can reach from your phone
    The MCP servers are only useful at a desk today. The vehicle question is settled — the PWA shell is now on a real multi-tool backend — but nothing has been built on top of it that behaves like a technician working quietly in the background while you are on site.
    decisions/ai-agent-workforce-vision.md →
  • ti-agentvision
    Business optimization watchdog — a standing job, not a favour
    A scheduled agent that reviews what the business is actually doing and flags drift and opportunity, without silently fixing anything. This inventory is the pattern run by hand: it caught a retainer decision that sat pending for weeks and vision docs untouched since June. Cheapest of the agent ideas — needs only ti-context.
    decisions/ai-agent-workforce-vision.md →
  • vision
    Internal wiki for the team
    Floated, never scoped. Real open questions first: who is "the team" today, build vs. buy, and how it avoids becoming a second source of truth diverging from ti-context. The knowledge graph may already be most of what you wanted here.
    decisions/ai-agent-workforce-vision.md →
  • automationonboardingvision
    Automated client onboarding — fully designed, never built
    CRM-triggered provisioning, an on-site gateway device, network discovery, RustDesk, a vulnerability scan and a completion notice. The architecture is written end to end. The written SOP now exists as the manual version; this is the automated one.
    decisions/automated-client-onboarding-vision.md →
  • zabbix-mcpvision
    ~35 zabbix-mcp tool ideas, none prioritized
    Two agents brainstormed independently and converged on six themes: a triage first-responder, field interrogation, a coverage-gap watchdog, client-facing monthly reports, incident memory, and alert-noise tuning. Nothing has been scoped or sequenced against your actual time. The convergent six are the defensible starting point.
    decisions/zabbix-mcp-capability-brainstorm.md →
  • mcpresearch
    Sophos Central and Dell TechDirect MCP servers
    Researched 2026-08-17, neither built. Sophos would put endpoint and firewall state in the same place as everything else; Dell TechDirect gives warranty lookup by service tag. Licence and credential confirmation are both still open.
    decisions/msp-api-integration-candidates.md →
  • action1-mcp
    Software drift tracking — baseline installed software, alert on diffs
    Mined from Breeze RMM. Action1 already holds the inventory data, so this is a read-only get_software_drift(org, since) tool and nothing more. Small, safe, and genuinely useful for both security and licence surprises.
    decisions/mcp-tool-roadmap.md →
  • researchwatch-item
    Breeze RMM — revisit in 6–12 months
    Open-source RMM+PSA with a governed AI operator — the closest prior art to your whole architecture, and long-term it overlaps ITFlow + Zabbix + Action1 + ti-agent-core combined. Flagged 2026-08-21 as too young to bet clients on. A watch item, not a task.
    decisions/mcp-tool-roadmap.md →
  • itflowopen-question
    ITFlow's client portal exists — is it dark, and does it compete with the PWA?
    Found in the codebase 2026-07-01 and never followed up. Two questions before anything else: is it reachable at a public URL today, and is the portal or the Agent PWA the official self-service intake? Right now you may be solving the same problem twice, and one of them is a live PSA with billing data behind it.
    decisions/itflow-client-portal-vision.md →

Also open — pre-existing backlog

Already tracked in ti-context, still true as of this pass — parked here so it's all in one place.

  • M365 SMTP relay — ✅ built 2026-08-27 (central mail-relay smarthost; ITFlow/Zabbix/n8n/Twenty wired — see shipped items above). Remaining piece: Dashpane's forgot-password still logs the reset URL and sends nothing — now tracked as its own build-queue item to point it at the relay.
  • Hold ITFlow at v26.07 — v26.08 is a breaking release, remediation plan is written, don't apply it yet
  • Workstation vs. server templates — noise suppression, not built yet (see build queue for the off-hours notification piece)
  • Retire or repurpose the redundant legacy Zabbix agent container on TI-VPS-01
  • Restart-safety cron — Twenty CRM has one, Zabbix/ITFlow/n8n still don't
  • TI-FW hardening — unused switch ports, rules beyond defaults, 2FA on the admin account
  • Public-IP SSH stays open on both VPSes — decided 2026-08-20, not closing it at this time
  • Re-point internal tools from totalinitiatives.com to ti-builds.com — Dashpane and the field agent's shared login has to move together, not piecemeal
  • Reconcile naming — still true as of 2026-08-20 (re-checked directly): container/compose is still ti-dashboard, git remote is still ti-dashpane, no change from before
  • Redesign the rest of Dashpane — still true as of 2026-08-20 (re-checked directly): only the main Dashboard tab (index.html) uses the new design-token system in depth; Infrastructure/Clients/Financials/Admin have only light, likely shared-header-only, token usage