LMNT — Operating.app allocations remediation
Last updated: 2026-04-16 (legacy 145117 archived — single active LMNT engagement from 2026-04-01)
Parent audit: Operating allocation — current state (2026)
Repo skills: sl-allocation-updater · operating-audit
Signed agreements (Google Drive — source of truth)
Agreements library: Client agreements (root) → Executed Client Agreements → Active Clients → Drink LMNT. List with gws (shared-drive flags): see sl-allocation-updater § Evidence gate.
| Artifact | Link |
|---|---|
| LMNT client folder | Drive folder |
| Master Service Agreement & SOWs (signed PDF) | |
| Amendment to Statement of Work #1 (signed PDF) | |
| Vault excerpt (grep-friendly; reconcile to Drive) | lmnt-data-sprint-sow-2026-excerpt.md |
Why this doc exists
The portfolio audit flagged LMNT rows in Operating that break delivery “single owner / trusted dates” expectations. This note turns those flags into a short checklist and adds Linear context so HoD / CSO / SL can fix records in Operating without re-deriving ownership from memory.
Operating IDs (client LMNT)
| Field | Value |
|---|---|
| Client | 68201 — LMNT |
Project 145117 | Name LMNT — archived 2026-04-15T03:31:51Z (Deal #1 / legacy row). Do not use for Apr 2026+ staffing — see Single project rule below. |
Project 171036 | Jan'26-LMNT - Deal #2 - Full Data & Analytics Engagement — active Deal #2. |
Project 156984 | LMNT Analytics — archived 2026-03-25T23:58:00Z; projectOwnerId still null (historical record). |
Status IDs (tenant): 577 = Confirmed, 578 = Tentative — from GET https://api.operating.app/v1/project-statuses.
API gotcha: GET /v1/projects?clientId=… may omit projectOwnerId / statusId even when set. Use GET /v1/projects/{id} for the full project row before remediating.
Single project rule (from 2026-04-01)
For client LMNT (68201), non-archived delivery projects should present one active engagement row for forward planning: Deal #2 171036 (Jan'26-LMNT - Deal #2 - Full Data & Analytics Engagement, from / through 2026-04-01 → 2026-08-31). Legacy 145117 LMNT is archived so it does not compete with Deal #2 in project pickers. 156984 LMNT Analytics was already archived earlier.
Flags from Operating (snapshot 2026-03-25)
| Signal | Operating object (name from audit) | Intended fix |
|---|---|---|
| Missing project owner | LMNT Analytics (projectOwner: null) | Set primary project owner in Operating UI (or PATCH project via API) — must be decided by HoD/CSO (client umbrella vs analytics SL). Note: project is archived; only worth fixing if you unarchive for reporting. |
| Tentative + past end | LMNT Data Platform (Tentative; through before snapshot date) | Maps to project 145117 LMNT in API. Confirm vs Deal #2 (171036). |
Applied via REST API (2026-04-15)
Using the key from operating-api-setup.md (op read):
171036(Deal #2) —PATCHstatusIdfrom Tentative (578) → Confirmed (577). (projectOwnerIdwas already set in full GET; list view showed null.)145117(LMNT) —PATCHstatusIdTentative → Confirmed so the 2025-12-01 → 2026-03-01 slice is not left Tentative after the end date (Deal #2 carries forward active work).
API_KEY=$(op read "op://66hi4dru5dtznpzqwdac23e2fm/lk4xm23nk3vmwp4squcfindicq/password")
curl -s -X PATCH "https://api.operating.app/v1/projects/171036" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"statusId":"577"}' | jq '.data | {id, name, statusId}'
curl -s -X PATCH "https://api.operating.app/v1/projects/145117" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"statusId":"577"}' | jq '.data | {id, name, statusId, through}'Optional follow-ups (human): Archive 145117 if Deal #1 should be fully closed in UI; resolve LMNT Analytics owner only if you unarchive 156984.
HubSpot ↔ Operating dates — Deal #2 (171036) — 2026-04-15
Source of truth for close won in HubSpot: deal 260065651435 — Jan’26-LMNT - Deal #2 - Full Data & Analytics Engagement — closedate 2026-04-07T20:36:33.102Z (portal na2). Set deal property signed_agreement_drive_url to the LMNT client folder (or primary signed PDF) — see tools/hubspot-api-service/scripts/patch-deal-signed-agreement-urls.ts.
Operating PATCH /v1/projects/171036 accepts from / through as YYYY-MM-DD only (not full ISO timestamps).
| System | Start | End / close (calendar) |
|---|---|---|
| HubSpot | (not a first-class deal field; agreed engagement start) 2026-04-01 | 2026-04-07 (closedate) |
| Operating (project window; staffing) | 2026-04-01 | 2026-08-31 |
Earlier patch used through 2026-04-07 to mirror HubSpot close date; superseded by the Apr–Aug project window below.
Applied (superseded — see Apr–Aug section for current PATCH):
# Historical — project later extended through 2026-08-31
curl -sS -X PATCH "https://api.operating.app/v1/projects/171036" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"from":"2026-04-01","through":"2026-04-07"}' | jq '.data | {id, name, from, through}'Note: HubSpot close-won day was 2026-04-07; the delivery / SOW window for staffing was later set to 2026-04-01 → 2026-08-31 on project 171036 (see below).
Project + allocations — Apr 1 through end of August 2026 (171036) — 2026-04-15
Project PATCH /v1/projects/171036: from 2026-04-01, through 2026-08-31 (end of August).
Positions on 171036 (created 2026-04-13): 1557043, 1557044, 1557045 (person 37939, three roles), 1557053 (person 50131). A PATCH on allocationRange was attempted for parity with the skill doc; GET /v1/positions/{id} still returned no allocationRange — authoritative ranges are the allocation rows below.
Allocations (extended in place — same from, percentage, statusId, only through):
| Allocation ID | Position | Was | Now |
|---|---|---|---|
2917334 | 1557043 | 2026-04-01 → 2026-04-30 | → 2026-08-31 |
2917336 | 1557044 | 2026-04-01 → 2026-04-30 | → 2026-08-31 |
2917337 | 1557045 | 2026-04-01 → 2026-04-30 | → 2026-08-31 |
2917355 | 1557053 | 2026-04-01 → 2026-04-30 | → 2026-08-31 |
Percentages at time of update: 1557043 25% (250000), 1557044 10% (100000), 1557045 2.5% (25000), 1557053 25% (250000).
API_KEY=$(op read "op://66hi4dru5dtznpzqwdac23e2fm/lk4xm23nk3vmwp4squcfindicq/password")
curl -sS -X PATCH "https://api.operating.app/v1/projects/171036" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"from":"2026-04-01","through":"2026-08-31"}' | jq '.data | {id, from, through}'
for id in 2917334 2917336 2917337 2917355; do
curl -sS -X PATCH "https://api.operating.app/v1/allocations/$id" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"through":"2026-08-31"}' | jq '.data | {id, positionId, from, through, percentage}'
doneFull billing roster — Deal #2 (171036) — SOW Apr 1–Aug 31, 2026 — 2026-04-15
Source: lmnt-data-sprint-sow-2026-excerpt.md — five workstreams (foundation, demand, marketing, supply, BI/Omni); fixed fee covers all workstreams.
Principle: Everyone listed here bills LMNT; they are modeled on the client project with competence roles (service line is classification — SL, PM, AE, DE — not a separate “unassigned” bucket).
Changes applied (REST):
- Archived redundant Awaish positions
1557043(Analytics Engineer) and1557044(Data Engineer) — replaced by a single Service Lead row (1557045) so SL + IC isn’t split three ways. PATCHallocations: Awaish2917337→ 22% (220000).Ashwini— superseded: Ashwini removed from Deal #2 (allocation ended2917355→ 12%2026-04-14, position1557053archived — 2026-04-15).POSTpositions + allocations (2026-04-01→2026-08-31,statusId573Confirmed) for the rest of the billing team.
| Person | Operating personId | Position ID | Competence role | Allocation % | Rationale (SOW lens) |
|---|---|---|---|---|---|
| Uttam Kumaran | 37936 | 1570418 | Delivery Lead (2795) | 8% | Cross-workstream / exec oversight on fixed-fee delivery |
| Robert Tseng | 37937 | 1570419 | Service Lead (3367) | 10% | CSO / managing partner — client governance |
| Gregory Stoutenburg | 50909 | 1570420 | Analytics Engineer (1810) | 18% | WS5 BI/Omni pilot, dashboards, stakeholder cadence |
| Jasmin Multani | 55588 | 1570422 | Service Lead (3367) | 12% | Strategy / client-facing leadership |
| Garrett Gibson | 59139 | 1570426 | Project Manager (1813) | 12% | PM — Linear hygiene, deck cadence, milestones |
| Advait Nandakumar Menon | 58355 | 1570428 | Analytics Engineer (1810) | 18% | Omni dashboards, topics, build track |
| Awaish Kumar | 37939 | 1557045 | Service Lead (3367) | 22% | WS1–WS4 technical lead — marts, ingestion, data memos (single SL line) |
Ashwini Sharma — removed 2026-04-15: allocation 2917355 ended 2026-04-14; position 1557053 archived (no longer on client).
Allocation IDs (new): 2932530, 2932533, 2932535, 2932536, 2932538, 2932540 (paired to positions above in API order).
Operating constraint: Competence roles are a fixed catalog (e.g. no separate “CEO” or “CSO” role in tenant); Delivery Lead / Service Lead / Project Manager / Analytics Engineer are the closest fit for exec / CSO / PM / build work.
Roster change — Ashwini Sharma off Deal #2 — 2026-04-15
Ashwini is no longer on LMNT; Operating was updated to match.
| Action | IDs | Notes |
|---|---|---|
PATCH allocation | 2917355 | through → 2026-04-14; note: removed from Deal #2 — no longer on client |
| Archive position | 1557053 | archivedAt set (same pattern as archived Awaish positions 1557043, 1557044) |
Remaining active roster (7 people) on 171036: Uttam, Robert, Greg, Jasmin, Garrett, Advait, Awaish — example planning weights 8% + 10% + 18% + 12% + 12% + 18% + 22% (that snapshot sums to 100% for convenience; per client, % do not need to total 100% — the binding check is each person’s portfolio ≤ 100% across all clients).
API_KEY=$(op read "op://66hi4dru5dtznpzqwdac23e2fm/lk4xm23nk3vmwp4squcfindicq/password")
curl -sS -X PATCH "https://api.operating.app/v1/allocations/2917355" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{"through":"2026-04-14","noteText":"Removed from LMNT Deal #2 — no longer on client (2026-04-14)"}'
curl -sS -X PATCH "https://api.operating.app/v1/positions/1557053" \
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d "{\"archivedAt\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"}"Linear alignment (evidence only, 2026-04-14)
Pulled team LMNT projects in Linear to show who is already leading execution on named initiatives. This does not auto-map to Operating projectOwner fields; use it in conversation with HoD.
| Linear project | Project lead (when set) | Initiative / theme |
|---|---|---|
| Data Source Memos | Uttam Kumaran | WS1 Data Foundation & Governance |
| Supply Chain Data Mart | Awaish Kumar | WS4 Supply Chain |
| Ecommerce Data Mart | Awaish Kumar | WS2 Demand Performance |
| Retail Data Mart | Awaish Kumar | WS2 |
| Wholesale Data Mart | Awaish Kumar | WS2 |
| Omni Foundation & Pilot Scope | Gregory Stoutenburg | WS5 BI (completed) |
| Omni Pilot — Topics and Draft Dashboards | Gregory Stoutenburg | WS5 BI (in progress) |
Several LMNT Linear projects have no project lead; filling Operating project owners is still required for the two flagged Operating projects.
Checklist (run in Operating UI or via API)
- LMNT Analytics (
156984) — assignprojectOwnerIdonly if you unarchive for reporting; otherwise skip. - Legacy
LMNT(145117) — Tentative → Confirmed via API (2026-04-15);archivedAtset 2026-04-15 so only Deal #2 is the forward LMNT engagement row from Apr 2026. - Deal #2 (
171036) — Tentative → Confirmed via API (2026-04-15).from/throughon the project set to2026-04-01/2026-08-31for the Apr–Aug engagement window; four allocations extended to2026-08-31(see table above). - Allocations on
171036— Full billing roster on Deal #2 with SOW-aligned roles; Awaish consolidated to one SL position; Uttam, Robert, Greg, Jasmin, Garrett, Advait added (2026-04-15). Ashwini removed from Deal #2 (2026-04-15). Tune % with HoD vs actuals / Clockify over time. - After further changes, update Last verified below.
API / automation
- REST patterns: sl-allocation-updater (
OPERATING_API_KEY,https://api.operating.app/v1/...). - Interactive: Operating MCP (
list_projects,list_positions,list_allocations) when connected in Cursor — server id may differ by workspace (operatingvsuser-operating).
Last verified in Operating (REST API): 2026-04-15 — GET /v1/positions?projectId=171036 (active roster on Deal #2); archived 1557043, 1557044, 1557053 (Ashwini).