toga-ai 1.0.967 → 1.0.968

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.
@@ -12,6 +12,7 @@
12
12
  | [Diagnostic Dialog — View Recommended Services Routing](features/diagnostic-dialog-view-recommended-services.md) | TOGa Refresh 2026 "View Recommended Services" routing — per-device diagnostic `resultCode` decides serviceselection vs techsupport; open when touching that rout |
13
13
  | [Elite Freshservice Sync (library)](features/elite-freshservice-sync.md) | Elite bidirectional ticket/attachment sync between TOGA 2 and TOGaDesk (`App_Api_Toga2::syncWithTogadesk`); open for the sync mechanics, watermarks, and Elite-s |
14
14
  | [App_Email Queued Sending & Attachments (Common.EmailsQueued)](features/email-queue-attachments.md) | 1.0 `App_Email` queued sending + attachment embedding via `Common.EmailsQueued`; open when a queued email loses attachments or when deploying worker/togadesk to |
15
+ | [App_Email SES Sender Identity (every From address must be verified in SES first)](features/email-ses-sender-identity.md) | 1.0 `App_Email` sends through Amazon SES SMTP; any new From address must be a verified SES identity first or SES rejects the send. |
15
16
  | [Branded HTML Email Templates (App_Email_Template)](features/email-templates.md) | Branded HTML email base class `App_Email_Template` (header/body/footer); open when building or fixing a 1.0 branded email or its Outlook rendering. |
16
17
  | [App_Email Side Effects & Test Mode (how to send a real email that writes nothing)](features/email-test-mode-and-write-free-sends.md) | 1.0 `App_Email::send()` side effects (log/queue writes, test-mode recipient rewrite) and how to send a genuinely write-free test; open before writing any 1.0 dr |
17
18
  | [Error Capture in 1.0 (App_Error_Capture → shared 2.0 Logs DB)](features/error-capture-1-0.md) | 1.0 error-reporting into the shared 2.0 Logs DB (`App_Error_Capture::captureException`), mirroring 2.0's Issue/Event; open when adding a 1.0 capture path or deb |
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: App_Email SES Sender Identity (every From address must be verified in SES first)
3
+ framework: "1.0"
4
+ repo: library
5
+ project: Library
6
+ client: shared
7
+ type: feature
8
+ status: active
9
+ updated: 2026-10-07
10
+ owners: ["bala"]
11
+ files:
12
+ - library/app/email.php
13
+ related:
14
+ - ./email-queue-attachments.md
15
+ - ./email-test-mode-and-write-free-sends.md
16
+ - ../../tools/features/legacy-email-notifier.md
17
+ - ../../test/features/goagilant-to-togatech-email-migration.md
18
+ - ../../../../clients/compass-canada/profile.md
19
+ ---
20
+
21
+ 1.0 `App_Email` sends through Amazon SES SMTP; any new From address must be a verified SES identity first or SES rejects the send. Open before changing a `sendFromEmailAddress` / `fromEmailAddress` to a new address or a customer domain.
22
+
23
+ ## Summary
24
+
25
+ `App_Email` (`library/app/email.php`) sends via PHPMailer to SES SMTP at `email-smtp.us-west-2.amazonaws.com`, in the **toga-legacy** AWS account, region **us-west-2** (not us-east-1). SES only accepts a From address that is a verified identity in that account and region. The account is out of the SES sandbox, so To/CC recipients need no verification. Only the sender does.
26
+
27
+ ## How it works
28
+
29
+ - **Domain identity:** `togatech.com` is verified as a whole domain, so any `@togatech.com` From works.
30
+ - **Customer-domain addresses are single EMAIL_ADDRESS identities**, not domains. Verified so far: `techhub@compass-usa.com`, `Techhub.Canada@compass-canada.com`.
31
+ - **Verifying one address:** SES mails a link from `no-reply-aws@amazon.com`, subject "Amazon Web Services – Email Address Verification Request in region US West (Oregon)". The customer's mailbox owner must click it within **24h**. Until then the identity is pending and sends fail.
32
+ - **Alternative:** a domain identity for the customer domain. Needs the customer's IT to add DKIM DNS records. Use it when several addresses on that domain will send.
33
+ - **Order of work:** verify the identity in SES, confirm it shows verified, *then* run the SQL that switches `EmailTemplates.sendFromEmailAddress` / `IntegrationsEmail.fromEmailAddress`. Flipping the data first breaks every send from those templates.
34
+
35
+ ## Gotchas
36
+
37
+ - **The AWS verification email often lands in the customer's quarantine or spam.** Tell the mailbox owner to look there, and to release it within the 24h window. If it expires, re-send the verification.
38
+ - **A verified customer address is not proof it is used as a sender.** Compass USA vendor PO emails send from `compasssupport@togatech.com` (`Client_Compass.IntegrationsEmail`, 6 rows). `techhub@compass-usa.com` appears there only as To/CC.
39
+ - Apps that cannot run `App_Email::send()` (the tools app) still hit SES with the same rule. See [legacy email notifier](../../tools/features/legacy-email-notifier.md).
40
+
41
+ ## Change history
42
+ - 2026-10-07 — Documented the SES sender-identity rule and customer-address verification flow, after moving the Compass Canada TechHub sender to `Techhub.Canada@compass-canada.com` (bala)
@@ -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)_ — 32 doc(s) → [1.0/apps/library/INDEX.md](1.0/apps/library/INDEX.md)
7
+ - **library** (Library) _(framework core)_ — 33 doc(s) → [1.0/apps/library/INDEX.md](1.0/apps/library/INDEX.md)
8
8
  - **worker** (Worker) — 42 doc(s) → [1.0/apps/worker/INDEX.md](1.0/apps/worker/INDEX.md)
9
9
  - **dbchanges** (Database Changes) _(framework core)_ — 1 doc(s) → [1.0/apps/dbchanges/INDEX.md](1.0/apps/dbchanges/INDEX.md)
10
10
  - **worker1.5** (Worker 1.5) — 0 doc(s) → [1.0/apps/worker1.5/INDEX.md](1.0/apps/worker1.5/INDEX.md)
@@ -18,7 +18,7 @@ project: _Underscore
18
18
  client: compass-canada
19
19
  type: profile
20
20
  status: active
21
- updated: 2026-10-05
21
+ updated: 2026-10-07
22
22
  owners: [jcardinal, bala, tcox, apeterson, ajean, mhammontree, rgirish]
23
23
  files: []
24
24
  related:
@@ -43,6 +43,7 @@ related:
43
43
  - ../compass-usa/features/saml-sso.md
44
44
  - ../../2.0/apps/_underscore/features/item-fulfillment-stage-lifecycle-and-order-status.md
45
45
  - ../../2.0/apps/_underscore/features/surface-resolver.md
46
+ - ../../1.0/apps/library/features/email-ses-sender-identity.md
46
47
  ---
47
48
 
48
49
  ## Summary
@@ -81,6 +82,19 @@ to but distinct from Compass USA. Like Compass USA it spans the **2.0** commerce
81
82
  CXML). Prod `Vendors` 4 COMPASS CANADA and 5 AGILANT SOLUTIONS INC have no integration, and the 1.0
82
83
  constants for them (`'2'`, `'3'`) do not match prod. PO transmit cron quirks and the OneUptime monitor
83
84
  (cron 87): [PO-to-vendor monitor](features/oneuptime-po-transmissions-to-vendors-monitor.md).
85
+ - **TechHub sender address is `Techhub.Canada@compass-canada.com` (prod, 2026-10-07).** Was
86
+ `TechHubCanada@togatech.com`. Changed on 28 `EmailTemplates.sendFromEmailAddress` rows (EN+FR
87
+ order / approval / transit / delivered / reminder / auto-cancel) and `IntegrationsEmail` id 1
88
+ (integration 2, "Grand & Toy - Email") by
89
+ `dbchanges2/Client_CompassCanada/2026-10-07a - TechHubCanadaFromEmail.sql`. Kept on togatech.com
90
+ on purpose: Request Submitted (`compasssupport@`), Get Support (`donotreply@`), Forgot Password x2
91
+ (`noreply@`). It is a single verified SES identity, so any new sender needs SES verification
92
+ first: [SES sender identity](../../1.0/apps/library/features/email-ses-sender-identity.md).
93
+ The hardcoded TechHub CC in 4 worker crons had a typo (`TechHub@compass-canada.com`, missing
94
+ `.Canada`); now `Techhub.Canada@compass-canada.com` in `workflow/2_transmit_mits_purchase_orders_to_vendors.php`
95
+ (G&T PO email CC), `workflow_beta/2_…`, `compass_email_reminders.php` and
96
+ `compass_cancel_pending_approval_orders.php` (all under `worker/crons/toga2/compasscanada/`).
97
+ **Not yet deployed.**
84
98
  - **Grand & Toy (G&T)** — primary hardware vendor. SOs flow toga → MITS → PO to G&T; G&T sends
85
99
  back ASNs. ASN ingestion (email CSV + the auto-created ItemFulfillment chain + bilingual
86
100
  in-transit email) is documented in [Grand & Toy ASN Import](features/grand-and-toy-asn-import.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.967",
3
+ "version": "1.0.968",
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",