toga-ai 1.0.164 → 1.0.165

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -274,6 +274,26 @@ None — platform-wide Forecast sync.
274
274
  **add-only** on update (we don't read the prior assignee to remove it).
275
275
  - **Null guard:** the Presales Lead users field is omitted when the email has no matching ClickUp
276
276
  user — a `null` in the `add` array is a 400 from ClickUp.
277
+ - **External/non-roster presales leads create a task with a BLANK "Presales Lead" user field — silently.**
278
+ The creation gate (`maybeCreateClickupTask`) tests the **email** (`$body->presalesLead === ''`), not a
279
+ resolved ClickUp user — so any opportunity whose `custbody_ctc_solution_architect` resolves to a non-empty
280
+ email **passes the gate and the task is created**. But `createTask()` then calls `resolvePresalesUserId()`
281
+ (cache → ClickUp team-roster scan by email), and `buildCustomFields()` **omits** the Presales Lead *users*
282
+ field whenever that returns `null` (a `null` in the `add` array is a 400 — see the Null-guard note above).
283
+ Result: the task has **"Presales Email" (text) populated but "Presales Lead" (users) empty**. This is a
284
+ **data/config gap, not a bug** — the integration assumes a presales lead is an internal ClickUp member.
285
+ When the NetSuite presales lead is an **external/partner employee** whose email domain has **no ClickUp
286
+ account** (confirmed live 2026-06-23: opps 54983/71879/71955/72024 with `@asisystem.com` leads Juan Acosta
287
+ / Peter Violini — **zero** `asisystem.com` members in the 72-person workspace), the user field is always
288
+ blank. **It does not self-heal:** `UPDATE_CLICKUP = false` means a later NetSuite edit never back-fills the
289
+ field, and the users field is add-only on update anyway — so onboarding the person into ClickUp later
290
+ requires a one-time backfill of the existing tasks. Diagnostic signature when triaging a "no presales lead"
291
+ report: NS **has** the lead set, the ClickUp task's **Presales Email is set** but **Presales Lead user is
292
+ empty**, and `creator` = the worker2 `[clickup] token` owner (`jcardinal@togatech.com`) — which also rules
293
+ out the NetSuite-side `OPP <id>` stub path (those are unnamed, empty-field tasks) and the legacy `webhook/`
294
+ copy (token `dfranks@togatech.com`). Read-only triage probe: `test/@dave/probe_presales_missing.php`
295
+ (maps opp# → internalId, reads `custbody_ctc_solution_architect`, resolves the email, and prints the gate
296
+ decision the worker would make). There is currently **no log/alert** when the email fails to resolve.
277
297
  - **Backfill legacy `Opportunity #` with `test/@dave/clickup/backfill_opportunity_numbers.php`.**
278
298
  Parses the opportunity number from the task title (the leading integer before the separator) and
279
299
  writes it to the `Opportunity #` field, **never overwriting** a set value. Two legacy title
@@ -317,6 +337,12 @@ same **skip-if-unchanged** compare on the extracted values, and **actor-identity
317
337
  trigger a CU→NS write. The NS→CU change-detection above is the complementary backstop, not a substitute.
318
338
 
319
339
  ## Change history
340
+ - 2026-06-23 — **Root-caused "ClickUp opportunity tasks with no Presales Lead."** NetSuite HAD the lead set
341
+ on all four reported opps; the ClickUp Presales Lead *user* field was blank because the leads are external
342
+ (`@asisystem.com`) employees with no ClickUp account, so `resolvePresalesUserId()` returns null and
343
+ `buildCustomFields()` omits the users field (Presales Email text is still set). Not a code bug — the gate
344
+ keys on email presence, not user resolution. Added the "external/non-roster presales lead" gotcha + the
345
+ triage signature, and a read-only probe `test/@dave/probe_presales_missing.php`. (dfranks)
320
346
  - 2026-06-18 — Documented two NetSuite-client gotchas: **two `_Component_Api_Netsuite` copies** (worker2
321
347
  uses the global `_underscore` one; api2 has a separate `namespace api` copy — edit the right one), and
322
348
  `send()`'s `setLogging(false)` means **NetSuite calls aren't logged to `Logs.Api`** (no historical
@@ -4,7 +4,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
4
4
 
5
5
  ## 1.0 framework
6
6
 
7
- - **library** (Library) _(framework core)_ — 7 doc(s) → [1.0/apps/library/INDEX.md](1.0/apps/library/INDEX.md)
7
+ - **library** (Library) _(framework core)_ — 8 doc(s) → [1.0/apps/library/INDEX.md](1.0/apps/library/INDEX.md)
8
8
  - **worker** (Worker) — 10 doc(s) → [1.0/apps/worker/INDEX.md](1.0/apps/worker/INDEX.md)
9
9
  - **togadesk** (TOGa Desk) — 7 doc(s) → [1.0/apps/togadesk/INDEX.md](1.0/apps/togadesk/INDEX.md)
10
10
  - **togaview** (TOGa View) — 6 doc(s) → [1.0/apps/togaview/INDEX.md](1.0/apps/togaview/INDEX.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.164",
3
+ "version": "1.0.165",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",