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 AgreementsActive ClientsDrink LMNT. List with gws (shared-drive flags): see sl-allocation-updater § Evidence gate.

ArtifactLink
LMNT client folderDrive folder
Master Service Agreement & SOWs (signed PDF)PDF
Amendment to Statement of Work #1 (signed PDF)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)

FieldValue
Client68201 — LMNT
Project 145117Name LMNTarchived 2026-04-15T03:31:51Z (Deal #1 / legacy row). Do not use for Apr 2026+ staffing — see Single project rule below.
Project 171036Jan'26-LMNT - Deal #2 - Full Data & Analytics Engagement — active Deal #2.
Project 156984LMNT Analyticsarchived 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-012026-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)

SignalOperating object (name from audit)Intended fix
Missing project ownerLMNT 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 endLMNT 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):

  1. 171036 (Deal #2)PATCH statusId from Tentative (578)Confirmed (577). (projectOwnerId was already set in full GET; list view showed null.)
  2. 145117 (LMNT)PATCH statusId Tentative → 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 260065651435Jan’26-LMNT - Deal #2 - Full Data & Analytics Engagementclosedate 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).

SystemStartEnd / close (calendar)
HubSpot(not a first-class deal field; agreed engagement start) 2026-04-012026-04-07 (closedate)
Operating (project window; staffing)2026-04-012026-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 allocationRangeauthoritative ranges are the allocation rows below.

Allocations (extended in place — same from, percentage, statusId, only through):

Allocation IDPositionWasNow
291733415570432026-04-012026-04-302026-08-31
291733615570442026-04-012026-04-302026-08-31
291733715570452026-04-012026-04-302026-08-31
291735515570532026-04-012026-04-302026-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}'
done

Full 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):

  1. Archived redundant Awaish positions 1557043 (Analytics Engineer) and 1557044 (Data Engineer) — replaced by a single Service Lead row (1557045) so SL + IC isn’t split three ways.
  2. PATCH allocations: Awaish 291733722% (220000). Ashwini 291735512%superseded: Ashwini removed from Deal #2 (allocation ended 2026-04-14, position 1557053 archived — 2026-04-15).
  3. POST positions + allocations (2026-04-012026-08-31, statusId 573 Confirmed) for the rest of the billing team.
PersonOperating personIdPosition IDCompetence roleAllocation %Rationale (SOW lens)
Uttam Kumaran379361570418Delivery Lead (2795)8%Cross-workstream / exec oversight on fixed-fee delivery
Robert Tseng379371570419Service Lead (3367)10%CSO / managing partner — client governance
Gregory Stoutenburg509091570420Analytics Engineer (1810)18%WS5 BI/Omni pilot, dashboards, stakeholder cadence
Jasmin Multani555881570422Service Lead (3367)12%Strategy / client-facing leadership
Garrett Gibson591391570426Project Manager (1813)12%PM — Linear hygiene, deck cadence, milestones
Advait Nandakumar Menon583551570428Analytics Engineer (1810)18%Omni dashboards, topics, build track
Awaish Kumar379391557045Service Lead (3367)22%WS1–WS4 technical lead — marts, ingestion, data memos (single SL line)

Ashwini Sharmaremoved 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.

ActionIDsNotes
PATCH allocation2917355through2026-04-14; note: removed from Deal #2 — no longer on client
Archive position1557053archivedAt 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 projectProject lead (when set)Initiative / theme
Data Source MemosUttam KumaranWS1 Data Foundation & Governance
Supply Chain Data MartAwaish KumarWS4 Supply Chain
Ecommerce Data MartAwaish KumarWS2 Demand Performance
Retail Data MartAwaish KumarWS2
Wholesale Data MartAwaish KumarWS2
Omni Foundation & Pilot ScopeGregory StoutenburgWS5 BI (completed)
Omni Pilot — Topics and Draft DashboardsGregory StoutenburgWS5 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)

  1. LMNT Analytics (156984) — assign projectOwnerId only if you unarchive for reporting; otherwise skip.
  2. Legacy LMNT (145117)Tentative → Confirmed via API (2026-04-15); archivedAt set 2026-04-15 so only Deal #2 is the forward LMNT engagement row from Apr 2026.
  3. Deal #2 (171036)Tentative → Confirmed via API (2026-04-15). from / through on the project set to 2026-04-01 / 2026-08-31 for the Apr–Aug engagement window; four allocations extended to 2026-08-31 (see table above).
  4. 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.
  5. 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 (operating vs user-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).