toga-ai 1.0.1206 → 1.0.1207

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.
@@ -50,6 +50,7 @@
50
50
  | [_Model::save() vs raw _Query — no atomic conditional update](features/model-save-vs-query-atomic-update.md) | `_Model::save()` can't do an atomic conditional update or a second write on the same instance; open before writing a row-claim/optimistic-concurrency guard, a r |
51
51
  | [NetSuite REST Client (_Component_Api_Netsuite) — record writes & SuiteQL](features/netsuite-rest-client.md) | Shared 2.0 `_underscore` NetSuite REST client (`_Component_Api_Netsuite`) — record GET/write, SuiteQL, auth, escaping, logging; open before any 2.0 NetSuite cal |
52
52
  | [NetSuite Sales Order sync — ship-to address, phone, and PO reference sourcing](features/netsuite-salesorder-address-phone-sync.md) | Where the shared NetSuite SO importer (`_Trait_Netsuite_SalesOrder`) sources SO#, PO#, and ship-to phone, and the traps in changing it; open before editing this |
53
+ | [Non-prod Aurora clusters (account 975050298201) — layout, settings, recovery, access limits](features/nonprod-aurora-clusters.md) | Which non-prod 2.0 Aurora MySQL clusters exist in account 975050298201 (us-east-1) after TRUE-83406, the settings every one copies, how to delete/restore a clus |
53
54
  | [Note records have NO author — every `*Notes` model's `contactId` is unwritten](features/note-record-authorship.md) | Every `*Notes` model declares a `contactId` FK but no code writes it — note authorship is unrecoverable from 2.0 data; open before building any note author disp |
54
55
  | [NOTIFICATION email templates — block JSON rendered server side (_Component_EmailBlocks + _Component_EmailBranding)](features/notification-email-blocks.md) | How client-built (NOTIFICATION) emails are stored as block JSON, rendered to safe HTML on the server, merged with `{{group.field}}` tokens and branded per clien |
55
56
  | [Notification engine (rule-driven in-app notifications from record change logs)](features/notification-engine.md) | Platform (all 2.0 apps) in-app notifications: data rules on Core turn a record's change log into Client.Notifications rows; open when adding a notification kind |
@@ -11,6 +11,7 @@ owners: ["rgirish"]
11
11
  files: []
12
12
  related:
13
13
  - ../architecture.md
14
+ - nonprod-aurora-clusters.md
14
15
  - ../../../../1.0/apps/worker1.5/features/database-backups.md
15
16
  ---
16
17
 
@@ -48,7 +49,7 @@ Live check on us-east-1 writers: `log_bin = ON`.
48
49
 
49
50
  ### Non-prod (account 975050298201, us-east-1)
50
51
 
51
- - 19 single-instance clusters (`sandbox-dev`, `sandbox-client`, `stage`, `demo`, `client-*`, `qa-*`, `qc-*`), engine `3.10.3`.
52
+ - Single-instance clusters, engine `3.10.3` — current list in [Non-prod Aurora clusters](nonprod-aurora-clusters.md).
52
53
  - All on `true-rds-cluster-parameters` with `binlog_format = OFF` (`log_bin = 0`). No Global Database.
53
54
 
54
55
  ### Who reads the binlog (2026-10-29: nobody)
@@ -0,0 +1,81 @@
1
+ ---
2
+ title: Non-prod Aurora clusters (account 975050298201) — layout, settings, recovery, access limits
3
+ framework: "2.0"
4
+ repo: _underscore
5
+ project: _Underscore
6
+ client: shared
7
+ type: feature
8
+ status: active
9
+ updated: 2026-10-29
10
+ owners: ["rgirish"]
11
+ files: []
12
+ related:
13
+ - ../architecture.md
14
+ - aurora-binlog-configuration.md
15
+ - ../../api2/workflows/environment-configuration-and-provisioning.md
16
+ - ../workflows/local-db-refresh-from-beta.md
17
+ ---
18
+
19
+ Which non-prod 2.0 Aurora MySQL clusters exist in account 975050298201 (us-east-1) after TRUE-83406, the settings every one copies, how to delete/restore a cluster safely, how to tell an empty cluster without DB access, and what the GoAgilant-Developers SSO role cannot do (KMS); open before creating, deleting or loading a non-prod DB cluster.
20
+
21
+ ## Summary
22
+
23
+ One **all-in-one** Aurora MySQL cluster per non-prod environment: `Core`, `Client_*`, `Logs`, `Logs_*`, `Archive_*` all in the same cluster. No environment shares a cluster. Production is separate: 4 per-family clusters in account `654654170868` (see [binlog doc](aurora-binlog-configuration.md)).
24
+
25
+ ## How it works
26
+
27
+ ### Clusters (as of 2026-10-29)
28
+
29
+ | Cluster | Databases |
30
+ |---|---|
31
+ | `sandbox-dev`, `sandbox-client` | full DB sets (unchanged) |
32
+ | `qa-alpha` | `Core`, `Logs`, `Client_True`, `Client_Elite`, `Logs_True`, `Logs_Elite`, `Archive_True` (restored from final snapshot) |
33
+ | `qc-security` | `Core`, `Logs`, `Client_Compass`, `Logs_Compass` (restored from final snapshot) |
34
+ | `dev`, `qa`, `stage`, `uat`, `hotfix`, `demo`, `sandbox` | **empty** — created 2026-10-29, no TOGA databases yet |
35
+
36
+ - The 7 new clusters match the environment list. AWS identifiers cannot start with `_`, so env `_qa` → cluster `qa`.
37
+ - Endpoint: `<name>.cluster-cb860gg2qw2n.us-east-1.rds.amazonaws.com`.
38
+ - Loading `Core` / `Client_*` / `Logs` into the new clusters is a follow-up ticket. Seed them per [environment provisioning](../../api2/workflows/environment-configuration-and-provisioning.md) (base `Logs` included).
39
+ - Prod data into non-prod: only `stage` and `demo`, masked (ticket rule A17). Prod is 4 clusters, so it is dump + load per database, not a snapshot copy.
40
+
41
+ ### Settings every non-prod cluster copies (from `sandbox-dev`)
42
+
43
+ - Engine `aurora-mysql` `8.0.mysql_aurora.3.10.3`.
44
+ - One writer `<name>-writer`, `db.t4g.medium`, `us-east-1a`.
45
+ - Subnet group `true-test-db-subnet-group`; security group `sg-075195ac9152313d3`.
46
+ - Cluster parameter group `true-rds-cluster-parameters`; instance parameter group `true-rds-parameters`.
47
+ - Encrypted with the account's RDS KMS key; not public; backup retention 1 day.
48
+ - Enhanced monitoring 60 s via `rds-monitoring-role`.
49
+ - Master user `admin`, plain `--master-user-password` (not Secrets Manager — see Gotchas).
50
+ - Tags `Environment=<name>`, `Ticket=<ticket>`.
51
+
52
+ ### Admin passwords — where they live (never copy values here)
53
+
54
+ - `dev`, `sandbox`: same as `api2/Config/sandbox-dev.ini` `[database]`.
55
+ - `qa`, `stage`, `uat`, `hotfix`, `demo`: same as `api2/Config/stage.ini` `[database]`.
56
+ - Developer plans to rotate them; after that, the ini files are the source.
57
+
58
+ ### Delete and restore a cluster
59
+
60
+ 1. Always delete with `--final-db-snapshot-identifier final-<name>-<date>`.
61
+ 2. To bring it back: `restore-db-cluster-from-snapshot` with the same cluster id → same endpoint, data, and admin password.
62
+ 3. Restore creates **no instance**. Run `create-db-instance` for a new writer (`<name>-writer`) or the cluster cannot serve.
63
+
64
+ ### Is a cluster empty? (no DB access needed)
65
+
66
+ - CloudWatch `AWS/RDS` `VolumeBytesUsed` ~140 MB = MySQL system files only, no TOGA databases.
67
+ - toga-db MCP `list_schemas` returns `[]` for clusters it cannot see, so an empty list alone is not proof.
68
+
69
+ ## Gotchas
70
+
71
+ - **No KMS rights for `GoAgilant-Developers`** in 975050298201 (`kms:DescribeKey` denied):
72
+ - `create-db-cluster --manage-master-user-password` fails `KMSKeyNotAccessibleFault ... KMS key [null]` (the Secrets Manager key). Use `--master-user-password` with the RDS key — that works.
73
+ - Restoring encrypted snapshots in the same account works.
74
+ - Copying prod snapshots across accounts needs KMS rights the role does not have.
75
+ - **us-west-1 RDS** is blocked for this role by an org SCP.
76
+ - **`api2/Config/stage.ini` is CRLF.** A script reading values from it must strip `\r`, or AWS rejects the password with "Input can't contain control characters".
77
+ - **RDS console "Databases" count** lists each cluster AND its writer instance as rows (19 clusters showed as "38").
78
+ - **Leftovers from the 2026-10-29 cleanup:** 15 deleted clusters (`qa-task`, `qa-hotfix`, `qa-beta`, `qa-gamma`, `qc-task`, `qc-hotfix`, `qc-alpha`, `qc-beta`, `qc-gamma`, `qc-performance`, `client-alpha`, `client-beta`, `client-gamma`, old `stage`, old `demo`) keep final snapshots `final-<name>-2026-10-29` (storage cost; cleanup is a separate task). Their Elastic Beanstalk envs (`api-*`, `worker-*`, `websocket-*`) still exist and point at missing databases — separate ticket.
79
+
80
+ ## Change history
81
+ - 2026-10-29 — First version: 7 new empty env clusters, 15 old clusters deleted, qa-alpha/qc-security restored, KMS limits, recovery steps (TRUE-83406) (rgirish)
@@ -22,7 +22,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
22
22
 
23
23
  ## 2.0 framework
24
24
 
25
- - **_underscore** (_Underscore) _(framework core)_ — 118 doc(s) → [2.0/apps/_underscore/INDEX.md](2.0/apps/_underscore/INDEX.md)
25
+ - **_underscore** (_Underscore) _(framework core)_ — 119 doc(s) → [2.0/apps/_underscore/INDEX.md](2.0/apps/_underscore/INDEX.md)
26
26
  - **worker2** (Worker) — 102 doc(s) → [2.0/apps/worker2/INDEX.md](2.0/apps/worker2/INDEX.md)
27
27
  - **api2** (API) — 29 doc(s) → [2.0/apps/api2/INDEX.md](2.0/apps/api2/INDEX.md)
28
28
  - **dbchanges2** (Database Changes) _(framework core)_ — 24 doc(s) → [2.0/apps/dbchanges2/INDEX.md](2.0/apps/dbchanges2/INDEX.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.1206",
3
+ "version": "1.0.1207",
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",