toga-ai 1.0.830 → 1.0.832

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.
Files changed (587) hide show
  1. package/knowledge/1.0/apps/dbchanges/INDEX.md +1 -1
  2. package/knowledge/1.0/apps/dbchanges/workflows/authoring-and-shipping-sql-files.md +114 -43
  3. package/knowledge/1.0/apps/library/INDEX.md +22 -23
  4. package/knowledge/1.0/apps/library/architecture.md +52 -25
  5. package/knowledge/1.0/apps/library/features/address-validation-gateway.md +53 -19
  6. package/knowledge/1.0/apps/library/features/app-class-placement-base-contracts.md +33 -19
  7. package/knowledge/1.0/apps/library/features/app-sso-initiation.md +75 -38
  8. package/knowledge/1.0/apps/library/features/cron-execution-monitoring.md +90 -24
  9. package/knowledge/1.0/apps/library/features/diagnostic-dialog-view-recommended-services.md +67 -33
  10. package/knowledge/1.0/apps/library/features/elite-freshservice-sync.md +71 -43
  11. package/knowledge/1.0/apps/library/features/email-queue-attachments.md +84 -34
  12. package/knowledge/1.0/apps/library/features/email-templates.md +84 -35
  13. package/knowledge/1.0/apps/library/features/email-test-mode-and-write-free-sends.md +98 -37
  14. package/knowledge/1.0/apps/library/features/error-capture-1-0.md +271 -57
  15. package/knowledge/1.0/apps/library/features/http-500-error-monitor.md +117 -33
  16. package/knowledge/1.0/apps/library/features/mvc-page-pattern-and-app-skeleton.md +42 -21
  17. package/knowledge/1.0/apps/library/features/netsuite-filecabinet-restlet.md +87 -29
  18. package/knowledge/1.0/apps/library/features/netsuite-item-assettype-sync.md +142 -58
  19. package/knowledge/1.0/apps/library/features/netsuite-item-class-sync.md +97 -32
  20. package/knowledge/1.0/apps/library/features/netsuite-item-isfulfillable-sync.md +147 -39
  21. package/knowledge/1.0/apps/library/features/netsuite-suiteql-api-reference.md +381 -116
  22. package/knowledge/1.0/apps/library/features/netsuite-suiteql-rest-shim.md +451 -71
  23. package/knowledge/1.0/apps/library/features/netsuite-sync-alert-monitor.md +104 -25
  24. package/knowledge/1.0/apps/library/features/startech-pcmaticb2b-sync.md +56 -24
  25. package/knowledge/1.0/apps/library/features/toga2-api-client-and-bridge.md +489 -97
  26. package/knowledge/1.0/apps/store/INDEX.md +2 -2
  27. package/knowledge/1.0/apps/store/architecture.md +33 -13
  28. package/knowledge/1.0/apps/store/features/saml-sso-certificate-and-keys.md +116 -31
  29. package/knowledge/1.0/apps/test/INDEX.md +16 -16
  30. package/knowledge/1.0/apps/test/architecture.md +38 -15
  31. package/knowledge/1.0/apps/test/features/2-0-deployment-client-sql.md +17 -11
  32. package/knowledge/1.0/apps/test/features/active-directory-auth-test.md +12 -8
  33. package/knowledge/1.0/apps/test/features/compass-retrofix2-sql-generator.md +63 -39
  34. package/knowledge/1.0/apps/test/features/create-elastic-beanstalk.md +49 -22
  35. package/knowledge/1.0/apps/test/features/dev-generators.md +17 -12
  36. package/knowledge/1.0/apps/test/features/forecast-netsuite-discrepancy-analysis.md +20 -11
  37. package/knowledge/1.0/apps/test/features/github-audit-script.md +31 -13
  38. package/knowledge/1.0/apps/test/features/goagilant-to-togatech-email-migration.md +63 -28
  39. package/knowledge/1.0/apps/test/features/static-no-db-regression-harness.md +99 -44
  40. package/knowledge/1.0/apps/test/features/tableview-builder.md +17 -10
  41. package/knowledge/1.0/apps/test/features/talos-kb-pipeline.md +84 -38
  42. package/knowledge/1.0/apps/test/features/toga2-client-onboarding-sql.md +43 -17
  43. package/knowledge/1.0/apps/test/features/toga2-onboarding-wizard.md +66 -29
  44. package/knowledge/1.0/apps/test/features/toga2-user-cross-client-access-sql.md +16 -11
  45. package/knowledge/1.0/apps/test/features/url-domain-markdown-document.md +16 -10
  46. package/knowledge/1.0/apps/toga/INDEX.md +2 -2
  47. package/knowledge/1.0/apps/toga/features/bundleconfirmation-cart-preservation.md +23 -11
  48. package/knowledge/1.0/apps/toga/features/odp-customer-search-loyalty-persistence.md +57 -19
  49. package/knowledge/1.0/apps/togadesk/INDEX.md +12 -12
  50. package/knowledge/1.0/apps/togadesk/architecture.md +121 -44
  51. package/knowledge/1.0/apps/togadesk/features/email-to-ticket-intake.md +123 -42
  52. package/knowledge/1.0/apps/togadesk/features/field-service-dispatch.md +127 -37
  53. package/knowledge/1.0/apps/togadesk/features/managed-service-order-create.md +128 -37
  54. package/knowledge/1.0/apps/togadesk/features/notifications.md +63 -18
  55. package/knowledge/1.0/apps/togadesk/features/per-client-host-restriction.md +107 -26
  56. package/knowledge/1.0/apps/togadesk/features/rest-api.md +42 -27
  57. package/knowledge/1.0/apps/togadesk/features/smb-contract-editing.md +39 -23
  58. package/knowledge/1.0/apps/togadesk/features/staff-login-authentication.md +58 -22
  59. package/knowledge/1.0/apps/togadesk/features/ticket-lifecycle.md +120 -38
  60. package/knowledge/1.0/apps/togadesk/workflows/production-revert-forward.md +35 -21
  61. package/knowledge/1.0/apps/togadesk/workflows/standalone-test-scripts.md +42 -15
  62. package/knowledge/1.0/apps/togaview/INDEX.md +7 -7
  63. package/knowledge/1.0/apps/togaview/architecture.md +127 -45
  64. package/knowledge/1.0/apps/togaview/features/login-flows.md +142 -42
  65. package/knowledge/1.0/apps/togaview/features/msp-dashboard.md +37 -16
  66. package/knowledge/1.0/apps/togaview/features/retail-commerce-lifecycle.md +43 -25
  67. package/knowledge/1.0/apps/togaview/features/ticket-detail-page.md +134 -38
  68. package/knowledge/1.0/apps/togaview/workflows/git-and-php-tooling-under-the-underscore-app-root.md +26 -15
  69. package/knowledge/1.0/apps/togaview/workflows/route53-cross-account-zone-migration.md +42 -16
  70. package/knowledge/1.0/apps/tools/INDEX.md +17 -17
  71. package/knowledge/1.0/apps/tools/architecture.md +180 -28
  72. package/knowledge/1.0/apps/tools/features/clickup-label-aliases-admin.md +78 -35
  73. package/knowledge/1.0/apps/tools/features/clickup-sprint-dashboard.md +209 -49
  74. package/knowledge/1.0/apps/tools/features/cloudfront-client-setup.md +125 -36
  75. package/knowledge/1.0/apps/tools/features/compass-user-persona-admin.md +37 -0
  76. package/knowledge/1.0/apps/tools/features/design-demo-admin.md +150 -45
  77. package/knowledge/1.0/apps/tools/features/developer-tools.md +28 -15
  78. package/knowledge/1.0/apps/tools/features/errors-curation-console.md +345 -85
  79. package/knowledge/1.0/apps/tools/features/github-audit.md +124 -35
  80. package/knowledge/1.0/apps/tools/features/legacy-email-notifier.md +80 -26
  81. package/knowledge/1.0/apps/tools/features/mvc-data-access-patterns.md +151 -62
  82. package/knowledge/1.0/apps/tools/features/oneuptime-monitor-status-panel.md +243 -52
  83. package/knowledge/1.0/apps/tools/features/persona-gated-navigation.md +45 -21
  84. package/knowledge/1.0/apps/tools/features/saml-sso-auth.md +156 -50
  85. package/knowledge/1.0/apps/tools/features/talos-kb-documents-admin.md +422 -82
  86. package/knowledge/1.0/apps/tools/features/talos-pricing-ui.md +77 -30
  87. package/knowledge/1.0/apps/tools/features/theme-light-dark.md +130 -44
  88. package/knowledge/1.0/apps/tools/workflows/deploy-to-elastic-beanstalk-al2023.md +233 -55
  89. package/knowledge/1.0/apps/walmarttechservices/INDEX.md +1 -1
  90. package/knowledge/1.0/apps/walmarttechservices/architecture.md +81 -32
  91. package/knowledge/1.0/apps/webhook/INDEX.md +1 -1
  92. package/knowledge/1.0/apps/webhook/features/netsuite-clickup-opportunity-sync.md +174 -51
  93. package/knowledge/1.0/apps/worker/INDEX.md +19 -19
  94. package/knowledge/1.0/apps/worker/architecture.md +166 -64
  95. package/knowledge/1.0/apps/worker/features/canon-received-po-netsuite-order-sync.md +12 -10
  96. package/knowledge/1.0/apps/worker/features/compass-ma-sales-order-exception-report.md +27 -10
  97. package/knowledge/1.0/apps/worker/features/compass-manager-approval-reminder-emails.md +11 -11
  98. package/knowledge/1.0/apps/worker/features/compass-partial-in-transit-delivered-emails.md +72 -9
  99. package/knowledge/1.0/apps/worker/features/elite-togadesk-attachment-sync.md +9 -16
  100. package/knowledge/1.0/apps/worker/features/forecast2-netsuite-reconciliation.md +212 -10
  101. package/knowledge/1.0/apps/worker/features/forecast2-supporting-records-import.md +24 -13
  102. package/knowledge/1.0/apps/worker/features/netsuite-sales-order-sales-rep-sourcing.md +9 -8
  103. package/knowledge/1.0/apps/worker/features/netsuite-togasupply-per-client-sync.md +489 -88
  104. package/knowledge/1.0/apps/worker/features/oneuptime-server-monitor-host-hygiene.md +15 -12
  105. package/knowledge/1.0/apps/worker/features/oneuptime-worker-uptime-monitoring.md +16 -14
  106. package/knowledge/1.0/apps/worker/features/send-shipments-for-the-day.md +7 -11
  107. package/knowledge/1.0/apps/worker/features/staples-cxml-order-import.md +11 -11
  108. package/knowledge/1.0/apps/worker/workflows/diagnosing-frozen-cron-checkins.md +70 -23
  109. package/knowledge/1.0/apps/worker/workflows/isfulfillable-multi-client-backfill.md +82 -26
  110. package/knowledge/1.0/apps/worker/workflows/netsuite-duplicate-items-dedup.md +111 -28
  111. package/knowledge/1.0/apps/worker/workflows/onboarding-client-to-netsuite-togasupply-sync.md +173 -41
  112. package/knowledge/1.0/apps/worker/workflows/tracing-a-worker-cron-run-in-production.md +184 -63
  113. package/knowledge/1.0/standards/backend-php.md +343 -181
  114. package/knowledge/1.0/standards/framework-rules.md +52 -25
  115. package/knowledge/1.0/standards/frontend.md +92 -30
  116. package/knowledge/2.0/apps/_underscore/INDEX.md +61 -62
  117. package/knowledge/2.0/apps/_underscore/architecture/surface-authoring-proposal.md +1 -3
  118. package/knowledge/2.0/apps/_underscore/architecture.md +14 -4
  119. package/knowledge/2.0/apps/_underscore/features/acl-permission-chain.md +285 -78
  120. package/knowledge/2.0/apps/_underscore/features/address-uniqueness-normalization.md +67 -34
  121. package/knowledge/2.0/apps/_underscore/features/address-validation.md +130 -55
  122. package/knowledge/2.0/apps/_underscore/features/apirequest-json-content-type.md +47 -9
  123. package/knowledge/2.0/apps/_underscore/features/assortment-name-translation.md +63 -19
  124. package/knowledge/2.0/apps/_underscore/features/async-query-execution.md +86 -37
  125. package/knowledge/2.0/apps/_underscore/features/autoincrement-record-numbering.md +72 -22
  126. package/knowledge/2.0/apps/_underscore/features/calculated-column-filter-options.md +11 -11
  127. package/knowledge/2.0/apps/_underscore/features/calculated-sql-fields.md +90 -20
  128. package/knowledge/2.0/apps/_underscore/features/carrier-shipping-labels.md +86 -22
  129. package/knowledge/2.0/apps/_underscore/features/cli-script-bootstrap.md +13 -5
  130. package/knowledge/2.0/apps/_underscore/features/cloud-s3-helpers.md +60 -21
  131. package/knowledge/2.0/apps/_underscore/features/cloud-secrets-manager.md +43 -19
  132. package/knowledge/2.0/apps/_underscore/features/component-model-namespace-registration.md +37 -14
  133. package/knowledge/2.0/apps/_underscore/features/config-group-access.md +30 -16
  134. package/knowledge/2.0/apps/_underscore/features/core-domains-app-host-registry.md +19 -16
  135. package/knowledge/2.0/apps/_underscore/features/database-alias-repointing.md +33 -13
  136. package/knowledge/2.0/apps/_underscore/features/effective-persona-resolution.md +9 -9
  137. package/knowledge/2.0/apps/_underscore/features/email-send-pipeline.md +69 -15
  138. package/knowledge/2.0/apps/_underscore/features/email-template-sending.md +102 -28
  139. package/knowledge/2.0/apps/_underscore/features/error-reporting-issue-event.md +317 -117
  140. package/knowledge/2.0/apps/_underscore/features/event-publish-sqs.md +8 -7
  141. package/knowledge/2.0/apps/_underscore/features/field-storage-row-hydration.md +14 -13
  142. package/knowledge/2.0/apps/_underscore/features/forecast-sale-import.md +198 -31
  143. package/knowledge/2.0/apps/_underscore/features/fulfillable-item-propagation.md +35 -14
  144. package/knowledge/2.0/apps/_underscore/features/item-classification-itemclasses.md +24 -18
  145. package/knowledge/2.0/apps/_underscore/features/item-fulfillment-stage-lifecycle-and-order-status.md +42 -14
  146. package/knowledge/2.0/apps/_underscore/features/model-interceptor-unit-testing.md +24 -13
  147. package/knowledge/2.0/apps/_underscore/features/model-magic-field-access.md +38 -12
  148. package/knowledge/2.0/apps/_underscore/features/model-save-parent-cascade-stored-field-deadlock.md +84 -36
  149. package/knowledge/2.0/apps/_underscore/features/model-save-vs-query-atomic-update.md +77 -28
  150. package/knowledge/2.0/apps/_underscore/features/netsuite-rest-client.md +307 -78
  151. package/knowledge/2.0/apps/_underscore/features/netsuite-salesorder-address-phone-sync.md +88 -38
  152. package/knowledge/2.0/apps/_underscore/features/note-record-authorship.md +51 -22
  153. package/knowledge/2.0/apps/_underscore/features/outbound-api-rate-budget.md +138 -40
  154. package/knowledge/2.0/apps/_underscore/features/page-meta-context-field-settings.md +186 -35
  155. package/knowledge/2.0/apps/_underscore/features/per-client-database-connections.md +238 -39
  156. package/knowledge/2.0/apps/_underscore/features/persona-name-translation.md +142 -44
  157. package/knowledge/2.0/apps/_underscore/features/record-change-audit-log.md +147 -42
  158. package/knowledge/2.0/apps/_underscore/features/recursive-item-fulfillments.md +163 -38
  159. package/knowledge/2.0/apps/_underscore/features/sales-order-denial-reason.md +299 -81
  160. package/knowledge/2.0/apps/_underscore/features/sales-order-po-number-sourcing.md +86 -25
  161. package/knowledge/2.0/apps/_underscore/features/sales-order-purchase-order-bridge-direction.md +91 -28
  162. package/knowledge/2.0/apps/_underscore/features/sales-order-status-filter-surface.md +82 -40
  163. package/knowledge/2.0/apps/_underscore/features/shipping-carriers-and-accounts.md +98 -37
  164. package/knowledge/2.0/apps/_underscore/features/string-html-entity-helpers.md +59 -23
  165. package/knowledge/2.0/apps/_underscore/features/surface-field-recordfield-binding.md +150 -54
  166. package/knowledge/2.0/apps/_underscore/features/surface-resolver.md +851 -209
  167. package/knowledge/2.0/apps/_underscore/features/tableview-hyperlink-columns.md +85 -50
  168. package/knowledge/2.0/apps/_underscore/features/tableview-joins.md +324 -118
  169. package/knowledge/2.0/apps/_underscore/features/togaiq-gateway-client.md +105 -45
  170. package/knowledge/2.0/apps/_underscore/features/tracking-number-bridges.md +249 -45
  171. package/knowledge/2.0/apps/_underscore/features/units-for-items-for-purchase-orders.md +156 -48
  172. package/knowledge/2.0/apps/_underscore/features/user-email-as-identity-and-password-reset.md +56 -26
  173. package/knowledge/2.0/apps/_underscore/features/usps-dpv-deliverability.md +53 -29
  174. package/knowledge/2.0/apps/_underscore/workflows/local-db-refresh-from-beta.md +99 -23
  175. package/knowledge/2.0/apps/_underscore/workflows/recreated-shared-branch-stale-local-remerge.md +91 -38
  176. package/knowledge/2.0/apps/_underscore/workflows/rotating-public-tls-certificates.md +151 -44
  177. package/knowledge/2.0/apps/_underscore/workflows/running-a-2.0-app-locally.md +102 -28
  178. package/knowledge/2.0/apps/ai-bdr/INDEX.md +13 -13
  179. package/knowledge/2.0/apps/ai-bdr/architecture.md +100 -31
  180. package/knowledge/2.0/apps/ai-bdr/features/bdr-web-funnel-plan.md +460 -128
  181. package/knowledge/2.0/apps/ai-bdr/features/call-orchestration.md +121 -55
  182. package/knowledge/2.0/apps/ai-bdr/features/campaign-chat-handoff.md +169 -68
  183. package/knowledge/2.0/apps/ai-bdr/features/landing-call-flow.md +188 -75
  184. package/knowledge/2.0/apps/ai-bdr/features/landing-chat-drawer.md +249 -78
  185. package/knowledge/2.0/apps/ai-bdr/features/live-call-status.md +104 -46
  186. package/knowledge/2.0/apps/ai-bdr/features/security-landing-page.md +266 -82
  187. package/knowledge/2.0/apps/ai-bdr/features/vapi-integration.md +108 -42
  188. package/knowledge/2.0/apps/ai-bdr/features/web-funnel-app.md +879 -213
  189. package/knowledge/2.0/apps/ai-bdr/features/web-funnel-content-model.md +194 -63
  190. package/knowledge/2.0/apps/ai-bdr/workflows/new-campaign-onboarding.md +88 -51
  191. package/knowledge/2.0/apps/ai-bdr/workflows/safe-call-loop-testing.md +187 -60
  192. package/knowledge/2.0/apps/api2/INDEX.md +26 -26
  193. package/knowledge/2.0/apps/api2/architecture.md +461 -91
  194. package/knowledge/2.0/apps/api2/features/api-key-authentication-and-scoping.md +77 -32
  195. package/knowledge/2.0/apps/api2/features/api-payload-interceptors.md +652 -166
  196. package/knowledge/2.0/apps/api2/features/cross-client-data-retrieval.md +282 -63
  197. package/knowledge/2.0/apps/api2/features/cxml-shipnotice-gateway.md +151 -57
  198. package/knowledge/2.0/apps/api2/features/encrypted-user-uuid-auth-handoff.md +45 -22
  199. package/knowledge/2.0/apps/api2/features/environment-variable-drives-underscore-branch.md +339 -57
  200. package/knowledge/2.0/apps/api2/features/health-check-endpoint.md +64 -27
  201. package/knowledge/2.0/apps/api2/features/language-translation-layer.md +283 -57
  202. package/knowledge/2.0/apps/api2/features/login-cross-client-user-resolution.md +59 -18
  203. package/knowledge/2.0/apps/api2/features/nested-fk-acl-embedding.md +84 -24
  204. package/knowledge/2.0/apps/api2/features/nested-relationship-writes.md +474 -86
  205. package/knowledge/2.0/apps/api2/features/record-scripts.md +344 -58
  206. package/knowledge/2.0/apps/api2/features/request-logging.md +436 -119
  207. package/knowledge/2.0/apps/api2/features/scripted-api-post-body-args.md +59 -30
  208. package/knowledge/2.0/apps/api2/features/sprint-dashboard-api.md +93 -30
  209. package/knowledge/2.0/apps/api2/features/surface-meta-option.md +91 -19
  210. package/knowledge/2.0/apps/api2/features/tableview-apiwhereclause-row-filtering.md +104 -32
  211. package/knowledge/2.0/apps/api2/features/tableview-field-metadata.md +274 -59
  212. package/knowledge/2.0/apps/api2/features/tickets-api.md +47 -21
  213. package/knowledge/2.0/apps/api2/features/v2-api-error-codes.md +353 -79
  214. package/knowledge/2.0/apps/api2/features/v2-deadlock-retry.md +188 -50
  215. package/knowledge/2.0/apps/api2/features/v2-rest-query-contract.md +542 -102
  216. package/knowledge/2.0/apps/api2/features/v2-reverse-hasmany-fields-whitelist.md +51 -15
  217. package/knowledge/2.0/apps/api2/workflows/codepipeline-codeconnections-deploy.md +294 -65
  218. package/knowledge/2.0/apps/api2/workflows/environment-configuration-and-provisioning.md +123 -40
  219. package/knowledge/2.0/apps/dbchanges2/INDEX.md +11 -11
  220. package/knowledge/2.0/apps/dbchanges2/architecture.md +402 -104
  221. package/knowledge/2.0/apps/dbchanges2/features/rerunnable-additive-inserts.md +280 -64
  222. package/knowledge/2.0/apps/dbchanges2/features/surface-layer-schema.md +1543 -401
  223. package/knowledge/2.0/apps/dbchanges2/workflows/client-onboarding.md +80 -31
  224. package/knowledge/2.0/apps/dbchanges2/workflows/client-schema-drift-audit.md +265 -92
  225. package/knowledge/2.0/apps/dbchanges2/workflows/deleting-contacts-from-a-client-database.md +50 -23
  226. package/knowledge/2.0/apps/dbchanges2/workflows/framework-branch-ahead-of-schema.md +177 -67
  227. package/knowledge/2.0/apps/dbchanges2/workflows/local-vs-prod-mysql-config-parity.md +76 -31
  228. package/knowledge/2.0/apps/dbchanges2/workflows/nonprod-metadata-drift-repair.md +316 -99
  229. package/knowledge/2.0/apps/dbchanges2/workflows/targeting-the-right-database.md +155 -45
  230. package/knowledge/2.0/apps/dbchanges2/workflows/verifying-a-migration-ran.md +33 -16
  231. package/knowledge/2.0/apps/saml/INDEX.md +6 -6
  232. package/knowledge/2.0/apps/saml/architecture.md +42 -22
  233. package/knowledge/2.0/apps/saml/features/downstream-integration-contract.md +33 -19
  234. package/knowledge/2.0/apps/saml/features/healthcheck-endpoint.md +97 -31
  235. package/knowledge/2.0/apps/saml/features/rate-user-provisioning.md +9 -10
  236. package/knowledge/2.0/apps/saml/workflows/onboarding-a-new-sso-client.md +63 -23
  237. package/knowledge/2.0/apps/saml/workflows/rotating-the-saml-sp-certificate.md +193 -72
  238. package/knowledge/2.0/apps/talos/INDEX.md +8 -8
  239. package/knowledge/2.0/apps/talos/architecture.md +129 -48
  240. package/knowledge/2.0/apps/talos/features/aegra-api.md +153 -66
  241. package/knowledge/2.0/apps/talos/features/chat-frontend.md +96 -39
  242. package/knowledge/2.0/apps/talos/features/deployment.md +53 -29
  243. package/knowledge/2.0/apps/talos/features/mcp-servers.md +75 -39
  244. package/knowledge/2.0/apps/talos/features/observability.md +62 -34
  245. package/knowledge/2.0/apps/talos/features/pricing-cogs-model.md +143 -66
  246. package/knowledge/2.0/apps/talos/features/talos-agent.md +95 -56
  247. package/knowledge/2.0/apps/talos-backend/INDEX.md +1 -1
  248. package/knowledge/2.0/apps/talos-backend/workflows/toga-supply-client-onboarding.md +149 -59
  249. package/knowledge/2.0/apps/toga-blox/INDEX.md +14 -14
  250. package/knowledge/2.0/apps/toga-blox/architecture.md +56 -25
  251. package/knowledge/2.0/apps/toga-blox/features/add-notes-template.md +40 -20
  252. package/knowledge/2.0/apps/toga-blox/features/advanced-select.md +49 -23
  253. package/knowledge/2.0/apps/toga-blox/features/api-client.md +143 -36
  254. package/knowledge/2.0/apps/toga-blox/features/base-input.md +35 -20
  255. package/knowledge/2.0/apps/toga-blox/features/blox-authoring-defects.md +178 -61
  256. package/knowledge/2.0/apps/toga-blox/features/primary-table-templates.md +179 -59
  257. package/knowledge/2.0/apps/toga-blox/features/table-record-modal.md +58 -32
  258. package/knowledge/2.0/apps/toga-blox/features/table.md +215 -50
  259. package/knowledge/2.0/apps/toga-blox/features/talos-assistant.md +303 -74
  260. package/knowledge/2.0/apps/toga-blox/features/toaster.md +56 -20
  261. package/knowledge/2.0/apps/toga-blox/workflows/dynamic-publish-pipeline.md +272 -49
  262. package/knowledge/2.0/apps/toga-blox/workflows/landing-a-large-feature-branch.md +60 -21
  263. package/knowledge/2.0/apps/toga-blox/workflows/local-link-into-a-consumer-app.md +254 -65
  264. package/knowledge/2.0/apps/toga2-commerce/INDEX.md +19 -18
  265. package/knowledge/2.0/apps/toga2-commerce/architecture.md +98 -32
  266. package/knowledge/2.0/apps/toga2-commerce/features/bundle-item-visibility-and-selectability.md +128 -51
  267. package/knowledge/2.0/apps/toga2-commerce/features/cart-bundle-submission-and-identity.md +61 -23
  268. package/knowledge/2.0/apps/toga2-commerce/features/cart-notification-emails.md +142 -55
  269. package/knowledge/2.0/apps/toga2-commerce/features/cart-order-total-computation.md +30 -17
  270. package/knowledge/2.0/apps/toga2-commerce/features/cart-page-config-architecture.md +221 -81
  271. package/knowledge/2.0/apps/toga2-commerce/features/catalog-cache-freshness.md +168 -53
  272. package/knowledge/2.0/apps/toga2-commerce/features/category-tile-sort-order.md +78 -27
  273. package/knowledge/2.0/apps/toga2-commerce/features/client-fields.md +393 -120
  274. package/knowledge/2.0/apps/toga2-commerce/features/expedited-shipping-gating.md +110 -29
  275. package/knowledge/2.0/apps/toga2-commerce/features/filter-search-results-page.md +80 -27
  276. package/knowledge/2.0/apps/toga2-commerce/features/inactive-item-purchase-gating.md +135 -46
  277. package/knowledge/2.0/apps/toga2-commerce/features/multi-tenant-theming.md +62 -36
  278. package/knowledge/2.0/apps/toga2-commerce/features/order-submit-sync-sequencing.md +102 -38
  279. package/knowledge/2.0/apps/toga2-commerce/features/shipping-cost-waiver-gating.md +64 -28
  280. package/knowledge/2.0/apps/toga2-commerce/features/storefront-persona-gating-and-home-counts.md +118 -0
  281. package/knowledge/2.0/apps/toga2-commerce/workflows/amplify-build-and-deploy.md +188 -52
  282. package/knowledge/2.0/apps/toga2-commerce/workflows/cypress-testing.md +144 -62
  283. package/knowledge/2.0/apps/toga2-commerce/workflows/http2-protocol-error-diagnosis.md +53 -36
  284. package/knowledge/2.0/apps/toga2-hub/INDEX.md +2 -2
  285. package/knowledge/2.0/apps/toga2-hub/architecture.md +85 -36
  286. package/knowledge/2.0/apps/toga2-hub/features/acl-permissions-rendering.md +85 -51
  287. package/knowledge/2.0/apps/toga2-supply/INDEX.md +8 -8
  288. package/knowledge/2.0/apps/toga2-supply/architecture.md +36 -20
  289. package/knowledge/2.0/apps/toga2-supply/features/currency-amount-lines-editor.md +156 -63
  290. package/knowledge/2.0/apps/toga2-supply/features/fulfill-and-ship.md +942 -203
  291. package/knowledge/2.0/apps/toga2-supply/features/order-detail-field-config-and-customer-name.md +99 -38
  292. package/knowledge/2.0/apps/toga2-supply/features/table-data-additional-filters.md +54 -22
  293. package/knowledge/2.0/apps/toga2-supply/workflows/amplify-build-and-deploy.md +89 -29
  294. package/knowledge/2.0/apps/toga2-supply/workflows/client-host-scoping.md +215 -79
  295. package/knowledge/2.0/apps/toga2-supply/workflows/onboarding-a-client-to-fulfill-and-ship.md +37 -29
  296. package/knowledge/2.0/apps/toga2-view/INDEX.md +9 -9
  297. package/knowledge/2.0/apps/toga2-view/architecture.md +98 -33
  298. package/knowledge/2.0/apps/toga2-view/features/get-support-cancel-subscription.md +132 -42
  299. package/knowledge/2.0/apps/toga2-view/features/mobile-nav-header.md +14 -15
  300. package/knowledge/2.0/apps/toga2-view/features/property-questions-eligibility.md +39 -15
  301. package/knowledge/2.0/apps/toga2-view/features/query-string-builder.md +39 -19
  302. package/knowledge/2.0/apps/toga2-view/features/reference-dropdown-sorting.md +32 -16
  303. package/knowledge/2.0/apps/toga2-view/features/service-card.md +24 -21
  304. package/knowledge/2.0/apps/toga2-view/features/terms-and-conditions-page.md +56 -18
  305. package/knowledge/2.0/apps/toga2-view/features/zip-validation-contact-phone.md +23 -11
  306. package/knowledge/2.0/apps/toga25-supply/INDEX.md +19 -19
  307. package/knowledge/2.0/apps/toga25-supply/architecture.md +103 -34
  308. package/knowledge/2.0/apps/toga25-supply/features/action-button-rule-engine.md +119 -30
  309. package/knowledge/2.0/apps/toga25-supply/features/client-api-fetch-fields.md +87 -25
  310. package/knowledge/2.0/apps/toga25-supply/features/client-configurable-fields.md +162 -37
  311. package/knowledge/2.0/apps/toga25-supply/features/column-visibility.md +177 -57
  312. package/knowledge/2.0/apps/toga25-supply/features/force-logout-on-deployment.md +47 -10
  313. package/knowledge/2.0/apps/toga25-supply/features/meta-driven-table-data.md +119 -39
  314. package/knowledge/2.0/apps/toga25-supply/features/persisted-query-cache.md +94 -34
  315. package/knowledge/2.0/apps/toga25-supply/features/record-modals-and-nested-tables.md +365 -85
  316. package/knowledge/2.0/apps/toga25-supply/features/server-table-url-state.md +83 -30
  317. package/knowledge/2.0/apps/toga25-supply/features/side-navigation-and-default-route.md +64 -20
  318. package/knowledge/2.0/apps/toga25-supply/features/sso-redirect-and-session-gating.md +71 -16
  319. package/knowledge/2.0/apps/toga25-supply/features/surface-frontend.md +1383 -323
  320. package/knowledge/2.0/apps/toga25-supply/features/talos-integration.md +272 -67
  321. package/knowledge/2.0/apps/toga25-supply/features/toolbar-button-chrome.md +59 -20
  322. package/knowledge/2.0/apps/toga25-supply/features/transfer-orders-page.md +1004 -328
  323. package/knowledge/2.0/apps/toga25-supply/workflows/amplify-deployment.md +222 -46
  324. package/knowledge/2.0/apps/toga25-supply/workflows/cypress-testing.md +349 -116
  325. package/knowledge/2.0/apps/toga25-supply/workflows/porting-a-page-from-toga2-supply.md +47 -16
  326. package/knowledge/2.0/apps/voice-to-voice/INDEX.md +4 -4
  327. package/knowledge/2.0/apps/voice-to-voice/architecture.md +78 -33
  328. package/knowledge/2.0/apps/voice-to-voice/features/livekit-pipeline.md +71 -44
  329. package/knowledge/2.0/apps/voice-to-voice/features/post-call-lambda.md +71 -40
  330. package/knowledge/2.0/apps/voice-to-voice/features/ticket-api-integration.md +101 -55
  331. package/knowledge/2.0/apps/worker2/INDEX.md +61 -61
  332. package/knowledge/2.0/apps/worker2/architecture.md +248 -55
  333. package/knowledge/2.0/apps/worker2/features/alb-target-group-auto-registration.md +153 -47
  334. package/knowledge/2.0/apps/worker2/features/all-client-email-queue-monitor.md +136 -46
  335. package/knowledge/2.0/apps/worker2/features/api-stability-monitor.md +116 -36
  336. package/knowledge/2.0/apps/worker2/features/automated-pr-merger-force-push-race.md +38 -23
  337. package/knowledge/2.0/apps/worker2/features/callback-scheduling.md +199 -100
  338. package/knowledge/2.0/apps/worker2/features/clickup-connectivity-watchdog.md +50 -17
  339. package/knowledge/2.0/apps/worker2/features/clickup-custom-field-conventions.md +26 -16
  340. package/knowledge/2.0/apps/worker2/features/clickup-design-sprint-automation.md +241 -52
  341. package/knowledge/2.0/apps/worker2/features/clickup-general-automation.md +32 -16
  342. package/knowledge/2.0/apps/worker2/features/clickup-github-autolink.md +21 -11
  343. package/knowledge/2.0/apps/worker2/features/clickup-project-routing.md +202 -58
  344. package/knowledge/2.0/apps/worker2/features/clickup-richtext-api.md +41 -22
  345. package/knowledge/2.0/apps/worker2/features/clickup-subtask-activity.md +79 -30
  346. package/knowledge/2.0/apps/worker2/features/clickup-task-fluffer-talos.md +106 -39
  347. package/knowledge/2.0/apps/worker2/features/clickup-work-type-automation.md +63 -20
  348. package/knowledge/2.0/apps/worker2/features/compass-vip-support-importer.md +119 -37
  349. package/knowledge/2.0/apps/worker2/features/creating-worker-actions.md +455 -99
  350. package/knowledge/2.0/apps/worker2/features/cross-account-aws-access.md +209 -78
  351. package/knowledge/2.0/apps/worker2/features/elastic-beanstalk-health-monitor.md +278 -95
  352. package/knowledge/2.0/apps/worker2/features/elite-freshservice-sync.md +96 -66
  353. package/knowledge/2.0/apps/worker2/features/error-escalation-cron.md +420 -118
  354. package/knowledge/2.0/apps/worker2/features/error-issue-auto-resolution.md +150 -53
  355. package/knowledge/2.0/apps/worker2/features/etilize-catalog-item-import.md +78 -42
  356. package/knowledge/2.0/apps/worker2/features/etilize-item-translation-import.md +75 -41
  357. package/knowledge/2.0/apps/worker2/features/monitoring-framework.md +172 -64
  358. package/knowledge/2.0/apps/worker2/features/netsuite-clickup-opportunity-bidirectional-design.md +87 -33
  359. package/knowledge/2.0/apps/worker2/features/netsuite-integrations-monitor.md +97 -37
  360. package/knowledge/2.0/apps/worker2/features/netsuite-item-client-routing.md +88 -39
  361. package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-client-labels.md +323 -94
  362. package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-sync.md +979 -208
  363. package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-open-orders-sync.md +181 -62
  364. package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-outbound-push.md +170 -123
  365. package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-backfill-worker.md +76 -51
  366. package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-webhook-importer.md +122 -73
  367. package/knowledge/2.0/apps/worker2/features/netsuite-transferorder-outbound-push.md +449 -131
  368. package/knowledge/2.0/apps/worker2/features/notification-email-template.md +97 -37
  369. package/knowledge/2.0/apps/worker2/features/notification-email.md +140 -49
  370. package/knowledge/2.0/apps/worker2/features/nychh-asset-tag-backfill.md +62 -35
  371. package/knowledge/2.0/apps/worker2/features/oneuptime-incident-clickup-sync.md +138 -52
  372. package/knowledge/2.0/apps/worker2/features/oneuptime-worker2-monitoring.md +540 -373
  373. package/knowledge/2.0/apps/worker2/features/platform-cache-cleanup.md +61 -50
  374. package/knowledge/2.0/apps/worker2/features/qa-qc-branch-automation.md +52 -42
  375. package/knowledge/2.0/apps/worker2/features/qa-qc-review-pipeline.md +66 -56
  376. package/knowledge/2.0/apps/worker2/features/s3-folder-retention-cleanup.md +74 -58
  377. package/knowledge/2.0/apps/worker2/features/service-request-sales-order-generation.md +175 -62
  378. package/knowledge/2.0/apps/worker2/features/sso-stability-monitor.md +69 -29
  379. package/knowledge/2.0/apps/worker2/features/startech-webhook-handler.md +33 -24
  380. package/knowledge/2.0/apps/worker2/features/talos-meeting-notes-integration.md +70 -35
  381. package/knowledge/2.0/apps/worker2/features/talos-pricing-automation.md +106 -50
  382. package/knowledge/2.0/apps/worker2/features/talos-transcript-ingestion.md +431 -319
  383. package/knowledge/2.0/apps/worker2/features/team-sprint-management.md +303 -244
  384. package/knowledge/2.0/apps/worker2/features/teams-transcript-export.md +173 -128
  385. package/knowledge/2.0/apps/worker2/features/tracking-status-refresh.md +124 -103
  386. package/knowledge/2.0/apps/worker2/features/vapi-webhook-handler.md +277 -198
  387. package/knowledge/2.0/apps/worker2/features/wje-freshservice-sync.md +21 -16
  388. package/knowledge/2.0/apps/worker2/features/worker-fleet-role-assignment-monitor.md +105 -97
  389. package/knowledge/2.0/apps/worker2/workflows/clickup-credential-rotation.md +52 -47
  390. package/knowledge/2.0/apps/worker2/workflows/php-runtime-upgrade-dependency-audit.md +120 -112
  391. package/knowledge/2.0/apps/worker2/workflows/running-worker2-locally.md +124 -88
  392. package/knowledge/2.0/apps/worker2/workflows/ticket-to-pseudocode-planning.md +49 -52
  393. package/knowledge/2.0/standards/backend-php.md +99 -23
  394. package/knowledge/2.0/standards/backend-testing.md +93 -29
  395. package/knowledge/2.0/standards/framework-rules.md +47 -10
  396. package/knowledge/2.0/standards/frontend-deploy.md +34 -13
  397. package/knowledge/2.0/standards/frontend.md +111 -40
  398. package/knowledge/2.0/standards/python.md +76 -33
  399. package/knowledge/2.0/standards/ssl-certificate-trust-model.md +71 -20
  400. package/knowledge/CONVENTIONS.md +29 -52
  401. package/knowledge/INDEX.md +3 -3
  402. package/knowledge/clients/adyen/INDEX.md +1 -1
  403. package/knowledge/clients/adyen/profile.md +90 -38
  404. package/knowledge/clients/aig/INDEX.md +3 -3
  405. package/knowledge/clients/aig/features/contract-reconciliation.md +123 -55
  406. package/knowledge/clients/aig/features/entitlement-intake.md +536 -165
  407. package/knowledge/clients/aig/profile.md +22 -10
  408. package/knowledge/clients/canon/INDEX.md +1 -1
  409. package/knowledge/clients/canon/profile.md +17 -9
  410. package/knowledge/clients/compass-canada/INDEX.md +7 -7
  411. package/knowledge/clients/compass-canada/features/french-item-feature-translations.md +55 -21
  412. package/knowledge/clients/compass-canada/features/french-order-email-localization.md +306 -83
  413. package/knowledge/clients/compass-canada/features/grand-and-toy-asn-import.md +302 -70
  414. package/knowledge/clients/compass-canada/features/item-fulfillment-tableviews.md +104 -42
  415. package/knowledge/clients/compass-canada/features/order-fulfillment-status-per-line.md +178 -52
  416. package/knowledge/clients/compass-canada/profile.md +198 -31
  417. package/knowledge/clients/compass-canada/workflows/grand-and-toy-asn-backfill.md +104 -30
  418. package/knowledge/clients/compass-usa/INDEX.md +35 -35
  419. package/knowledge/clients/compass-usa/features/approval-decision-flow.md +570 -110
  420. package/knowledge/clients/compass-usa/features/asn-to-item-fulfillment.md +332 -56
  421. package/knowledge/clients/compass-usa/features/contact-email-resolution.md +94 -38
  422. package/knowledge/clients/compass-usa/features/cost-centers.md +114 -32
  423. package/knowledge/clients/compass-usa/features/isfulfillable-data-quality-and-type-rule.md +197 -56
  424. package/knowledge/clients/compass-usa/features/item-catalogs-and-duplicate-items.md +243 -52
  425. package/knowledge/clients/compass-usa/features/item-fulfillment-tracking-tableview.md +91 -30
  426. package/knowledge/clients/compass-usa/features/mits-po-to-so-item-linking.md +273 -51
  427. package/knowledge/clients/compass-usa/features/mits-po-transmission-to-vendors.md +112 -29
  428. package/knowledge/clients/compass-usa/features/mits-po-zero-line-item-rejection.md +124 -45
  429. package/knowledge/clients/compass-usa/features/mits-sales-order-transmission-alerting.md +213 -67
  430. package/knowledge/clients/compass-usa/features/mr-ma-order-approval-and-status.md +188 -50
  431. package/knowledge/clients/compass-usa/features/odp-edi-850-item-resolution.md +230 -63
  432. package/knowledge/clients/compass-usa/features/odp-edi-855-acknowledgement-and-overquantity-guard.md +166 -48
  433. package/knowledge/clients/compass-usa/features/odp-edi-file-retention-and-retry.md +121 -39
  434. package/knowledge/clients/compass-usa/features/oneuptime-ma-refresh-order-monitor.md +97 -33
  435. package/knowledge/clients/compass-usa/features/order-fulfillment-status-per-line.md +196 -68
  436. package/knowledge/clients/compass-usa/features/people-file-user-lifecycle.md +267 -53
  437. package/knowledge/clients/compass-usa/features/persona-model-and-levy-gating.md +144 -35
  438. package/knowledge/clients/compass-usa/features/sales-order-line-renumbering.md +116 -29
  439. package/knowledge/clients/compass-usa/features/stranded-approval-reassignment.md +164 -50
  440. package/knowledge/clients/compass-usa/features/tracking-number-origin-and-asn-link.md +70 -32
  441. package/knowledge/clients/compass-usa/profile.md +2 -9
  442. package/knowledge/clients/compass-usa/workflows/catalog-fold-reversal.md +259 -56
  443. package/knowledge/clients/compass-usa/workflows/changing-a-kit-line-item.md +117 -40
  444. package/knowledge/clients/compass-usa/workflows/cross-kit-bundle-corruption.md +71 -35
  445. package/knowledge/clients/compass-usa/workflows/granting-api-access.md +111 -43
  446. package/knowledge/clients/compass-usa/workflows/granting-navigation-access.md +206 -54
  447. package/knowledge/clients/compass-usa/workflows/granting-persona-bundle-access.md +140 -37
  448. package/knowledge/clients/compass-usa/workflows/odp-duplicate-po-line-cleanup.md +76 -34
  449. package/knowledge/clients/compass-usa/workflows/odp-edi-import-recovery.md +114 -33
  450. package/knowledge/clients/compass-usa/workflows/odp-order-pipeline-to-netsuite.md +371 -71
  451. package/knowledge/clients/compass-usa/workflows/order-lifecycle-and-data-integrity.md +172 -56
  452. package/knowledge/clients/compass-usa/workflows/persona-population-env-comparison.md +54 -20
  453. package/knowledge/clients/compass-usa/workflows/persona-refactor-migration.md +145 -77
  454. package/knowledge/clients/elite/INDEX.md +7 -7
  455. package/knowledge/clients/elite/features/netsuite-togasupply-sync.md +334 -67
  456. package/knowledge/clients/elite/features/salesorder-netsuite-push.md +215 -64
  457. package/knowledge/clients/elite/features/salesorder-status-togadesk-reply.md +57 -27
  458. package/knowledge/clients/elite/features/supply2-scope.md +190 -59
  459. package/knowledge/clients/elite/features/supply2-tableview-config-drift.md +239 -76
  460. package/knowledge/clients/elite/features/togadesk-service-request-intake.md +176 -57
  461. package/knowledge/clients/elite/profile.md +108 -31
  462. package/knowledge/clients/endeavor-health/INDEX.md +1 -1
  463. package/knowledge/clients/endeavor-health/profile.md +11 -7
  464. package/knowledge/clients/fordham/INDEX.md +1 -1
  465. package/knowledge/clients/fordham/profile.md +19 -10
  466. package/knowledge/clients/growrk/INDEX.md +4 -4
  467. package/knowledge/clients/growrk/features/shipping-carrier-cleanup.md +46 -23
  468. package/knowledge/clients/growrk/features/transfer-order-flow.md +88 -39
  469. package/knowledge/clients/growrk/features/units-netsuite-custom-fields.md +149 -59
  470. package/knowledge/clients/growrk/profile.md +46 -14
  471. package/knowledge/clients/northwell/INDEX.md +2 -2
  472. package/knowledge/clients/northwell/features/sso-jit-provisioning.md +75 -25
  473. package/knowledge/clients/northwell/profile.md +31 -12
  474. package/knowledge/clients/nycdoe/INDEX.md +4 -4
  475. package/knowledge/clients/nycdoe/features/edi-850-receive-and-997-ack.md +68 -28
  476. package/knowledge/clients/nycdoe/features/hold-status-sync.md +321 -72
  477. package/knowledge/clients/nycdoe/features/servicenow-integration.md +643 -132
  478. package/knowledge/clients/nycdoe/profile.md +28 -11
  479. package/knowledge/clients/nychh/INDEX.md +9 -8
  480. package/knowledge/clients/nychh/features/location-shipping-addresses.md +110 -36
  481. package/knowledge/clients/nychh/features/netsuite-inventory-adjustment-fulfillment-link.md +235 -55
  482. package/knowledge/clients/nychh/features/netsuite-transfer-order-import.md +403 -126
  483. package/knowledge/clients/nychh/features/po-number-upstream-direction.md +63 -19
  484. package/knowledge/clients/nychh/features/talos-assistant-enablement.md +106 -42
  485. package/knowledge/clients/nychh/features/transfer-order-inventory-quantities.md +386 -118
  486. package/knowledge/clients/nychh/features/transfer-order-netsuite-push.md +208 -83
  487. package/knowledge/clients/nychh/features/transfer-order-notification-emails.md +238 -0
  488. package/knowledge/clients/nychh/profile.md +363 -55
  489. package/knowledge/clients/office-depot/INDEX.md +3 -3
  490. package/knowledge/clients/office-depot/features/odp-tech-support.md +56 -30
  491. package/knowledge/clients/office-depot/features/togarefresh2026-linkbuilder-routing.md +21 -17
  492. package/knowledge/clients/office-depot/profile.md +46 -16
  493. package/knowledge/clients/pcmaticb2b/INDEX.md +4 -4
  494. package/knowledge/clients/pcmaticb2b/features/startech-entitlement-provisioning.md +101 -35
  495. package/knowledge/clients/pcmaticb2b/features/startech-per-ticket-type-stages.md +123 -42
  496. package/knowledge/clients/pcmaticb2b/features/startech-ticket-sync.md +105 -58
  497. package/knowledge/clients/pcmaticb2b/profile.md +10 -5
  498. package/knowledge/clients/prudential/INDEX.md +15 -15
  499. package/knowledge/clients/prudential/features/dell-asn-units-interceptor.md +69 -21
  500. package/knowledge/clients/prudential/features/dell-lch-iop-transmissions.md +170 -53
  501. package/knowledge/clients/prudential/features/device-information-import-and-contact-linking.md +115 -27
  502. package/knowledge/clients/prudential/features/itemclasses-device-tier-data.md +74 -25
  503. package/knowledge/clients/prudential/features/oneuptime-order-pipeline-monitors.md +55 -19
  504. package/knowledge/clients/prudential/features/order-email-pdf-attachments.md +177 -53
  505. package/knowledge/clients/prudential/features/service-request-address-validation.md +105 -51
  506. package/knowledge/clients/prudential/features/service-request-auth-rejection-alert.md +113 -37
  507. package/knowledge/clients/prudential/features/service-request-rejection-alert-email.md +77 -30
  508. package/knowledge/clients/prudential/features/supply-orders-csv-export.md +90 -29
  509. package/knowledge/clients/prudential/features/transmit-ordershipped-email.md +211 -58
  510. package/knowledge/clients/prudential/profile.md +81 -29
  511. package/knowledge/clients/prudential/workflows/dell-asn-backfill-replay.md +38 -14
  512. package/knowledge/clients/prudential/workflows/http2-alb-workaround.md +34 -15
  513. package/knowledge/clients/prudential/workflows/store-saml-deploy-topology.md +115 -39
  514. package/knowledge/clients/quad/INDEX.md +5 -5
  515. package/knowledge/clients/quad/features/enter-po-details-vendor-selection-ev12.md +36 -20
  516. package/knowledge/clients/quad/features/multi-currency-item-pricing.md +139 -43
  517. package/knowledge/clients/quad/features/po-asn-email-import.md +139 -48
  518. package/knowledge/clients/quad/profile.md +126 -24
  519. package/knowledge/clients/quad/workflows/catalog-fold-reversal.md +84 -36
  520. package/knowledge/clients/rate/INDEX.md +12 -12
  521. package/knowledge/clients/rate/features/aig-contract-creation.md +554 -90
  522. package/knowledge/clients/rate/features/checkout-terms-delivery-preference.md +69 -28
  523. package/knowledge/clients/rate/features/home-warranty-terms-content.md +65 -23
  524. package/knowledge/clients/rate/features/monthly-reconciliation-report.md +37 -18
  525. package/knowledge/clients/rate/features/netsuite-cashsale-export.md +56 -19
  526. package/knowledge/clients/rate/features/paypal-subscription-purchase-webhook.md +204 -60
  527. package/knowledge/clients/rate/features/saml-sso.md +16 -12
  528. package/knowledge/clients/rate/features/service-card-entitlements.md +141 -44
  529. package/knowledge/clients/rate/features/service-purchase-emails.md +132 -40
  530. package/knowledge/clients/rate/features/subscription-cancellation.md +412 -82
  531. package/knowledge/clients/rate/features/whole-home-warranty-purchase-guard.md +610 -97
  532. package/knowledge/clients/rate/profile.md +5 -3
  533. package/knowledge/clients/rumcsi/INDEX.md +1 -1
  534. package/knowledge/clients/rumcsi/profile.md +102 -34
  535. package/knowledge/clients/spglobal/INDEX.md +1 -1
  536. package/knowledge/clients/spglobal/profile.md +11 -7
  537. package/knowledge/clients/staples/INDEX.md +2 -2
  538. package/knowledge/clients/staples/features/oneuptime-sftp-folder-monitors.md +71 -30
  539. package/knowledge/clients/staples/profile.md +23 -9
  540. package/knowledge/clients/tow-foundation/INDEX.md +2 -2
  541. package/knowledge/clients/tow-foundation/features/receipt-processing.md +306 -96
  542. package/knowledge/clients/tow-foundation/profile.md +45 -18
  543. package/knowledge/clients/true/INDEX.md +2 -2
  544. package/knowledge/clients/true/features/users-personas-data-model.md +15 -12
  545. package/knowledge/clients/true/profile.md +31 -9
  546. package/knowledge/clients/walmart/INDEX.md +3 -4
  547. package/knowledge/clients/walmart/features/domain-migration.md +13 -16
  548. package/knowledge/clients/walmart/features/registration-route.md +24 -23
  549. package/knowledge/clients/walmart/profile.md +12 -13
  550. package/knowledge/clients/wje/INDEX.md +1 -1
  551. package/knowledge/clients/wje/profile.md +19 -14
  552. package/knowledge/standalone/apps/claude/INDEX.md +5 -5
  553. package/knowledge/standalone/apps/claude/features/review-enforcement-hooks.md +44 -19
  554. package/knowledge/standalone/apps/claude/workflows/harness-distribution.md +40 -29
  555. package/knowledge/standalone/apps/claude/workflows/knowledge-publish-pipeline.md +43 -23
  556. package/knowledge/standalone/apps/claude/workflows/mcp-tool-usage.md +149 -68
  557. package/knowledge/standalone/apps/claude/workflows/ticket-branch-creation-safety.md +62 -32
  558. package/knowledge/standalone/apps/forward/INDEX.md +3 -3
  559. package/knowledge/standalone/apps/forward/architecture.md +71 -26
  560. package/knowledge/standalone/apps/forward/features/encrypted-link-handler.md +33 -19
  561. package/knowledge/standalone/apps/forward/features/static-demo-hosting.md +93 -33
  562. package/knowledge/standalone/apps/togatech/INDEX.md +5 -5
  563. package/knowledge/standalone/apps/togatech/architecture.md +71 -40
  564. package/knowledge/standalone/apps/togatech/features/careers-paylocity-job-openings.md +106 -31
  565. package/knowledge/standalone/apps/togatech/features/seo-aeo-geo-prerender.md +13 -11
  566. package/knowledge/standalone/apps/togatech/workflows/creating-pull-requests.md +13 -14
  567. package/knowledge/standalone/apps/togatech/workflows/local-dev-and-headless-verification.md +46 -15
  568. package/knowledge/standalone/apps/websocket/INDEX.md +2 -2
  569. package/knowledge/standalone/apps/websocket/architecture.md +22 -16
  570. package/knowledge/standalone/apps/websocket/features/sqs-fanout.md +50 -18
  571. package/knowledge/standalone/standards/brand-naming.md +12 -7
  572. package/knowledge/standalone/standards/communication-clarity.md +42 -12
  573. package/knowledge/standalone/standards/deploy-instruction-communication.md +27 -7
  574. package/knowledge/standalone/standards/session-priming.md +57 -15
  575. package/package.json +1 -1
  576. package/knowledge/1.0/apps/library/workflows/render-1-0-email-templates-offline.md +0 -50
  577. package/knowledge/1.0/standards/backend-php-cases.md +0 -75
  578. package/knowledge/1.0/standards/framework-rules-cases.md +0 -26
  579. package/knowledge/1.0/standards/frontend-cases.md +0 -37
  580. package/knowledge/2.0/apps/_underscore/features/model-storage-field-s3.md +0 -91
  581. package/knowledge/2.0/standards/backend-php-cases.md +0 -55
  582. package/knowledge/2.0/standards/framework-rules-cases.md +0 -25
  583. package/knowledge/2.0/standards/frontend-cases.md +0 -57
  584. package/knowledge/2.0/standards/frontend-deploy-cases.md +0 -18
  585. package/knowledge/2.0/standards/ssl-certificate-trust-model-cases.md +0 -30
  586. package/knowledge/clients/walmart/features/customer-email-lifecycle.md +0 -86
  587. package/knowledge/standalone/standards/brand-naming-cases.md +0 -21
@@ -2,4 +2,4 @@
2
2
 
3
3
  | Doc | Summary |
4
4
  |-----|---------|
5
- | [Authoring & Shipping a 1.0 dbchanges SQL File](workflows/authoring-and-shipping-sql-files.md) | Authoring & shipping a 1.0 `dbchanges` `.sql` file: the crude runner's parse/fail-stop model, the only working all-or-nothing guard, folder=database, and which |
5
+ | [Authoring & Shipping a 1.0 dbchanges SQL File](workflows/authoring-and-shipping-sql-files.md) | `dbchanges` is the **1.0** (legacy/V1) schema-and-data change repository the 1.0 sibling of 2.0's `dbchanges2`. |
@@ -6,7 +6,7 @@ project: Database Changes
6
6
  client: shared
7
7
  type: workflow
8
8
  status: active
9
- updated: 2026-09-16
9
+ updated: 2026-08-14
10
10
  owners: [sking]
11
11
  files:
12
12
  - dbchanges/index.php
@@ -19,36 +19,42 @@ related:
19
19
  - ../../../../clients/nycdoe/features/servicenow-integration.md
20
20
  ---
21
21
 
22
- Authoring & shipping a 1.0 `dbchanges` `.sql` file: the crude runner's parse/fail-stop model, the only working all-or-nothing guard, folder=database, and which branches auto-apply; open before writing any 1.0 dbchanges SQL.
23
-
24
22
  ## Summary
25
23
 
26
- `dbchanges` is the **1.0** (legacy/V1) schema-and-data change repo — the 1.0 sibling of 2.0's `dbchanges2`. Unlike `dbchanges2` it ships **its own runner**, `dbchanges/index.php`, invoked by the worker tier. The runner's parsing model is crude and its error path is **fail-stop for the whole queue**, so *how* you write the `.sql` file decides whether your change (and everyone else's queued behind it) applies at all.
24
+ `dbchanges` is the **1.0** (legacy/V1) schema-and-data change repository — the 1.0 sibling of
25
+ 2.0's `dbchanges2`. Unlike `dbchanges2` it ships **its own runner**, `dbchanges/index.php`, which
26
+ is invoked by the worker tier. The runner's parsing model is crude and its error path is
27
+ **fail-stop for the whole queue**, so *how* you write the `.sql` file decides whether your change
28
+ (and everyone else's queued behind it) applies at all.
27
29
 
28
30
  Two rules dominate everything below:
29
- 1. **A chunk that contains only comments aborts the entire queue.** Put all commentary *before* the final statement; never end a commented line with a semicolon.
30
- 2. **`_production` does NOT auto-apply.** Merged production data changes land on the next worker **deploy**, not within minutes.
31
31
 
32
- > `dbchanges/Core/*` targets the **legacy (V1) `Core` schema** — not the 2.0 prod `Core`. Confirm the target environment before writing anything.
32
+ 1. **A chunk that contains only comments aborts the entire queue.** Put all commentary *before*
33
+ the final statement; never end a commented line with a semicolon.
34
+ 2. **`_production` does NOT auto-apply.** Merged production data changes land on the next worker
35
+ **deploy**, not within minutes.
33
36
 
34
- ## Steps
37
+ > `dbchanges/Core/*` targets the **legacy (V1) `Core` schema** — not the 2.0 prod `Core`. Confirm
38
+ > the target environment before writing anything.
35
39
 
36
- 1. Confirm the target schema/environment (`Core/` = legacy V1 `Core`).
37
- 2. Branch per the git-workflow rules (`fix/...`, `feature/...`) — never commit to `_production`.
38
- 3. Write **one file, commentary first, statements last**, no trailing comment chunk, no explicit `COMMIT`, and no `DELIMITER`/stored-routine constructs.
39
- 4. Wrap any risky data change in the derived-table preflight guard (below) so a drifted before-state is a no-op rather than a wrong write.
40
- 5. Open a PR into `_production` (or the target `_<env>` branch).
41
- 6. After merge: `_<env>` branches apply within ~2 min; **`_production` waits for the next worker deploy** — verify with a read-only query afterward rather than assuming. **Merging the PR applies nothing by itself** — `dbchanges` has no CI, no workflow, no runner of its own; every application is driven from the worker tier.
42
- 7. If the change spans more than one top-level (database) folder, verify **each database separately** — see the silent-skip trap below.
40
+ ## How the runner parses a file (`dbchanges/index.php`)
43
41
 
44
- ### How the runner parses a file (`dbchanges/index.php`)
42
+ - Each `.sql` file is read whole and split on the **literal `";\n"`** (semicolon + newline)
43
+ — `index.php` ~L140. There is no SQL lexer: no awareness of strings, comments, or delimiters.
44
+ - Every non-empty chunk is sent to MySQL through a single **`mysqli_query()`** (~L145). Multi-
45
+ statement execution is not used.
46
+ - On error (~L146–170) the runner writes to `Logs.Errors` and, on the prod path, **`exit()`s** —
47
+ which **blocks every dbchanges file queued behind it** until the offending file is fixed.
48
+ - Each file runs **inside a transaction**: `mysqli_autocommit($link, false)` is set before the
49
+ `_dbchanges` bookkeeping INSERT, and autocommit is only re-enabled (implicit COMMIT) after the
50
+ whole file succeeds. So on error the statement **and** its `_dbchanges` row roll back together,
51
+ and the file is retried on the next run.
45
52
 
46
- - Each `.sql` file is read whole and split on the **literal `";\n"`** (semicolon + newline) — `index.php` ~L140. There is no SQL lexer: no awareness of strings, comments, or delimiters.
47
- - Every non-empty chunk is sent to MySQL through a single **`mysqli_query()`** (~L145). Multi-statement execution is not used.
48
- - On error (~L146–170) the runner writes to `Logs.Errors` and, on the prod path, **`exit()`s** — which **blocks every dbchanges file queued behind it** until the offending file is fixed.
49
- - Each file runs **inside a transaction**: `mysqli_autocommit($link, false)` is set before the `_dbchanges` bookkeeping INSERT, and autocommit is only re-enabled (implicit COMMIT) after the whole file succeeds. So on error the statement **and** its `_dbchanges` row roll back together, and the file is retried on the next run.
53
+ ### Consequence: the "empty query" trap
50
54
 
51
- **The "empty query" trap:** a chunk consisting solely of `--` comment lines comes back as MySQL error **1065 "Query was empty"** — a hard failure that stops the queue. Easy to trigger by pasting verification queries or notes *after* the last statement.
55
+ A chunk consisting solely of `--` comment lines comes back as MySQL error **1065 "Query was
56
+ empty"** — a hard failure that stops the queue. This is easy to trigger accidentally by pasting
57
+ verification queries or explanatory notes *after* the last statement.
52
58
 
53
59
  ```sql
54
60
  -- CORRECT: all commentary lives above the statement, one trailing statement.
@@ -65,14 +71,22 @@ UPDATE ...;
65
71
 
66
72
  All 13 pre-existing files under `dbchanges/Core/` comply with this. Follow them.
67
73
 
68
- ### The all-or-nothing guard pattern (the only one that works)
74
+ ## Expressing an all-or-nothing guard (the only pattern that works)
69
75
 
70
76
  Procedural guards are **not expressible** in a dbchanges file:
71
- - `IF` / `SIGNAL` / conditional `COMMIT`-`ROLLBACK` on `ROW_COUNT()` are legal only inside a stored routine.
72
- - A routine body cannot be shipped anyway: its internal semicolons are shredded by the `";\n"` split, and `DELIMITER` is a **client** directive that `mysqli` does not understand.
73
- - An explicit `COMMIT` is **actively harmful** — it lands the data change independently of the `_dbchanges` bookkeeping row, breaking retry-on-failure.
74
77
 
75
- The working pattern is a **single-statement inline preflight guard**: a derived-table subquery that counts the rows in the expected *before* state and requires an exact count, so the statement is a no-op unless reality matches the assumption. The **derived-table wrapper is load-bearing** — it is what avoids MySQL error **1093** ("can't specify target table for update in FROM clause"). Validated on **MySQL 8.0.42**.
78
+ - `IF` / `SIGNAL` / conditional `COMMIT`-`ROLLBACK` on `ROW_COUNT()` are legal only inside a
79
+ stored routine.
80
+ - A routine body cannot be shipped anyway: its internal semicolons are shredded by the `";\n"`
81
+ split, and `DELIMITER` is a **client** directive that `mysqli` does not understand.
82
+ - An explicit `COMMIT` is **actively harmful** — it lands the data change independently of the
83
+ `_dbchanges` bookkeeping row, breaking retry-on-failure.
84
+
85
+ The working pattern is a **single-statement inline preflight guard**: a derived-table subquery
86
+ that counts the rows in the expected *before* state and requires an exact count, so the statement
87
+ is a no-op unless reality matches the assumption. The **derived-table wrapper is load-bearing** —
88
+ it is what avoids MySQL error **1093** ("can't specify target table for update in FROM clause").
89
+ Validated on **MySQL 8.0.42**.
76
90
 
77
91
  ```sql
78
92
  UPDATE SomeTable t
@@ -84,15 +98,28 @@ WHERE t.id IN (<ids>)
84
98
  ) AS preflight) = <expected-row-count>;
85
99
  ```
86
100
 
87
- ### One top-level folder = one DATABASE (and the silent-skip trap)
101
+ ## One top-level folder = one DATABASE (and the silent-skip trap)
88
102
 
89
- The repo's top level is a list of **database names**, not modules: `Core`, `TOGaDeskSupport`, `Common`, `Logs`, `Bridge_NetSuite`, … The runner walks every top-level directory and treats the **folder name as the database to connect to** (`index.php` ~L55–60), then — for each folder — scans `config.<env>.ini` and uses the **first `[database*]` group it finds** (~L76–80; in `config.prod.ini` that is `[database_main]`) for hostname/username/password. So *all* folders are attempted with **one** set of credentials against one host, with only the DB name varying.
103
+ The repo's top level is a list of **database names**, not modules: `Core`, `TOGaDeskSupport`,
104
+ `Common`, `Logs`, `Bridge_NetSuite`, … The runner walks every top-level directory and treats the
105
+ **folder name as the database to connect to** (`index.php` ~L55–60), then — for each folder — scans
106
+ `config.<env>.ini` and uses the **first `[database*]` group it finds** (`~L76–80`; in
107
+ `config.prod.ini` that is `[database_main]`) for hostname/username/password. So *all* folders are
108
+ attempted with **one** set of credentials against one host, with only the DB name varying.
90
109
 
91
- Consequence: **a folder whose database is not reachable from that host is skipped silently.** The failure path is a bare `echo "Skipping <db> Database... unable to connect"` (~L189) — no `Logs.Errors` row, no `exit()`, no `_dbchanges` bookkeeping. Nothing retries it, and nothing tells you. A change spanning two databases on two different clusters (e.g. `Core` on **db_core** and `TOGaDeskSupport` on **db_togadesk**) therefore needs **two separate runs**, one per cluster, and an applier pointed at only one of them **half-applies the change and reports success**.
110
+ Consequence: **a folder whose database is not reachable from that host is skipped silently.**
111
+ The failure path is a bare `echo "Skipping <db> Database... unable to connect"` (`~L189`) — no
112
+ `Logs.Errors` row, no `exit()`, no `_dbchanges` bookkeeping. Nothing retries it, and nothing tells
113
+ you. A change that spans two databases on two different clusters (e.g. `Core` on **db_core** and
114
+ `TOGaDeskSupport` on **db_togadesk**) therefore needs **two separate runs**, one per cluster, and
115
+ an applier pointed at only one of them **half-applies the change and reports success**.
92
116
 
93
- **Rule: a multi-database change is not done until you have verified each database independently.** Verify **per-pair** (does *this* key have *this* value?), not by a `COUNT(*) ... IS NOT NULL` total — a per-count check passes on the cluster that applied and tells you nothing about the one that didn't.
117
+ **Rule: a multi-database change is not done until you have verified each database independently.**
118
+ Verify **per-pair** (does *this* key have *this* value?), not by a `COUNT(*) ... IS NOT NULL` total —
119
+ a per-count check passes on the cluster that applied and tells you nothing about the one that
120
+ didn't.
94
121
 
95
- ### Which branches actually auto-apply
122
+ ## Which branches actually auto-apply
96
123
 
97
124
  | Path | Trigger | Timing |
98
125
  |---|---|---|
@@ -100,20 +127,64 @@ Consequence: **a folder whose database is not reachable from that host is skippe
100
127
  | Elastic Beanstalk container command (`worker/.ebextensions/030_dbchanges.config`) | worker **deploy** | on next deploy |
101
128
 
102
129
  The repo ships `config.alpha/beta/demo/hotfix/prod/stage/test/worker.ini`, therefore:
130
+
103
131
  - **Auto-apply within ~2 min of a push:** `_alpha`, `_beta`, `_demo`, `_hotfix`, `_stage`.
104
- - **`_production` does NOT auto-apply** — it would need `config.production.ini`, which does not exist (the shipped file is `config.prod.ini`). Production applies via the EB deploy container command instead, i.e. **on the next worker deploy**. Plan comms and expectations accordingly.
132
+ - **`_production` does NOT auto-apply** — it would need `config.production.ini`, which does not
133
+ exist (the shipped file is `config.prod.ini`). Production applies via the EB deploy container
134
+ command instead, i.e. **on the next worker deploy**. Plan comms and expectations accordingly.
105
135
 
106
- ## Gotchas
136
+ ## Steps
107
137
 
108
- - **A comment-only chunk stops the whole queue** (error 1065 + `exit()` on the prod path). Your malformed file blocks unrelated teammates' migrations — a team-wide failure, not a local one.
109
- - **No `DELIMITER`, no stored routines, no explicit `COMMIT`.** See the guard-pattern section.
110
- - **Error 1093** is why the preflight subquery must be wrapped in a derived table.
111
- - **A merged PR is not an applied change.** Confirmed live 2026-08-13 (PR dbchanges#265): after the merge into `_production`, both target tables were still 100% unchanged. Never tell a customer or a ticket "applied" off a merge — always re-read the data.
112
- - **A cross-database change half-applies without warning.** Same incident: the `TOGaDeskSupport` file landed and the `Core` file did not, leaving `assets.tag` 87/87 correct while `Core.AdvanceShippingNoticeUnits.assetTag` was 87/87 still empty — a state that *looks* fixed in the UI. Cause is the one-credential-set / folder-is-a-database model above. Verify every database in the change, per-pair.
113
- - **Retry semantics are a feature**: because the data change and the `_dbchanges` row share a transaction, a failing file re-runs next cycle. Do not "help" it with a manual COMMIT.
114
- - **⚠ SECURITY — hardcoded GitHub token.** `worker/crons/infrastructure/execute_dbchanges.php` contains a **plaintext GitHub personal access token** in the small config block near the top of the file (~L14–18), and interpolates it into a `shell_exec()` git-clone command line — which also exposes it in the worker host's process listing. Treat the token as **compromised**: rotate it, move it to config/env (`config.<env>.ini`), and pass it without embedding it in an argv string. No credential value is recorded here by design.
138
+ 1. Confirm the target schema/environment (`Core/` = legacy V1 `Core`).
139
+ 2. Branch per the git-workflow rules (`fix/...`, `feature/...`) never commit to `_production`.
140
+ 3. Write **one file, commentary first, statements last**, no trailing comment chunk, no explicit
141
+ `COMMIT`, and no `DELIMITER`/stored-routine constructs.
142
+ 4. Wrap any risky data change in the derived-table preflight guard above so a drifted before-state
143
+ is a no-op rather than a wrong write.
144
+ 5. Open a PR into `_production` (or the target `_<env>` branch).
145
+ 6. After merge: `_<env>` branches apply within ~2 min; **`_production` waits for the next worker
146
+ deploy** — verify with a read-only query afterwards rather than assuming. **Merging the PR
147
+ applies nothing by itself** — `dbchanges` has no CI, no workflow, no runner of its own; every
148
+ application is driven from the worker tier.
149
+ 7. If the change spans more than one top-level (database) folder, verify **each database
150
+ separately** — see the silent-skip trap above.
115
151
 
116
- ## Related
152
+ ## Gotchas
117
153
 
118
- - [Worker architecture](../../worker/architecture.md) the worker tier drives every dbchanges application.
119
- - [NYCDOE ServiceNow integration](../../../../clients/nycdoe/features/servicenow-integration.md)
154
+ - **A comment-only chunk stops the whole queue** (error 1065 + `exit()` on the prod path). Your
155
+ malformed file blocks unrelated teammates' migrations, so this is a team-wide failure, not a
156
+ local one.
157
+ - **No `DELIMITER`, no stored routines, no explicit `COMMIT`.** See above.
158
+ - **Error 1093** is why the preflight subquery must be wrapped in a derived table.
159
+ - **A merged PR is not an applied change.** Confirmed live 2026-08-13 (PR dbchanges#265): after the
160
+ merge into `_production`, both target tables were still 100% unchanged. Never tell a customer or a
161
+ ticket "applied" off a merge — always re-read the data.
162
+ - **A cross-database change half-applies without warning.** Same incident: the `TOGaDeskSupport`
163
+ file landed and the `Core` file did not, leaving `assets.tag` 87/87 correct while
164
+ `Core.AdvanceShippingNoticeUnits.assetTag` was 87/87 still empty — a state that *looks* fixed in
165
+ the UI. Cause is the one-credential-set / folder-is-a-database model above. Verify every database
166
+ in the change, per-pair.
167
+ - **Retry semantics are a feature**: because the data change and the `_dbchanges` row share a
168
+ transaction, a failing file re-runs next cycle. Do not "help" it with a manual COMMIT.
169
+ - **⚠ SECURITY — hardcoded GitHub token.** `worker/crons/infrastructure/execute_dbchanges.php`
170
+ contains a **plaintext GitHub personal access token** in the small config block near the top of
171
+ the file (~L14–18), and interpolates it into a `shell_exec()` git-clone command line — which
172
+ also exposes it in the worker host's process listing. Treat the token as **compromised**:
173
+ rotate it, move it to config/env (`config.<env>.ini`), and pass it without embedding it in an
174
+ argv string. No credential value is recorded here by design.
175
+
176
+ ## Change history
177
+ - 2026-08-14 — Documented that each **top-level folder is a database name** and that the runner uses
178
+ the **first `[database*]` config group** for every folder, so a folder on another cluster is
179
+ **silently skipped** (bare echo, no `Logs.Errors`, no `exit()`, no retry). Confirmed live during
180
+ the DOE asset-tag backfill (PR dbchanges#265): merging the PR applied nothing, and then a
181
+ `TOGaDeskSupport`-only run left `Core` untouched — a half-fix that looked complete in the UI.
182
+ Added the rule that a multi-database change needs one run per cluster and **per-pair**
183
+ verification, not a non-null count. (sking)
184
+ - 2026-07-29 — Repo onboarded to the KB (1.0 `dbchanges`, framework core sibling of `dbchanges2`).
185
+ Documented the `index.php` `";\n"` split + `mysqli_query()` model and the comment-only-chunk /
186
+ error-1065 queue abort, the per-file transaction & retry semantics, the derived-table preflight
187
+ guard as the only workable all-or-nothing pattern (verified MySQL 8.0.42), and which `_%`
188
+ branches actually auto-apply (`_production` does **not** — it lands on the next worker deploy).
189
+ Flagged the plaintext GitHub token in `worker/crons/infrastructure/execute_dbchanges.php` for
190
+ rotation. (sking)
@@ -2,26 +2,25 @@
2
2
 
3
3
  | Doc | Summary |
4
4
  |-----|---------|
5
- | [Library (1.0 Framework) Architecture](architecture.md) | The 1.0 `App_` framework core: bootstrap/autoloader, the `app/` (`App_`) + `browser/` (`Browser_`) class trees, and vendored packages; open for how any 1.0 app |
6
- | [Address Validation Gateway (App_Api_OfficeDepot::validateAddress + USPS fallback)](features/address-validation-gateway.md) | The shared 1.0 address-validation gateway (`App_Api_OfficeDepot::validateAddress` → USPS fallback); open when standardizing/verifying a typed address before sav |
7
- | [Where a new App_ class goes — the app/ folder IS a behavioral contract](features/app-class-placement-base-contracts.md) | Where a new `App_` class goes each `app/` folder's base class carries real inherited behavior; open before creating any class under `app/model|client|api`. |
8
- | [App_Sso — Reusable 1.0 SSO Initiation (SP-initiated SAML via saml.togahub.com)](features/app-sso-initiation.md) | Reusable 1.0 SP-initiated SAML SSO via `saml.togahub.com` (`App_Sso::initiate`); the canonical doc to follow for any "add SSO to `<1.0 app>`" request. |
9
- | [Cron Execution Monitoring (App_Framework check-in/out → CronJobExecutions)](features/cron-execution-monitoring.md) | 1.0 cron check-in/out lifecycle via `App_Framework::cronInitialization()`/`cronFinished()` `Common.CronJobExecutions`; open to monitor a 1.0 cron or read its |
10
- | [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 |
11
- | [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 |
12
- | [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 |
13
- | [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. |
14
- | [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 |
15
- | [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 |
16
- | [HTTP 500 Error Monitor (App_SystemMonitor_500Error) — and why its \"Error Type\" is not a diagnosis](features/http-500-error-monitor.md) | 1.0 monitor `App_SystemMonitor_500Error` watching `Logs.Api` responseCode=500; open when an api2 500 alert arrives its "Error Type" is noise, use `error.id`. |
17
- | [1.0 MVC Page Pattern & New-App Skeleton](features/mvc-page-pattern-and-app-skeleton.md) | Recipe for a new 1.0 (`App_`) app and for adding pages: folder-based MVC routing, page lifecycle, models, multi-DB config; open when standing up a 1.0 app or ad |
18
- | [NetSuite File Cabinet Content Retrieval via RESTlet (fetchInvoiceFile)](features/netsuite-filecabinet-restlet.md) | How 1.0 pulls NetSuite File Cabinet binary content (invoice PDFs) via a SuiteScript RESTlet (`fetchInvoiceFile`); open when fetching NetSuite file bytes over RE |
19
- | [assetType from NetSuite itemtype during Item Sync (opt-in per client)](features/netsuite-item-assettype-sync.md) | Stamp `Items.assetTypeId` from NetSuite `item.itemtype` during item sync (opt-in per client, fill-NULL-only); open before enabling asset-type mapping for a clie |
20
- | [NetSuite classification → ItemClasses sync (opt-in per client)](features/netsuite-item-class-sync.md) | Mirror NetSuite's classification tree into client `ItemClasses` + stamp `Items.itemClassId` (`getCreateItemClass`, opt-in per client); open before enabling item |
21
- | [isFulfillable from NetSuite during Item Sync (Phase 1)](features/netsuite-item-isfulfillable-sync.md) | 1.0 Phase-1 stamping of the NetSuite `isfulfillable` flag onto the Agilant source item during sync; open before changing fulfillability sync or a client overrid |
22
- | [NetSuite SuiteQL/REST API Reference](features/netsuite-suiteql-api-reference.md) | Working reference for the Agilant NetSuite REST/SuiteQL integration (`App_Api_Netsuite_Rest`): auth, SuiteQL mechanics, table schemas, type/status codes, perfor |
23
- | [NetSuite SuiteQL/REST Shim — Field Semantics](features/netsuite-suiteql-rest-shim.md) | Non-obvious NetSuite SuiteQL/REST field semantics behind `App_Api_Netsuite_Rest` shims (signs, `tl.id`==line, `iscogs`, ShipItem cost, `createdFrom`, shim-shape |
24
- | [NetSuite Sync Alert Monitor (App_SystemMonitor_NetSuiteIntegration)](features/netsuite-sync-alert-monitor.md) | 1.0 monitor `App_SystemMonitor_NetSuiteIntegration` flags stale per-client NetSuite sync checkpoints (>48h) to ClickUp; open when a sync-stale alert is missin |
25
- | [Startech PC Matic B2B Sync (library)](features/startech-pcmaticb2b-sync.md) | PC Matic B2B bidirectional ticket sync between TOGaDesk 1.0 and TOGA 2.0 (`App_Api_Toga2`); open for ticket-type maps, StarTech client onboarding, and the V1 th |
26
- | [App_Api_Toga2 — TOGa2 API Client & 1.0↔2.0 Sync Bridge](features/toga2-api-client-and-bridge.md) | `App_Api_Toga2` the 1.0-side client for the TOGa2/api2 REST API + cross-framework sync routines (`send`/`authenticate`, options DSL, `syncWithToga`/`syncWithT |
27
- | [Rendering a 1.0 App_Email Template to HTML Offline (no DB, no send)](workflows/render-1-0-email-templates-offline.md) | Produce a standalone `.html` copy of any 1.0 `App_Email` template offline (no DB / mail / queue) via stubs; open when asked "show me exactly what we email the c |
5
+ | [Library (1.0 Framework) Architecture](architecture.md) | `library` is the shared library repository for **all 1.0 (legacy) applications** the `App_` framework. |
6
+ | [Address Validation Gateway (App_Api_OfficeDepot::validateAddress + USPS fallback)](features/address-validation-gateway.md) | `App_Api_OfficeDepot::validateAddress()` is the shared 1.0 (`App_`) address-validation gateway. |
7
+ | [Where a new App_ class goes — the app/ folder IS a behavioral contract](features/app-class-placement-base-contracts.md) | In `library/app/`, choosing a folder is **not** a filing decision the autoloader maps `App_<Folder>_<File>` to `app/<folder>/<file>.php`, and each folder's ba |
8
+ | [App_Sso — Reusable 1.0 SSO Initiation (SP-initiated SAML via saml.togahub.com)](features/app-sso-initiation.md) | `App_Sso` (`library/app/sso.php`) is the **1.0 port of the 2.0 SAML gateway's SP-initiated SSO initiation**, packaged as a reusable, framework-level capability |
9
+ | [Cron Execution Monitoring (App_Framework check-in/out → CronJobExecutions)](features/cron-execution-monitoring.md) | `App_Framework::cronInitialization()` / `App_Framework::cronFinished()` (in `library/app/framework.php`) give every 1.0 (`App_`) cron job a check-in/check-out l |
10
+ | [Diagnostic Dialog — View Recommended Services Routing](features/diagnostic-dialog-view-recommended-services.md) | Two "View Recommended Services" buttons exist in the TOGa Refresh 2026 SR view: 1. |
11
+ | [Elite Freshservice Sync (library)](features/elite-freshservice-sync.md) | `App_Api_Toga2` in `library/app/api/toga2.php` orchestrates bidirectional sync between TOGA 2 and TOGaDesk. |
12
+ | [App_Email Queued Sending & Attachments (Common.EmailsQueued)](features/email-queue-attachments.md) | `App_Email::send()` can either send **inline** (PHPMailer talks to SES right there) or **queue** the message: `base64(serialize($this))` is inserted into `Commo |
13
+ | [Branded HTML Email Templates (App_Email_Template)](features/email-templates.md) | `App_Email_Template` (`app/email/template.php`) is the base class for branded HTML emails in the 1.0 (`App_`) framework. |
14
+ | [App_Email Side Effects & Test Mode (how to send a real email that writes nothing)](features/email-test-mode-and-write-free-sends.md) | `App_Email::send()` is **not** side-effect free. |
15
+ | [Error Capture in 1.0 (App_Error_Capture → shared 2.0 Logs DB)](features/error-capture-1-0.md) | The 1.0 side of the platform error-reporting pipeline (TRUE-78188). |
16
+ | [HTTP 500 Error Monitor (App_SystemMonitor_500Error) — and why its \"Error Type\" is not a diagnosis](features/http-500-error-monitor.md) | `App_SystemMonitor_500Error` (`library/app/systemmonitor/500error.php`, title **"HTTP 500 Error Alert"**) is the 1.0 system monitor that watches **`Logs.Api` fo |
17
+ | [1.0 MVC Page Pattern & New-App Skeleton](features/mvc-page-pattern-and-app-skeleton.md) | This is the **reusable recipe for standing up a new 1.0 (`App_`) application** and for adding pages to one — the folder-based MVC routing, the page lifecycle, t |
18
+ | [NetSuite File Cabinet Content Retrieval via RESTlet (fetchInvoiceFile)](features/netsuite-filecabinet-restlet.md) | How 1.0 pulls **File Cabinet binary content** (invoice PDFs) out of NetSuite over REST. |
19
+ | [assetType from NetSuite itemtype during Item Sync (opt-in per client)](features/netsuite-item-assettype-sync.md) | `getCreateItem()` never sent `assetType`, so **every item the NetSuite importer created had `Items.assetTypeId = NULL`** for every client, since the importer |
20
+ | [NetSuite classification → ItemClasses sync (opt-in per client)](features/netsuite-item-class-sync.md) | `App_Api_Toga2::getCreateItemClass()` mirrors NetSuite's **classification tree** into the client's `ItemClasses` table and stamps `Items.itemClassId`. |
21
+ | [isFulfillable from NetSuite during Item Sync (Phase 1)](features/netsuite-item-isfulfillable-sync.md) | This is the **1.0 (Phase 1)** half of the `isFulfillable` feature: reading the NetSuite `isfulfillable` flag during item sync and stamping it onto the **Agilant |
22
+ | [NetSuite SuiteQL/REST API Reference](features/netsuite-suiteql-api-reference.md) | General working reference for the Agilant NetSuite integration: how to authenticate, how SuiteQL behaves, and the confirmed schema of the tables/columns/codes w |
23
+ | [NetSuite SuiteQL/REST Shim — Field Semantics](features/netsuite-suiteql-rest-shim.md) | `App_Api_Netsuite_Rest` is the REST/SuiteQL replacement for the deprecated NetSuite SOAP toolkit. |
24
+ | [NetSuite Sync Alert Monitor (App_SystemMonitor_NetSuiteIntegration)](features/netsuite-sync-alert-monitor.md) | `App_SystemMonitor_NetSuiteIntegration` (`library/app/systemmonitor/netsuiteintegration.php`, title **"NetSuite Sync Alert"**) is a 1.0 system monitor that watc |
25
+ | [Startech PC Matic B2B Sync (library)](features/startech-pcmaticb2b-sync.md) | `library/app/api/toga2.php` handles bidirectional ticket sync for PC Matic B2B between TOGaDesk 1.0 and TOGA 2.0. |
26
+ | [App_Api_Toga2 — TOGa2 API Client & 1.0↔2.0 Sync Bridge](features/toga2-api-client-and-bridge.md) | `App_Api_Toga2` (`library/app/api/toga2.php`, ~8400 lines) is the **1.0-side client for the TOGa 2 (`_underscore`/api2) public API** *and* the home of the cross |
@@ -6,7 +6,7 @@ project: Library
6
6
  client: shared
7
7
  type: architecture
8
8
  status: active
9
- updated: 2026-09-17
9
+ updated: 2026-06-08
10
10
  owners: [jcardinal]
11
11
  files:
12
12
  - library/_.php
@@ -15,47 +15,57 @@ files:
15
15
  related: []
16
16
  ---
17
17
 
18
- The 1.0 `App_` framework core: bootstrap/autoloader, the `app/` (`App_`) + `browser/` (`Browser_`) class trees, and vendored packages; open for how any 1.0 app loads and where server-side classes live.
19
-
20
18
  ## Summary
21
19
 
22
- `library` is the shared repo for **all 1.0 (legacy) applications** — the `App_` framework. It provides every server-side PHP asset those apps consume: server-side classes, vendored third-party packages, and the bootstrap/autoloader. Target PHP 7.2+, compatible through 8.1. Each app `require`s `library/_.php` to bootstrap.
23
-
24
- **Critical rules:** All folder/file names under `app/` and `browser/` are **lowercase** (autoloader lowercases before lookup). **No front-end assets here** — JS/CSS belong in the `resources/` repo. **No Composer in consuming apps** — add packages directly to `library/`. Remove all `debugVar()` calls before merging. A class that only makes HTTP calls to an external/cross-framework API belongs in `app/api/` and should **extend nothing** (see the class-placement feature doc).
20
+ `library` is the shared library repository for **all 1.0 (legacy) applications** — the
21
+ `App_` framework. It provides every server-side PHP asset those apps consume:
22
+ server-side classes, vendored third-party packages, and the bootstrap/autoloader.
23
+ Target PHP 7.2+, compatible through 8.1.
25
24
 
26
25
  ## Role in the stack
27
26
 
28
27
  - **`library/`** — server-side PHP classes, third-party packages, bootstrap/autoloader.
29
- - **Application repos** — each `require`s `library/_.php` to bootstrap the framework.
30
- - **`resources/` repo** — purely front-end assets (JS/CSS).
28
+ - **Application repos** — each app `require`s `library/_.php` to bootstrap the framework.
29
+ - **`resources/` repo** — purely front-end assets (JS/CSS). **Do not put front-end here.**
31
30
 
32
31
  ## Bootstrap & autoloader (`_.php`)
33
32
 
34
- `_.php` is the single framework include. Every app starts with `require_once '/path/to/library/_.php';`. It:
33
+ `_.php` is the single framework include. Every app starts with
34
+ `require_once '/path/to/library/_.php';`. It:
35
35
 
36
- 1. Sets PHP environment — `display_errors`, `error_reporting(E_ALL)`, timezone `America/Chicago`.
37
- 2. Defines constants — `__APPROOT__` (resolved by walking up from the script's directory until a folder named `_` is found) and `__LIBROOT__` (the `library/` dir).
36
+ 1. Sets PHP environment — `display_errors`, `error_reporting(E_ALL)`, timezone
37
+ `America/Chicago`.
38
+ 2. Defines constants — `__APPROOT__` (resolved by walking up from the script's directory
39
+ until a folder named `_` is found) and `__LIBROOT__` (the `library/` dir).
38
40
  3. Registers the autoloader via `spl_autoload_register('autoloader')`.
39
41
 
40
- Global helper: `debugVar($input, $stopExecution, $withHrLineBreaker)` — dumps a variable as HTML `<PRE>`, optionally halting.
42
+ Global helper: `debugVar($input, $stopExecution, $withHrLineBreaker)` — dumps a variable
43
+ as HTML `<PRE>`, optionally halting. **Remove all `debugVar()` calls before merging.**
41
44
 
42
45
  ### Class-to-file mapping
43
46
 
44
- Convert the class name to a path by replacing every `_` with `/`, then **lowercase the entire result** and append `.php`:
47
+ Convert the class name to a path by replacing every `_` with `/`, then **lowercase the
48
+ entire result** and append `.php`:
45
49
 
46
50
  ```
47
51
  App_Email_Nycdoe_InstallationConfirmation
48
52
  → app/email/nycdoe/installationconfirmation.php (under __APPROOT__ or __LIBROOT__)
49
53
  ```
50
54
 
55
+ - All folder/file names **must be lowercase**.
51
56
  - Class names are **not** case-sensitive (autoloader lowercases before lookup).
52
- - Both `__APPROOT__` and `__LIBROOT__` are checked, so app-level classes can **shadow** library classes. Namespace separators (`\`) normalize to `_`.
57
+ - Both `__APPROOT__` and `__LIBROOT__` are checked, so app-level classes can **shadow**
58
+ library classes. Namespace separators (`\`) normalize to `_`.
53
59
 
54
60
  ## Custom code — `app/` and `browser/`
55
61
 
56
62
  ### `app/` — back-end logic (prefix `App_`)
57
63
 
58
- Pure server-side business logic, no HTML output. Core singletons at root (`App_Config`, `App_Database`, `App_Auth`, `App_Api`, `App_Model`, `App_Email`, `App_Session`). Subfolders: `api/` (vendor integrations), `model/`, `email/`, `notification/`, `pdf/`, `asnprocessor/`, `catalog/`, `client/` (client overrides), `events/`, `edi/`, `trait/`, `systemmonitor/`, `mvc/`.
64
+ Pure server-side business logic, no HTML output. Core singletons at root (`App_Config`,
65
+ `App_Database`, `App_Auth`, `App_Api`, `App_Model`, `App_Email`, `App_Session`).
66
+ Subfolders: `api/` (vendor integrations), `model/`, `email/`, `notification/`, `pdf/`,
67
+ `asnprocessor/`, `catalog/`, `client/` (client overrides), `events/`, `edi/`, `trait/`,
68
+ `systemmonitor/`, `mvc/`.
59
69
 
60
70
  ```php
61
71
  class App_Model_Client extends App_Model {
@@ -66,23 +76,40 @@ class App_Model_Client extends App_Model {
66
76
  }
67
77
  ```
68
78
 
69
- API pattern: `abstract class App_Api` with static methods; `class App_Api_Microsoft extends App_Api` with `initialize()`.
79
+ API pattern: `abstract class App_Api` with static methods; `class App_Api_Microsoft
80
+ extends App_Api` with `initialize()`.
70
81
 
71
82
  ### `browser/` — server-rendered UI (prefix `Browser_`)
72
83
 
73
- PHP classes that emit HTML. Core components (`Browser_Form`, `Browser_Datagrid`, `Browser_Dialog`, `Browser_Widget`, `Browser_Sidebar`) plus subfolders: `datagrid/` (140+ grid views), `form/`, `dialog/`, `search/`, `widget/`, `status/` (35+ states), `sidebar/`, `buttonbar/`, `calendar/`, `chat/`.
84
+ PHP classes that emit HTML. Core components (`Browser_Form`, `Browser_Datagrid`,
85
+ `Browser_Dialog`, `Browser_Widget`, `Browser_Sidebar`) plus subfolders: `datagrid/`
86
+ (140+ grid views), `form/`, `dialog/`, `search/`, `widget/`, `status/` (35+ states),
87
+ `sidebar/`, `buttonbar/`, `calendar/`, `chat/`.
74
88
 
75
89
  ## Third-party packages (vendored, no Composer)
76
90
 
77
- Consuming apps use **no Composer** — this library is the "vendor" directory. Packages are top-level folders: `phpmailer/`, `twilio/`, `php-imap2/`, `fpdf/`/`tcpdf/`, `PhpOffice/`/`phpexcel/`, `Smalot/`, `phpseclib/`, SAML libs, barcode/chart libs, `netsuitetoolkit/`, `payeezy/`, `Zend/`/`Psr/`/`pear/`, etc. The only Composer-managed packages: `phpoffice/phpspreadsheet ^1.6`, `smalot/pdfparser ^0.14.0`.
91
+ The consuming apps use **no Composer** — this library is the "vendor" directory. Packages
92
+ are top-level folders: `phpmailer/`, `twilio/`, `php-imap2/`, `fpdf/`/`tcpdf/`,
93
+ `PhpOffice/`/`phpexcel/`, `Smalot/`, `phpseclib/`, SAML libs, barcode/chart libs,
94
+ `netsuitetoolkit/`, `payeezy/`, `Zend/`/`Psr/`/`pear/`, etc. The only Composer-managed
95
+ packages: `phpoffice/phpspreadsheet ^1.6`, `smalot/pdfparser ^0.14.0`.
78
96
 
79
- ## App_String cross-framework crypto (`encryptWithKey` / `decryptWithKey`)
97
+ ## Key conventions
80
98
 
81
- `App_String::encryptWithKey($data, $key)` and `decryptWithKey($data, $key)` (public static) do **AES-256-CBC**: random IV via `random_bytes`, returning `base64(iv . ciphertext)` with openssl flag `0`. They are **deliberately byte-for-byte interoperable** with the 2.0 `_String::encryptWithKey` / `decryptWithKey`, so a SAML handoff token encrypted by the 2.0 gateway decrypts in any 1.0 app (round-trip verified). Net-new methods — no existing method changed. First consumer: the Tools app's `App_Auth` (`1.0/apps/tools/features/saml-sso-auth.md`).
99
+ - **Lowercase everything** under `app/` and `browser/`.
100
+ - **No front-end assets here** — JS/CSS belong in `resources/`.
101
+ - **No Composer in consuming apps** — add packages directly to `library/`.
102
+ - **`debugVar()`** is the debug helper; remove all calls before merging.
103
+ - **Timezone** is always `America/Chicago` (set in `_.php`).
104
+ - **`__APPROOT__`** is resolved by locating an ancestor folder named `_`; each app must
105
+ have that `_` folder at its root.
82
106
 
83
- ## Gotchas
107
+ ## App_String cross-framework crypto (`encryptWithKey` / `decryptWithKey`)
84
108
 
85
- - **`debugVar()` can halt execution** (its `$stopExecution` arg) — remove all calls before merging.
86
- - **app/ classes silently shadow library/ classes.** The autoloader checks both `__APPROOT__` and `__LIBROOT__`, so an app-level file with the same class path overrides the core one with no warning.
87
- - **`__APPROOT__` resolution needs the `_` folder.** It is found by locating an ancestor folder named `_`; each app must have that `_` folder at its root or the constant won't resolve.
88
- - **⚠ SECURITY — OPEN, SYSTEMIC, not fixed (2026-09-17): TLS peer verification is OFF by default for EVERY `App_ApiTransaction` call.** `library/app/apitransaction.php:363` computes `CURLOPT_SSL_VERIFYPEER` from `$sslVerifyPeer` (default `null`, line 77) as `(((is_null($sslVerifyPeer) && isHTTPS()) || !$sslVerifyPeer) ? false : true)` — which resolves to **`false` on HTTPS**. So every outbound HTTPS call through the shared transport (NetSuite OAuth token exchange, every REST read, the RESTlet call, and any other `App_Api_*` integration) runs with peer verification disabled — a MITM can capture the bearer token or inject responses. Pre-existing core defect, **not** caused by the NetSuite retry; affects all callers. Fix: `CURLOPT_SSL_VERIFYPEER = is_null($sslVerifyPeer) ? isHTTPS() : (bool)$sslVerifyPeer;` and have `rest.php` pass `setSSLVerifyPeer(true)` explicitly. No fix chosen yet. The paired token-logging defect (`send()` writes the bearer token to the request log) is on the [SuiteQL/REST shim doc](features/netsuite-suiteql-rest-shim.md).
109
+ `App_String::encryptWithKey($data, $key)` and `decryptWithKey($data, $key)` (public static) do
110
+ **AES-256-CBC**: random IV via `random_bytes`, returning `base64(iv . ciphertext)` with openssl
111
+ flag `0`. They are **deliberately byte-for-byte interoperable** with the 2.0
112
+ `_String::encryptWithKey` / `decryptWithKey`, so a SAML handoff token encrypted by the 2.0
113
+ gateway decrypts in any 1.0 app (round-trip verified). Net-new methods — no existing method
114
+ changed, no behavior change for existing apps. First consumer: the Tools app's `App_Auth`
115
+ (`1.0/apps/tools/features/saml-sso-auth.md`).
@@ -6,7 +6,7 @@ project: Library
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-09-16
9
+ updated: 2026-08-13
10
10
  owners: [jcardinal]
11
11
  files:
12
12
  - library/app/api/officedepot.php
@@ -15,29 +15,63 @@ related:
15
15
  - ../../toga/features/odp-customer-search-loyalty-persistence.md
16
16
  ---
17
17
 
18
- The shared 1.0 address-validation gateway (`App_Api_OfficeDepot::validateAddress` → USPS fallback); open when standardizing/verifying a typed address before save, or debugging a saved-raw-address bug.
19
-
20
18
  ## Summary
19
+ `App_Api_OfficeDepot::validateAddress()` is the shared 1.0 (`App_`) address-validation gateway.
20
+ It is the entry point every TOGa 1.0 flow calls (via classic AJAX
21
+ `ajaxAction('App_Api_OfficeDepot','validateAddress')`) to standardize/verify a typed address
22
+ before it is saved. It wraps ODP's address-validation service and falls back to
23
+ `App_Api_USPS::validateAddress()` (USPS REST API v3, OAuth `client_credentials`, in
24
+ `library/app/api/usps.php`). It returns a standardized address (corrected city/casing/zip) that
25
+ callers are expected to write back before saving.
21
26
 
22
- `App_Api_OfficeDepot::validateAddress()` is the shared 1.0 (`App_`) address-validation gateway. Every TOGa 1.0 flow calls it (via classic AJAX `ajaxAction('App_Api_OfficeDepot','validateAddress')`) to standardize/verify a typed address before save. It wraps ODP's address-validation service, falls back to `App_Api_USPS::validateAddress()` (USPS REST API v3, OAuth `client_credentials`), and returns a standardized address (corrected city/casing/zip) that callers must write back before saving.
23
-
24
- ## How it works
25
-
26
- Entry points:
27
+ ## Key files / entry points
27
28
  - `library/app/api/officedepot.php` — `App_Api_OfficeDepot::validateAddress()`, the gateway.
28
29
  - `library/app/api/usps.php` — `App_Api_USPS::validateAddress()`, the fallback carrier.
29
30
 
30
- 1. **Endpoint selection.** Calls the ODP **sandbox** endpoint when `App_Registry::inTestMode()` is true (`inTestMode` = `config['internal']['test_mode'] > 0`), and the **live** ODP endpoint otherwise. Production is effectively hard-pinned to live (comment "2024-01-22 JC - Always using production...").
31
- 2. **On a real ODP answer** (HTTP 200, accept or reject) returns ODP's standardized result.
32
- 3. **On any non-200 ODP response** (sandbox down/expired, etc.) falls back to `App_Api_USPS::validateAddress()` and returns the USPS result a genuine standardization **or** a genuine bad-address rejection both count as a real answer and are returned.
33
- 4. **Only when BOTH ODP and USPS are unavailable** returns `array('success' => true)` with no standardized fields (fail-open, so associates are never hard-blocked by an outage).
34
-
35
- ## Gotchas
31
+ ## How it works
32
+ 1. **Endpoint selection.** The gateway calls the ODP **sandbox** endpoint when
33
+ `App_Registry::inTestMode()` is true (`inTestMode` = `config['internal']['test_mode'] > 0`),
34
+ and the **live** ODP endpoint otherwise. Production is effectively hard-pinned to live
35
+ (comment "2024-01-22 JC - Always using production...").
36
+ 2. **On a real ODP answer** (HTTP 200, whether it accepts or rejects the address) the gateway
37
+ returns ODP's standardized result.
38
+ 3. **On any non-200 ODP response** (sandbox down/expired, etc.) it falls back to
39
+ `App_Api_USPS::validateAddress()` and returns the USPS result — a genuine standardization
40
+ **or** a genuine bad-address rejection both count as a real answer and are returned.
41
+ 4. **Only when BOTH ODP and USPS are unavailable** does it return `array('success' => true)`
42
+ with no standardized fields (fail-open, so associates are never hard-blocked by an outage).
36
43
 
37
- - **Beta-bypass class of bug (fixed 2026-08-13).** Previously the ODP-failure `else` branch returned `array('success' => true)` with **no** standardized address fields and the USPS fallback was commented out. Beta/test uses the ODP **sandbox**; when the sandbox was down/expired, callers saw `success:true` and saved the **raw typed address** (wrong city, wrong casing) with no validation. Production was unaffected (working live ODP endpoint). The fix restores the USPS fallback so validation only truly fails open when **both** carriers are down.
38
- - **"Both unavailable" must check BOTH USPS service-down strings.** USPS signals unavailability two ways: `'Address validation service is temporarily unavailable'` **and** `'USPS OAuth authentication failed'`. The fail-open condition must match either. Checking only the first wrongly blocks associates when ODP is down *and* USPS OAuth also fails (a php-reviewer pass caught this).
39
- - **Front-end write-back anti-pattern (widespread, mostly UNFIXED).** Many 1.0 front-end callbacks use the gateway response only as a pass/fail **gate**, then rebuild the save payload from the raw DOM inputs — discarding the standardized `address1`/`city`/`state`/`zipCode` the gateway returned. So even a successful validation never persists the corrected address. Known flows still with this anti-pattern: `toga/app/togarefresh2026/servicerequests/finalizequote.php`, `toga/app/togarefresh2026/appointment/select.php`, `toga/app/servicerequests/builder.php`, `toga/app/loaners/checkout.php`, `toga/app/jobjackets/view.php`, and the `togarefresh2023` variants. The 2026-08-13 gateway fix protects all from the beta bypass, but the write-back was only corrected in the `togarefresh2026` customersearch flow (see related doc). When touching any of these, write the standardized address back into the inputs before building the save payload.
44
+ ## Gotchas / known issues
45
+ - **Beta-bypass class of bug (fixed 2026-08-13).** Previously the ODP-failure `else` branch
46
+ returned `array('success' => true)` with **no** standardized address fields and the USPS
47
+ fallback was commented out. Beta/test uses the ODP **sandbox**; when the sandbox was
48
+ down/expired, callers saw `success:true` and saved the **raw typed address** (wrong city,
49
+ wrong casing) with no validation. Production was unaffected because it hits the working live
50
+ ODP endpoint. The fix restores the USPS fallback so a validation only truly fails open when
51
+ **both** carriers are down.
52
+ - **"Both unavailable" must check BOTH USPS service-down strings.** USPS signals unavailability
53
+ two ways: `'Address validation service is temporarily unavailable'` **and**
54
+ `'USPS OAuth authentication failed'`. The fail-open condition must match either. Checking only
55
+ the first string wrongly blocks associates when ODP is down *and* USPS OAuth also fails
56
+ (a php-reviewer pass caught this).
57
+ - **Front-end write-back anti-pattern (widespread, mostly UNFIXED).** Many 1.0 front-end
58
+ callbacks use the gateway response only as a pass/fail **gate**, then rebuild the save payload
59
+ from the raw DOM inputs — discarding the standardized `address1`/`city`/`state`/`zipCode` the
60
+ gateway returned. So even a successful validation never persists the corrected address. Known
61
+ flows with this anti-pattern still present:
62
+ `toga/app/togarefresh2026/servicerequests/finalizequote.php`,
63
+ `toga/app/togarefresh2026/appointment/select.php`,
64
+ `toga/app/servicerequests/builder.php`, `toga/app/loaners/checkout.php`,
65
+ `toga/app/jobjackets/view.php`, and the `togarefresh2023` variants. The 2026-08-13 gateway fix
66
+ protects all of them from the beta bypass, but the write-back was only corrected in the
67
+ `togarefresh2026` customersearch flow (see related doc). When touching any of these, write the
68
+ standardized address back into the inputs before building the save payload.
40
69
 
41
- ## Related
70
+ ## Related docs
71
+ - `../../toga/features/odp-customer-search-loyalty-persistence.md` — the customersearch save
72
+ flow, where the write-back fix was applied.
42
73
 
43
- - `../../toga/features/odp-customer-search-loyalty-persistence.md` — the customersearch save flow, where the write-back fix was applied.
74
+ ## Change history
75
+ - 2026-08-13 — Fix: restored the USPS fallback in `App_Api_OfficeDepot::validateAddress` so the
76
+ beta/sandbox path no longer fakes `success:true` and saves unvalidated addresses; fail-open now
77
+ requires BOTH ODP and USPS down, checking both USPS service-down strings. (jcardinal)