toga-ai 1.0.758 → 1.0.759

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.
@@ -6,7 +6,7 @@ project: Library
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-09-02
9
+ updated: 2026-09-03
10
10
  owners: [dfranks, jcardinal, kyalamarthi]
11
11
  files:
12
12
  - library/app/api/netsuite/rest.php
@@ -197,6 +197,23 @@ Forecast2 tables already store.
197
197
  same underlying trap of reusing a sales-order-shaped assumption on a purchase order. Full
198
198
  engine-side impact + the tier-wide per-client backfill live on the
199
199
  [per-client-sync doc](../../worker/features/netsuite-togasupply-per-client-sync.md).
200
+ - **⚠ The three detail-fetch shims were inconsistent about `->lastModifiedDate` — two omitted it and
201
+ froze their sections once a per-record cursor started reading it (fixed 2026-09-03).**
202
+ `fetchItemReceiptById` set `$shim->lastModifiedDate` from its REST header, but **`fetchItemFulfillmentById`
203
+ and `fetchInventoryAdjustmentById` did not** (and InventoryAdjustment's SuiteQL header didn't even SELECT
204
+ `lastmodifieddate`). This was harmless until the 2026-09-02 per-record resume cursor: because
205
+ `syncItemFulfillmentFromNetsuite(&$rec)` / `syncInventoryAdjustmentFromNetsuite(&$rec)` **reassign** their
206
+ by-reference record to the fetch-by-id shim, the engine's cursor PUT then read `$rec->lastModifiedDate` on
207
+ the **replaced** object → *Undefined property: stdClass::$lastModifiedDate* → `App_Error` `exit()` → the
208
+ ITEM_FULFILLMENTS / INVENTORY_ADJUSTMENTS section froze at `1-RUNNING`, window ÷3 (GroWrk's fulfillments
209
+ re-threw every 5 min; InvAdj was latent only because no client had processed one since the rename). **Fix
210
+ (`library` only, `php -l` clean):** `$shim->lastModifiedDate = (string)(...)` in **both** shims —
211
+ fulfillment from the REST header, inventory-adjustment after adding
212
+ `TO_CHAR(lastmodifieddate,'YYYY-MM-DD HH24:MI:SS') AS lastmodifieddate` to its header SELECT. **Lesson:
213
+ a fetch-by-id shim consumed as the replacement for a `&$byReference` record must carry every field the
214
+ caller reads after the call — `lastModifiedDate` first.** Sales orders / POs / invoices don't reassign, so
215
+ they were unaffected. Engine-side detail on the
216
+ [per-client-sync doc](../../worker/features/netsuite-togasupply-per-client-sync.md).
200
217
  - **A shim must produce the SOAP object's SHAPE, not just its scalar fields — an absent nested list
201
218
  crashes 1.0 (2026-08-29).** `fetchCustomerById()`'s `addressbookList` was where the AIG lookup phase
202
219
  crashed: a REST customer with no/odd address made the shim omit the nested `addressbook` structure the
@@ -290,6 +307,14 @@ None — uniform across clients (NetSuite is a single shared account).
290
307
 
291
308
  ## Change history
292
309
 
310
+ - 2026-09-03 — Recorded that **`fetchItemFulfillmentById` and `fetchInventoryAdjustmentById` omitted
311
+ `->lastModifiedDate`** (unlike `fetchItemReceiptById`), which froze ITEM_FULFILLMENTS + INVENTORY_ADJUSTMENTS
312
+ once the 2026-09-02 per-record cursor read that field off the by-reference record these shims replace. GroWrk
313
+ was the reported alert; shared code so all four active togasupply clients (GroWrk, NYCHH, Prudential-EDI,
314
+ S&P Global) were affected. Fixed by setting `$shim->lastModifiedDate` in both shims (adding `lastmodifieddate`
315
+ to InventoryAdjustment's SuiteQL SELECT). `library`-only, `php -l` clean, no data lost, self-heals after
316
+ deploy. Lesson: a fetch-by-id shim used to replace a `&$byReference` record must carry every field the
317
+ caller reads afterward. (jcardinal)
293
318
  - 2026-09-02 — Recorded that **SuiteQL returns date columns in the account DISPLAY format (date-only
294
319
  `M/D/YYYY` here) unless wrapped in `TO_CHAR`** — a bare `lastmodifieddate` silently drops the time and
295
320
  is locale-dependent. This defeated the per-client sync's per-record resume cursor (stored `9/2/2026|id`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.758",
3
+ "version": "1.0.759",
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",