toga-ai 1.0.443 → 1.0.445
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.
- package/knowledge/1.0/apps/togadesk/INDEX.md +2 -1
- package/knowledge/1.0/apps/togadesk/features/email-to-ticket-intake.md +16 -1
- package/knowledge/1.0/apps/togadesk/workflows/production-revert-forward.md +67 -0
- package/knowledge/INDEX.md +1 -1
- package/knowledge/sessions/2026-07-27-true-79191-fulfill-ship-mhammontree.md +74 -0
- package/package.json +1 -1
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
| Doc | Summary | Files |
|
|
4
4
|
|-----|---------|-------|
|
|
5
5
|
| [TOGa Desk Architecture](architecture.md) | TOGa Desk is the staff-facing support desk **and field-service platform** (analysts work at `/desk/`). | desk/index.php, desk/includes/loader.php, desk/config.php, desk/includes/controllers/actions.php, desk/includes/controllers/data.php, desk/includes/controllers/modals.php, desk/includes/classes/class.app.php, desk/includes/classes/class.ticket.php, desk/api/index.php, desk/api/resources/tickets.php, crons/tickets.php |
|
|
6
|
-
| [Email-to-Ticket Intake (crons/tickets.php)](features/email-to-ticket-intake.md) | TOGa Desk ingests support email into tickets through a cron-driven IMAP poller (`crons/tickets.php`) plus a postfix pipe variant (`crons/pipe.php`). | crons/tickets.php, crons/tickets_prod.php, crons/pipe.php, desk/includes/classes/class.ticket.php |
|
|
6
|
+
| [Email-to-Ticket Intake (crons/tickets.php)](features/email-to-ticket-intake.md) | TOGa Desk ingests support email into tickets through a cron-driven IMAP poller (`crons/tickets.php`) plus a postfix pipe variant (`crons/pipe.php`). | crons/tickets.php, crons/tickets_prod.php, crons/pipe.php, desk/includes/classes/class.ticket.php, vendor/classes/class.imap.php |
|
|
7
7
|
| [Field-Service Dispatch (central / repair orders)](features/field-service-dispatch.md) | The **central** subsystem is TOGa Desk's field-service dispatch domain: repair-order lifecycle, technician scheduling, onsite vs depot service, parts, and shipm | desk/includes/controllers/actions/central/, desk/includes/classes/class.repair.php, desk/includes/classes/class.repairhistory.php, desk/_/browser/datatable/central.php, desk/template/pages/central.php, desk/template/pages/central/view.php, desk/template/modals/central/addTracking.php, library/app/model/togadesk/repairorder.php, library/app/model/togadesk/repairordertracking.php, library/app/api/carrier/ups.php |
|
|
8
8
|
| [Managed Service Order Create Flow (New MSO modal → tickets/add)](features/managed-service-order-create.md) | The **Managed Service Order (MSO) create flow** is how a TOGa Desk user manually creates a managed service order: pick an End User (or a Client Location), choos | desk/includes/controllers/actions/tickets/add.php, desk/template/modals/tickets/addNew.php, desk/template/pages/managed.php, desk/template/pages/getinfo.php, desk/template/footer.php, library/app/model/togadesk/repairorder.php |
|
|
9
9
|
| [Ticket Email Notifications (notifications table)](features/notifications.md) | Which TOGa Desk emails fire for a given client is driven **entirely by data**, not code: the `TOGaDeskSupport.notifications` table holds one row per `(clientid, | desk/includes/classes/class.notification.php, crons/tickets.php, crons/tickets_prod.php |
|
|
10
10
|
| [REST API (RPC-over-POST) & API-Key Auth](features/rest-api.md) | TOGa Desk exposes a programmatic API at `desk/api/`. | desk/api/index.php, desk/api/resources/tickets.php, desk/api/resources/assets.php, desk/api/resources/authenticate.php, desk/includes/classes/class.apikey.php, desk/includes/functions.php |
|
|
11
11
|
| [SMB Contract Editing & the clientMspId Corruption Trap](features/smb-contract-editing.md) | The SMB contracts page (`/desk/?route=toga/smbcontracts&togaClientId=<id>`) edits `TOGA_*.SMBContracts` rows via a modal. | desk/template/modals/toga/smbcontracts/smbContract.php, desk/includes/controllers/modals/toga/smbcontracts/smbContract.php, desk/includes/controllers/actions/toga/smbcontracts/smbContract.php, desk/includes/controllers/actions/toga/smbcontracts/edit.php |
|
|
12
12
|
| [Ticket Lifecycle (class.ticket.php)](features/ticket-lifecycle.md) | All TOGa Desk ticket creation and reply handling funnels through `Ticket` in `desk/includes/classes/class.ticket.php`. | desk/includes/classes/class.ticket.php, desk/includes/controllers/actions.php, desk/includes/controllers/actions/tickets/addReply.php, desk/api/resources/tickets.php, desk/api/resources/ticket_replies.php, crons/tickets.php, crons/pipe.php, desk/includes/controllers/actions/tickets/merge.php |
|
|
13
|
+
| [Reverting a TOGa Desk _production Deploy (revert-forward)](workflows/production-revert-forward.md) | How to cleanly and verifiably roll back a single ticket's changes from the togadesk `_production` branch. | |
|
|
13
14
|
| [Standalone PHP Test Script Bootstrap (TOGa Desk)](workflows/standalone-test-scripts.md) | How to write a standalone CLI PHP script that bootstraps the TOGa Desk framework for read-only testing of desk classes (e.g. | |
|
|
@@ -6,13 +6,14 @@ project: TOGa Desk
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-07-
|
|
9
|
+
updated: 2026-07-27
|
|
10
10
|
owners: ["jcardinal", "dfranks", "mhammontree"]
|
|
11
11
|
files:
|
|
12
12
|
- crons/tickets.php
|
|
13
13
|
- crons/tickets_prod.php
|
|
14
14
|
- crons/pipe.php
|
|
15
15
|
- desk/includes/classes/class.ticket.php
|
|
16
|
+
- vendor/classes/class.imap.php
|
|
16
17
|
related:
|
|
17
18
|
- 1.0/apps/togadesk/architecture.md
|
|
18
19
|
- 1.0/apps/togadesk/features/ticket-lifecycle.md
|
|
@@ -84,6 +85,17 @@ config framework**: noise filtering is ad-hoc inline guards in the crons (the ha
|
|
|
84
85
|
(`E_ALL` + `App_Error::handleError`), so an intake cron could **halt**. Hardened to
|
|
85
86
|
`return $matches[0] ?? '';` (TRUE-79975) — important because `isSuppressedNoiseEmail` routes
|
|
86
87
|
nullable/malformed sender input through `extractEmail`, putting this latent bug on the hot path.
|
|
88
|
+
- **`class.imap.php` duplicate trap — the OPPOSITE direction from `class.ticket.php`.** Two
|
|
89
|
+
copies of `class.imap.php` exist with different contents: root-level
|
|
90
|
+
`vendor/classes/class.imap.php` and `desk/vendor/classes/class.imap.php`. For the
|
|
91
|
+
email-intake path the **root-level `vendor/classes/class.imap.php` is the LIVE file** — the
|
|
92
|
+
one the intake cron uses and the one PR edits/reverts must target (confirmed: TRUE-80116's
|
|
93
|
+
attachment MIME-walker rewrite, and its revert, both touched `vendor/classes/class.imap.php`;
|
|
94
|
+
the `desk/vendor/...` copy has a different blob and was never touched). This is the reverse of
|
|
95
|
+
the `class.ticket.php` rule (where `desk/includes/classes/` is live and the repo-root copy is
|
|
96
|
+
dead). Verifying the wrong copy gives a false "byte-identical across commits" result because
|
|
97
|
+
the untouched copy trivially matches. Prior guidance naming `desk/vendor/classes/class.imap.php`
|
|
98
|
+
as live is wrong for intake.
|
|
87
99
|
- Attachments are deleted locally immediately after the S3 upload with **no retry** if S3 fails.
|
|
88
100
|
- **`adminid` clobber on reply routing:** after `emailToTicket()` sets `$data['adminid']` from
|
|
89
101
|
the FROM address (~line 1407), an asset lookup (~line 1437-1442) overwrites it with the
|
|
@@ -93,6 +105,9 @@ config framework**: noise filtering is ad-hoc inline guards in the crons (the ha
|
|
|
93
105
|
classification. See the ticket-lifecycle doc.
|
|
94
106
|
|
|
95
107
|
## Change history
|
|
108
|
+
- 2026-07-27 — corrected the live IMAP-class location: root-level `vendor/classes/class.imap.php`
|
|
109
|
+
is the file the intake cron uses (NOT `desk/vendor/classes/class.imap.php`), the opposite of the
|
|
110
|
+
`class.ticket.php` duplicate rule; added it to `files:` (dfranks)
|
|
96
111
|
- 2026-07-09 — added `Ticket::isSuppressedNoiseEmail()` noise suppression (no-reply sender + "Staples PO"
|
|
97
112
|
subject) wired into both feeders before ticket creation; hardened `extractEmail()` no-match to
|
|
98
113
|
`''`; documented the `tickets_defaultdepartment` → "Support Desk" catch-all fall-through
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Reverting a TOGa Desk _production Deploy (revert-forward)
|
|
3
|
+
framework: "1.0"
|
|
4
|
+
repo: togadesk
|
|
5
|
+
project: TOGa Desk
|
|
6
|
+
client: shared
|
|
7
|
+
type: workflow
|
|
8
|
+
status: active
|
|
9
|
+
updated: 2026-07-27
|
|
10
|
+
owners: ["dfranks"]
|
|
11
|
+
files: []
|
|
12
|
+
related:
|
|
13
|
+
- 1.0/apps/togadesk/architecture.md
|
|
14
|
+
- 1.0/apps/togadesk/features/email-to-ticket-intake.md
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Summary
|
|
18
|
+
How to cleanly and verifiably roll back a single ticket's changes from the togadesk
|
|
19
|
+
`_production` branch. Deploys land on `_production` as **two-parent merge commits**, so a
|
|
20
|
+
rollback is a `git revert -m 1` of the merge — and when later tickets have since touched the
|
|
21
|
+
same file, the correct rollback is a per-hunk revert (not a whole-file restore), verified with
|
|
22
|
+
`git patch-id`.
|
|
23
|
+
|
|
24
|
+
## The deploy model
|
|
25
|
+
Changes reach `_production` as merge commits in one of two shapes:
|
|
26
|
+
- PR merge commit — `Merge pull request #NNN from agilantsolutions/TRUE-XXXX`
|
|
27
|
+
- Automated merge — `Merged from TRUE-XXXX to _production (automated)`
|
|
28
|
+
|
|
29
|
+
Both have two parents: parent 1 is the prior `_production` tip, parent 2 is the ticket branch.
|
|
30
|
+
|
|
31
|
+
## Steps
|
|
32
|
+
1. Identify the merge commit SHA for the ticket to roll back (`git log --merges` /
|
|
33
|
+
`--grep=TRUE-XXXX`).
|
|
34
|
+
2. Revert it keeping the `_production` mainline:
|
|
35
|
+
```
|
|
36
|
+
git revert -m 1 <merge-sha>
|
|
37
|
+
```
|
|
38
|
+
`-m 1` keeps first parent (`_production`) and undoes the branch's changes. Git reverses only
|
|
39
|
+
that ticket's hunks and auto-merges around any commits that landed later.
|
|
40
|
+
3. **Do not** do a whole-file restore (e.g. `git checkout <old-sha> -- path`) when a later
|
|
41
|
+
ticket has since modified the same file — that would also wipe the later ticket's work.
|
|
42
|
+
|
|
43
|
+
## Verifying the revert is exact
|
|
44
|
+
- **File untouched by any later ticket:** whole-file blob/byte equality vs. the pre-ticket
|
|
45
|
+
version is a valid check.
|
|
46
|
+
- **File changed by later tickets:** blob equality is meaningless (line offsets shifted). Prove
|
|
47
|
+
the revert is the precise inverse of the original change with `git patch-id`:
|
|
48
|
+
```
|
|
49
|
+
# inverse of the original merge's diff for the file
|
|
50
|
+
git show <merge-sha> -- <file> | ...invert... | git patch-id --stable
|
|
51
|
+
# our revert's diff for the file
|
|
52
|
+
git show <revert-sha> -- <file> | git patch-id --stable
|
|
53
|
+
```
|
|
54
|
+
Equal patch-ids prove the revert change is the exact inverse of the original regardless of
|
|
55
|
+
line-offset shifts from intervening commits.
|
|
56
|
+
|
|
57
|
+
## Gotchas
|
|
58
|
+
- Confirm you are targeting the **live** copy of any duplicated file before verifying — e.g.
|
|
59
|
+
the email-intake IMAP class is root-level `vendor/classes/class.imap.php`, while the live
|
|
60
|
+
ticket class is `desk/includes/classes/class.ticket.php` (opposite duplicate directions). A
|
|
61
|
+
verification against the wrong (untouched) duplicate falsely reports "identical". See the
|
|
62
|
+
email-to-ticket-intake feature doc.
|
|
63
|
+
- `_production` is the deploy target for togadesk (not `_main`).
|
|
64
|
+
|
|
65
|
+
## Change history
|
|
66
|
+
- 2026-07-27 — documented the revert-forward rollback + `git patch-id` precision check for the
|
|
67
|
+
togadesk merge-commit deploy model (dfranks)
|
package/knowledge/INDEX.md
CHANGED
|
@@ -7,7 +7,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
|
|
|
7
7
|
- **library** (Library) _(framework core)_ — 14 doc(s) → [1.0/apps/library/INDEX.md](1.0/apps/library/INDEX.md)
|
|
8
8
|
- **worker** (Worker) — 15 doc(s) → [1.0/apps/worker/INDEX.md](1.0/apps/worker/INDEX.md)
|
|
9
9
|
- **worker1.5** (Worker 1.5) — 0 doc(s) → [1.0/apps/worker1.5/INDEX.md](1.0/apps/worker1.5/INDEX.md)
|
|
10
|
-
- **togadesk** (TOGa Desk) —
|
|
10
|
+
- **togadesk** (TOGa Desk) — 10 doc(s) → [1.0/apps/togadesk/INDEX.md](1.0/apps/togadesk/INDEX.md)
|
|
11
11
|
- **togaview** (TOGa View) — 6 doc(s) → [1.0/apps/togaview/INDEX.md](1.0/apps/togaview/INDEX.md)
|
|
12
12
|
- **webhook** (Webhook) — 1 doc(s) → [1.0/apps/webhook/INDEX.md](1.0/apps/webhook/INDEX.md)
|
|
13
13
|
- **walmarttechservices** (Walmart Tech Services) — 1 doc(s) → [1.0/apps/walmarttechservices/INDEX.md](1.0/apps/walmarttechservices/INDEX.md)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: session
|
|
3
|
+
slug: true-79191-fulfill-ship
|
|
4
|
+
title: TRUE-79191 Fulfill & Ship — package Units of Measure full-stack (shipped, verified) + local-env fixes
|
|
5
|
+
author: mhammontree
|
|
6
|
+
repos: [dbchanges2, _underscore, api2, toga2-supply]
|
|
7
|
+
framework: "2.0"
|
|
8
|
+
client: shared
|
|
9
|
+
status: active
|
|
10
|
+
created: 2026-07-27
|
|
11
|
+
updated: 2026-07-27
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Session: true-79191-fulfill-ship
|
|
15
|
+
**Date:** 2026-07-27
|
|
16
|
+
**Project/Repo:** toga2-supply (2.0) + _underscore / api2 / dbchanges2
|
|
17
|
+
**Task:** Implement the package Units-of-Measure feature full-stack (dbchanges2 → _underscore models → api2 metadata → toga2-supply UI), verify save/retrieve locally, and prep deployment.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## What WORKED
|
|
22
|
+
<!-- All verified this session -->
|
|
23
|
+
- **dbchanges2 UoM migrations (4 files, committed d52f811 / 3d18971 / ceeb95d), applied + verified idempotent across all 11 local client DBs + Core_2:**
|
|
24
|
+
- `Client/2026-07-22a - MeasureUomColumns.sql` — `Measures.measureType ENUM('LENGTH','WEIGHT')` + `conversionFactorToBase DECIMAL(18,9)`; idempotent seed of **Inch** (LENGTH, factor 1) + **Pound** (WEIGHT, factor 1) via fixed v4-literal uuids + `NOT EXISTS` on slug.
|
|
25
|
+
- `Client/2026-07-22b - TrackingNumberMeasureIds.sql` — `lengthMeasureId` (governs length/width/height) + `weightMeasureId`; backfill existing rows → Inch/Pound (9605 rows on Growrk); then **hard FK constraints** (order: cols → backfill → FK). `ORDER BY id ASC` on backfill subqueries (defensive vs junk `slug='Text'` rows that exist in Compass/CompassCanada).
|
|
26
|
+
- `Core/2026-07-22a - MeasureUomRecordFields.sql` — RecordFields **2436** lengthMeasureId + **2437** weightMeasureId on tracking-numbers (MATCH/NULL, like shippingMethodId), **2438** measureType on measures (STRING, like signatureType).
|
|
27
|
+
- `Client/2026-07-22c - TrackingNumberMeasureIdsFieldPermission.sql` — write grants for the 2 FK fields (mirror **shippingMethodId**) + **read** grant for `measures.measureType` (mirror sibling **slug**).
|
|
28
|
+
- **_underscore models (committed 77fae34c), linted + php-reviewer clean:** `Measure.php` (+`measureType` FIELD_CHAR, +`conversionFactorToBase` FIELD_DECIMAL); `TrackingNumber.php` (+`lengthMeasureId`/`weightMeasureId` `[FIELD_FOREIGNKEY, FIELDOPT_FOREIGNKEY_MODEL => '\_Model_Client_Measure']`).
|
|
29
|
+
- **api2 — NO code change needed** (metadata-driven; confirmed zero refs to needsReturnLabel/signatureType). Fields exposed purely via Core RecordFields + Client ACL.
|
|
30
|
+
- **toga2-supply frontend (commit e91f7029d, 10 files, `tsc --noEmit` clean):** two RHF selects fed by `GET /v2/measures` split client-side by `measureType`; FK write as **nested relation `{uuid}`** (`lengthMeasure`/`weightMeasure`, mirrors shippingCarrier — NOT scalar id); read field-selectors request `lengthMeasure`/`weightMeasure`; default Inch/Pound; Pending Shipments dimension unit from length symbol.
|
|
31
|
+
- **End-to-end save/retrieve VERIFIED in DB:** new tracking number **9676** (SO 7221433 / NetSuite, created 2026-07-27 12:06) has `lengthMeasureId=1` (inch) / `weightMeasureId=2` (pound) — populated by the **frontend create payload** (proves real persistence: column defaults NULL, and the 07-22 backfill predates this row).
|
|
32
|
+
- **Local-env fixes** (see failures section for why these were NOT our code): `pcre.jit=0` in php.ini; `Items.isFulfillable` column added to all 11 local client DBs.
|
|
33
|
+
- Deployment doc `C:\WWW\TRUE-79191_deployment_order.md` updated with all 4 UoM migrations + notes.
|
|
34
|
+
|
|
35
|
+
## What did NOT work — DO NOT RETRY THESE
|
|
36
|
+
- **First `22c` mirrored `needsReturnLabel` for the measure-field WRITE grants** → on `Client_True` it granted **nothing** (needsReturnLabel's own grants never propagated to every client). Writing lengthMeasureId/weightMeasureId there would return **EV-9**. FIX: mirror **`shippingMethodId`** (stable, universal, MATCH FK, same form) — it correctly copies each client's own writer roles (Growrk=1, Compass=1,3,4).
|
|
37
|
+
- **Skipped granting `measures.measureType`** (assumed read-only fields need no ACL) → **WRONG.** The V2 engine builds each GET's **output** field list from `AclFieldPermissions` (`getAclFieldPermissions` + `foreach ($aclFieldPermissions as $field)` output loops in `V2.php`), so a field with no grant row for the caller's role is **silently omitted**. `GET /v2/measures` returned rows without `measureType` → the frontend LENGTH/WEIGHT split matched nothing → **both unit dropdowns rendered empty**. FIX: grant `measureType` read by mirroring sibling `slug` per-client (in `22c`).
|
|
38
|
+
- **`sales-orders` 500 was NOT our UoM code** — two stacked local-env issues: (a) `preg_split(): Allocation of JIT memory failed` at `Sentry\init()` bootstrap (PCRE JIT can't allocate executable memory on this Win Enterprise machine); the framework escalates the warning to a fatal, 500-ing **every** request → FIX `pcre.jit=0` + restart Apache. Then (b) DB error **1054 Unknown column 'isFulfillable'** — the prod sync brought the updated `_Model_Client_Item` but not the `2026-07-17` migration → FIX add the column locally.
|
|
39
|
+
- **Do NOT re-run `Client/2026-07-22b` after go-live** — the backfill is one-time; a re-run coerces later legitimately-NULL rows to Inch/Pound (column + FK adds are guarded, the backfill is not re-run-safe).
|
|
40
|
+
- `FIELD_LIST` for measureType — rejected; `FIELD_CHAR` is correct (FIELD_LIST is reserved for fields with explicit class constants; signatureType precedent).
|
|
41
|
+
|
|
42
|
+
## Not tried yet (candidates for next session)
|
|
43
|
+
- **Deploy** TRUE-79191 (deployment order doc is ready) — the actual go-live.
|
|
44
|
+
- Seed **cm/kg** into a client (metric, per-client opt-in) to exercise multi-option dropdown — offered, not done (Growrk currently US-only, so saved value == default value visually).
|
|
45
|
+
- **Full local DB migration catch-up / reset from beta** — drift scan found **16 genuine missing columns** in unrelated tables (TransferOrders, Cases, Questions, TicketSlas, Persona/Language/User RecordFieldSettings, Integrations, Bills, SectionRecordFields) — none in the fulfill/ship path. (5 more "missing" were FIELD_STORAGE false positives: labelPdfFile, imageFile, invoicePdfFile, Files.data, fileData.)
|
|
46
|
+
- Make the **weight symbol on Pending Shipments cards dynamic** (currently static `"lbs."`; TODO in ShipmentsCardTableForm; weightMeasure.symbol already fetched).
|
|
47
|
+
- Register `isFulfillable` RecordField/interceptors locally (skipped — id-2434 collision).
|
|
48
|
+
|
|
49
|
+
## Current file state
|
|
50
|
+
| File | Status | Notes |
|
|
51
|
+
|------|--------|-------|
|
|
52
|
+
| dbchanges2 Client 2026-07-22a/b/c, Core 2026-07-22a | committed (d52f811/3d18971/ceeb95d), applied to all 11 local clients + Core_2 | UoM schema + seed + backfill + FK + RecordFields + ACL |
|
|
53
|
+
| _underscore Model/Client/Measure.php, TrackingNumber.php | committed (77fae34c) | UoM model fields; survived prod merges |
|
|
54
|
+
| toga2-supply (10 src files) | committed (e91f7029d) | UoM UI; .env/.env.development/package-lock intentionally uncommitted |
|
|
55
|
+
| api2 | no changes | metadata-driven; only untracked local Config/dev-*.ini |
|
|
56
|
+
| C:\WWW\TRUE-79191_deployment_order.md | updated (external) | UoM migrations + notes added |
|
|
57
|
+
| Local: php.ini pcre.jit=0; all client Items.isFulfillable column | applied (local env only) | NOT repo changes; beta/prod unaffected |
|
|
58
|
+
|
|
59
|
+
## Decisions made
|
|
60
|
+
- **Columns `lengthMeasureId` + `weightMeasureId`** (not dimension/volume); **volume dropped entirely** (Jeff). One length unit governs length/width/height.
|
|
61
|
+
- **Reuse Measures + `measureType` enum, zero new tables**; base units Inch/Pound; `conversionFactorToBase` convention `value_in_base = value × factor`. (Two-table alternative rejected by Jeff.)
|
|
62
|
+
- **Hard FK constraints** (Jeff "+ FKs"; values fully controlled via seed+backfill; matches `UnitTypes.sql` precedent) — rejected logical-only (returnAddressId precedent).
|
|
63
|
+
- **Mirror `shippingMethodId`** for write grants (universal/stable), **mirror `slug`** for measureType read grant — rejected needsReturnLabel (incomplete propagation).
|
|
64
|
+
- **`pcre.jit=0` is a local-only env fix**, not code — beta/prod PHP permits JIT, so nothing to ship.
|
|
65
|
+
- **isFulfillable: add column only locally**, skip RecordField (its migration hardcodes `id=2434`, colliding with returnAddressId `2026-07-10a` also 2434 — flag to that feature's owner).
|
|
66
|
+
|
|
67
|
+
## Blockers
|
|
68
|
+
None blocking. Ready to deploy. **Before running `Core/2026-07-22a` in production, verify `SELECT MAX(id) FROM Core.RecordFields = 2435`** — the migration hardcodes ids 2436-2438; if the sequence advanced, bump them.
|
|
69
|
+
|
|
70
|
+
## Exact next step
|
|
71
|
+
> Deploy TRUE-79191 per `C:\WWW\TRUE-79191_deployment_order.md` (order: DB → backend → frontend). First confirm prod `MAX(Core.RecordFields.id) = 2435` (else bump the 2436-2438 ids in `Core/2026-07-22a`), run `composer install` on api2 (FPDF) + apply production carrier config, and separately flag the unrelated `isFulfillable` migration's `id=2434` collision to its owner.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
_Saved by /session-save on 2026-07-27_
|
package/package.json
CHANGED