Skip to main content

22 posts tagged with "cursor"

View All Tags

Homol High Phase 1 — git-backed home study with Professor Cursor

· 2 min read
Mike Homol
Principal Consultant @ ThreeWill

Consulting delivery patterns work surprisingly well for home school. This week I stood up Homol High School as a single git repo for Grace’s sophomore year: courses, daily lesson sheets, attendance, Georgia compliance notes, and a Cursor rule that acts as curriculum coach while my wife and I run short kickoff, check-in, and wrap. The remote stays private — shared between us for collaboration, not a public Homol Works link.

What happened

  • Initialized Homol High Phase 1 with Geometry, World History, AP ELA, Chemistry, and a light PE/Arts elective log for the 2026–27 year
  • Wrote Week 1 daily lesson sheets (lessons/YYYY-MM-DD.md) with outcomes, Must-do vs Stretch, worked examples, Done looks like, Stuck Protocol, and phone-away defaults
  • Added co-teacher ops: daily rhythm, attendance log, week template, learner profile, and learning log — parents nearby, not all-day sit-beside tutors
  • Codified a Professor Cursor teaching rule so lesson text stays literal, checklistable, and independent-work friendly
  • Captured Georgia home-study guardrails (Declaration of Intent, 180 × ~4.5 hours, required cores) under docs/ next to the ops playbook
  • Started tracking the kinds of supports that fit Grace’s unique learning style — without publishing the trait list itself
  • Today was our first pilot school day; we got a ton of feedback and already worked through much of it. A follow-up post next week will show how the lessons and agenda have matured by the end of Week 1

Weekly AI Builds - August 31, 2026

· One min read
Mike Homol
Principal Consultant @ ThreeWill

Homol High School Phase 1 landed as a git-backed home study program for Grace — courses, Week 1 lessons, and a Professor Cursor coaching rule — with a follow-up post planned after the first week of real school days.

Highlights

  • Stood up Homol High School Phase 1: courses, Week 1 daily lesson sheets, Georgia home-study ops docs, and a Professor Cursor teaching rule for co-teachers (shared privately between parents, not a public remote).
  • Ran a first pilot day and captured a ton of feedback to tighten lessons and agenda — more on that in a follow-up next week once Week 1 has matured.
  • Closed the prior weekly curation PR: applied Open Questions feedback, shipped Scorecard guided-setup screenshots, and published the living-architecture stub with a sanitized Mermaid excerpt.

Learn More

Living architecture diagrams as delivery docs

· 2 min read
Mike Homol
Principal Consultant @ ThreeWill

Architecture slides go stale the week after the kickoff. On a state licensing modernization engagement this week, I codified living Azure and solution architecture diagrams under docs/ so the pictures sit next to the IaC and API work that actually change them.

What happened

  • Added living Azure and solution architecture diagrams under in-repo docs/ (versioned with the delivery monorepo, not a one-off PowerPoint)
  • Status labels on each layer — Exists, Placeholder, Provisioned, Scripted, Planned — so the diagram stays honest as the scaffold grows
  • Teammates continued the same repo spine: Azure SQL IaC hardening, Key Vault and Blob in infrastructure, .NET 8 API scaffold with health checks and CI, and app-folder rename toward an internal web surface (collaborative delivery — not sole Mike authorship)
  • Documented a GitHub Enterprise cutover / brand alignment note for the engagement repo so clone URLs and naming stay honest for the team
  • Pattern worth stealing on other ThreeWill builds: diagrams as first-class docs, updated in the same PRs as infra and API changes

Sanitized solution-layers excerpt

Client names, product codenames, and org remotes stripped. Same shape as the living docs/ diagram:

API-first and location-driven: one Azure SQL system of record, one shared API, three clients (internal SPA, external portal, offline field app). When a layer moves from Placeholder to Exists, the diagram updates in the same change as the code.

ThreeWill Operational Scorecard — rebrand, guided setup, yearly cadence

· 2 min read
Mike Homol
Principal Consultant @ ThreeWill

Last week the Human Services Scorecard got a full Operational Dashboard shell. This week I leaned into product identity and install experience: a clearer ThreeWill Operational Scorecard brand, a themed guided-setup wizard, and a shipped Yearly period option so annual metrics stop pretending they are months.

What happened

  • Rebranded the shelf product to ThreeWill Operational Scorecard across web parts and setup surfaces
  • Shipped a themed guided-setup wizard so new installs walk Vertical → Divisions → Categories → Locations → Measurables → Review instead of hunting property panes
  • Vertical catalogs (Senior Living and Human Services) are starting points — uncheck later steps or add your own names
  • Introduced a Yearly cadence with a configurable year-start month and day in period services and property-pane options (ready to advertise as shipped)
  • Extended seed/schema and upgrade scripts so yearly fields land cleanly on existing SharePoint lists
  • Kept the Operational Dashboard / Attention / Summary path from last week as the display spine — this week was brand + setup + calendar math

Guided setup — select a vertical (Senior Living selected)

Guided setup — Senior Living divisions checklist

Guided setup — scorecard categories

Guided setup — locations (one name per line)

Guided setup — suggested Senior Living measurables

Guided setup — review and create summary

Weekly AI Builds - August 20, 2026

· One min read
Mike Homol
Principal Consultant @ ThreeWill

Brand week for the Scorecard, living architecture docs on a state licensing engagement, and the Customer QBR Claude Code post went live on Homol Works.

Highlights

  • Rebranded the Human Services Scorecard toward ThreeWill Operational Scorecard, shipped a themed guided-setup wizard, and added a Yearly cadence with a configurable year-start month and day.
  • Codified living Azure and solution architecture diagrams under docs/ on a state licensing modernization engagement, while the team advanced Azure SQL IaC, Key Vault/Blob, and a .NET 8 API scaffold.
  • Published the Customer QBR post: Claude Code engine hosted as a Copilot-ready Azure Function.
  • Continued client delivery: prospect matching hardening and duplicate cleanup tooling on a Dataverse engagement (details stay generic).

Learn More

From a Local Claude Code QBR to a Copilot-Ready Azure Function

· 7 min read
Mike Homol
Principal Consultant @ ThreeWill

A manufacturing client already had a working Customer QBR generator. It lived in Claude Code: a Python script, a handful of Excel extracts, and a self-contained HTML dashboard that sales could actually present. The ask was not “make Copilot write a nicer report.” It was “let sales ask Copilot for the same dashboard, for any customer, without running a laptop script.”

That sounds like a prompt problem. It was an architecture problem.

The local solution was already good

Someone on the client side had used Claude Code to build a deterministic pipeline, not a chatty summarizer. The script read four monthly Excel workbooks (orders, returns, forecast, item/customer master), computed a pile of KPIs, and injected the results into an HTML template. The output was an interactive canvas: YTD sales, units, on-time delivery, fill rate, forecast variance, RMAs, pipeline, recommended actions.

That is the kind of artifact consulting teams usually wish they had. Charts with real numbers. Tooltips. A predictable layout so the next quarter looks like the last quarter, just with new data.

The Excel files were not a convenience dump. They were the contract. Sheet names looked like ERP/BI view exports. The Python encoded client-specific windows and matching keys on top of that shape. If you skip the contract and ask an LLM to “read the spreadsheet and build a dashboard,” you get a different report every time — and you cannot hand it to a customer.

Phase 1 had to mimic that pipeline, not replace it. Going straight to the source system was the right end state — just not the first proof.

What Copilot cannot fake

The Copilot Studio agent had been pointed at Excel as knowledge and asked to author HTML. Two things break that design:

  1. Generative HTML is not the generator. The Python already owned the KPI math. An LLM rewriting dashboards from spreadsheets will drift, miss rows, and invent layout. Sales QBR is a repeatable artifact, not a one-off essay.
  2. Copilot Studio does not natively hand back a file. Chat can show a summary. It cannot reliably deliver a downloadable, self-contained HTML canvas unless something else produces the bytes and returns a link — Power Automate, an Agent Flow, or an external API.

The gap was wiring. Copilot should collect a customer name and return a URL. The engine should stay Python.

Wrap the engine, keep the contract

I stood up a Python 3.11 Azure Function App as an HTTP wrapper around the original generator. First data mode was Excel: the same four workbooks, staged in Blob (or a local folder for the laptop proof). The Function resolved a customer name, ran the engine, uploaded the HTML, and returned a time-limited SAS download URL.

A ThreeWill-tenant POC was enough to prove the stack before recreating it in the client’s subscription. Function-level auth (code / x-functions-key) kept the first connector simple.

MethodRouteRole
GET/api/healthLiveness + which data mode is live
GET/api/qbr/customersCustomer name search
POST/api/qbrStart generation → jobId
GET/api/qbr/statusPoll until downloadUrl

Copilot Studio imported that surface as a REST API from OpenAPI. Four operations, API key in the query string, no custom connector science project.

Copilot’s 30-second wall

Generation is not a cheap lookup. After warm-up it is often 15–60 seconds; a cold run with a fat extract can take a couple of minutes. Copilot tool calls time out around 30 seconds.

So the default POST /api/qbr does not wait for HTML. It queues a Storage Queue message, returns 202 + jobId immediately, and a queue-triggered worker does the minutes-long work. A sync=true path exists for curl and smoke tests — Copilot never uses it.

Agent instructions matter as much as the API. Copilot is an orchestrator: search if the name is fuzzy, start a job, remember jobId, and on “ready?” call status with that id only. It must not author HTML, invent KPIs, or re-ask for the customer name just to poll. Hiding customerName on the status tool is what stops that re-prompt.

SAS lifetime defaults to 24 hours. The link is a download, not a forever intranet page.

Then stop copying Excel

Once Copilot could deliver the same canvas, the monthly Excel ritual became the next bottleneck. Those workbooks were already pictures of lakehouse views. Phase 2 flipped QBR_DATA_MODE from excel to fabric.

Same Function. Same OpenAPI. Same Copilot tools. Different loaders:

  1. Resolve the customer in the lakehouse (company name → customer key)
  2. Query orders, RMAs, and forecast by that key
  3. Take the latest forecast version
  4. Pull deals from the CRM table and inventory for the customer’s items
  5. Still load the HTML template from Blob — branding is injected at generate time

An Entra app registration in the client’s tenant, granted on the Fabric workspace/lakehouse, lets the Function use Lakehouse SQL. The Function host needs ODBC Driver 18; that is a runtime footnote, not a Copilot change.

Excel mode stayed as rollback. That mattered during the first Fabric mapping: column case, identifier quoting, and “which table actually has city/state” are the unglamorous half of reuse.

What sales actually get

The deliverable is still the interactive HTML — not a chat summary pretending to be a QBR.

Customer QBR dashboard — names, logo, and item codes redacted

Typical sections:

  • Customer summary (YTD sales and units vs prior year)
  • Monthly sales and order-to-ship
  • On-time delivery and fill rate
  • Top items, forecast vs actual, recommended forecast actions
  • Returns / RMA
  • Open pipeline

The layout is stable because the template is stable. Copilot’s job is to get the right customer into the engine and hand back the file. The screenshot above is a real generated dashboard with account names, logos, and item codes swapped for placeholders.

What I would repeat

  • Treat a local Claude Code win as a product to host, not a prompt to recreate. If the Python already computes the truth, wrap it.
  • Make the extract schema explicit before you skip it. Excel was the contract that let us prove Copilot delivery without boiling the ERP ocean.
  • Design for Copilot timeouts on day one. Async job + poll + SAS link is boring and it works.
  • Keep the LLM off the KPI path. Instructions that say “you do not author HTML” are load-bearing.
  • Flip data mode behind the same OpenAPI. Copilot makers should not notice Fabric vs Excel except that the numbers stop depending on last month’s export.

The pattern is reusable anywhere a desktop agent built a real report and the enterprise agent is expected to serve it: host the engine, let Copilot orchestrate, put durable data behind the same API when the first file lands.

Operational Dashboard for the Human Services Scorecard

· 2 min read
Mike Homol
Principal Consultant @ ThreeWill

Scorecard tiles are great for a check-in moment. Operators still need a full-page place to see what needs attention across communities, compare locations, and read trends without hopping web parts. This week I shipped that shell for the Human Services Scorecard — and tightened the metric math that feeds it.

What happened

  • Added a new Operational Dashboard SPFx web part with a full-page shell: Attention panel, Summary panel, community comparison, KPI strip, trend chart destinations, and shell nav/context
  • Added weighted rollups and per-location goal overrides for Sum metrics so “All communities” views stop lying about local targets
  • Surfaced location Needs Attention on category pages when viewing All communities
  • Colored week-over-week trend arrows by target favorability (lower-is-better down = good) instead of raw up/down
  • This is the next chapter for both the Human Services Scorecard and ThreeWill as a business: HSS is the spine for displaying metrics that matter to human services organizations — especially Senior Living — while we work toward automated integration with the back-end systems that bring those dashboards to life (Financial, CRM, HR, and EHR apps/services)

Human Services Scorecard Operational Dashboard — Executive Overview on the demo site

Weekly AI Builds - August 10, 2026

· One min read
Mike Homol
Principal Consultant @ ThreeWill

Shelf week for the Human Services Scorecard: I shipped a full Operational Dashboard shell — Attention, Summary, and favorability-aware trends — as the next chapter in how ThreeWill surfaces metrics that matter for human services and Senior Living.

Highlights

  • Built a new Human Services Scorecard Operational Dashboard SPFx shell — Attention + Summary panels, community comparison, KPI strip, trend destinations, weighted Sum rollups, per-location goal overrides, and WoW arrows colored by target favorability.
  • Positioned HSS as the display spine for metrics that matter, with a path toward automated Financial / CRM / HR / EHR integrations that bring those dashboards to life for Senior Living and other human services orgs.
  • Continued side work without separate Learn More posts: Memento Mori iOS 26 PNG freeze fix, Backseat Games Android solo-launch packaging, state licensing monorepo/ADO hardening, and a small knowledge-base hygiene script.

Learn More

From Discovery Notes to an ADO Import Pack

· 4 min read
Mike Homol
Principal Consultant @ ThreeWill

Discovery backlogs often die as sprawling spreadsheets. This week I turned a kickoff architecture, an estimating sheet, and a gap analysis into an Azure DevOps import pack — so a multi-app modernization engagement can load phased work items instead of debating a static file.

What happened

Planned architecture (discussion-grade)

Married the system design with the Azure architecture into a living trajectory the team can share:

  • API-first, location-driven platform — one Azure SQL system of record, document binaries in Azure Blob (SQL keeps metadata / blob_uri), shared .NET API behind API Management
  • Three clients, one API — internal React SPA, offline-capable field app (.NET MAUI + SQLite sync), and an external React portal (Entra External ID + accessibility expectations)
  • Scriptable Azure baseline — PowerShell orchestrating Azure CLI against a JSON resource manifest (Key Vault, App Insights, SQL, App Service, Functions, Static Web Apps stubs, Communication Services) in a single primary resource group
  • Auth split — Entra ID for internal users; Entra External ID for portal users
  • Integrations later in the sequence — payments, HR feed, insurer file drop, addressing, notifications — after core domain and apps stand up
  • Migration + hardening as late phases — cutover from the legacy permitting platform, then security/docs/go-live

Nothing here claims a finished production tenant; it is the kickoff architecture the backlog is sequenced against.

Delivery phases

Sequencing is P0–P10 (~16-month build). Phases are delivery order labels — not ADO Epics:

CodePhaseIntent
P0Discovery & UX/data designRequirements depth, mocks, SQL + Blob layout
P1Azure platform & IaCScriptable baseline resources
P2Data model & API coreLocation-first anchors, OpenAPI, auth
P3Main app shellInternal React Static Web App framework
P4Domain capabilitiesLicensing, plan review, inspections, complaints, fiscal
P5Field / inspectors appOffline MAUI + sync
P6External portalPublic React + External ID
P7IntegrationsPayments, HR, file drops, notifications, addressing
P8MigrationLegacy platform → new system
P9Reporting & BIAnalytics (decision pending)
P10Hardening & cutoverSecurity, runbooks, go-live

From estimate sheet to picklist

Started from the original estimating backlog (archived workbook — not reproduced in detail here). Ran a gap analysis against the architecture so platform, IaC, auth, observability, and other design-driven work that never appeared as estimating line items still landed as stories.

Final picklist: 238 user stories214 from the estimating backlog and 24 gap stories.

How Azure DevOps sees it

Hierarchy is Epic → Feature → User Story under one existing endeavor Epic (client project names stay private):

  • Features = durable solution layers (Infrastructure, API, Internal SPA, External SPA, MAUI, Integrations, Migration, Reporting, Program & delivery, …) — not one Feature per phase
  • Tags = delivery sequence (Phase-P0Phase-P10), layer markers, which app slice owns the story, and Source-Backlog vs Source-Gap
  • A generator script regenerates the CSV pack when discovery notes change; the import is a single hierarchical CSV for Boards → Import Work Items

Obfuscated picklist sample

A thin slice of Infrastructure / early-platform stories (titles lightly generalized; tags show the real shape):

Feature | User Story | Tags (abbrev.)
Infrastructure | Set up technical work environments (Azure, DevOps, …) | Phase-P1; Layer-Infrastructure; Source-Backlog
Infrastructure | Scaffold PowerShell + Azure CLI + JSON resource manifest| Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Provision Key Vault and wire secret references | Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Provision Application Insights / Monitor baseline | Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Configure Entra ID for internal app + API | Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Configure Entra External ID for portal users | Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Provision Azure SQL (dev) via IaC scripts | Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Provision APIM + App Service for .NET API | Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Provision Static Web Apps stubs (main + portal) | Phase-P1; Layer-Infrastructure; Source-Gap
Infrastructure | Add GitHub Actions CI skeleton for API and web apps | Phase-P1; Layer-Infrastructure; Source-Gap

Gap items (like the IaC scaffold row) are the architecture calling things the estimate sheet never named — exactly why the gap pass matters before import.

Weekly AI Builds - August 3, 2026

· One min read
Mike Homol
Principal Consultant @ ThreeWill

Follow-through week on a state licensing modernization kickoff: I married the architecture and estimating sheet into phased delivery docs, ran a gap analysis, and packaged 238 user stories as an Azure DevOps import pack.

Highlights

  • Built an ADO backlog import pack from architecture + estimating: living solution phases (P0–P10), a gap-aware picklist (214 backlog + 24 gap stories), hierarchical CSV under one endeavor Epic, and a generator script — Features as solution layers, tags for phase/app/source.
  • Kept client project names, endeavor titles, and org paths out of the public write-up while preserving the real shape of the import (Epic → Feature → User Story).
  • Continued adjacent engagement and product work (architecture trajectory docs; Scorecard SPFx polish) without separate Learn More deep-dives this week.

Learn More