toga-ai 1.0.837 → 1.0.839

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 (537) 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 +43 -114
  3. package/knowledge/1.0/apps/library/INDEX.md +21 -21
  4. package/knowledge/1.0/apps/library/architecture.md +25 -52
  5. package/knowledge/1.0/apps/library/features/address-validation-gateway.md +19 -53
  6. package/knowledge/1.0/apps/library/features/app-class-placement-base-contracts.md +19 -33
  7. package/knowledge/1.0/apps/library/features/app-sso-initiation.md +38 -75
  8. package/knowledge/1.0/apps/library/features/cron-execution-monitoring.md +24 -90
  9. package/knowledge/1.0/apps/library/features/diagnostic-dialog-view-recommended-services.md +33 -67
  10. package/knowledge/1.0/apps/library/features/elite-freshservice-sync.md +43 -71
  11. package/knowledge/1.0/apps/library/features/email-queue-attachments.md +34 -84
  12. package/knowledge/1.0/apps/library/features/email-templates.md +35 -84
  13. package/knowledge/1.0/apps/library/features/email-test-mode-and-write-free-sends.md +37 -98
  14. package/knowledge/1.0/apps/library/features/error-capture-1-0.md +57 -271
  15. package/knowledge/1.0/apps/library/features/http-500-error-monitor.md +33 -117
  16. package/knowledge/1.0/apps/library/features/mvc-page-pattern-and-app-skeleton.md +21 -42
  17. package/knowledge/1.0/apps/library/features/netsuite-filecabinet-restlet.md +29 -87
  18. package/knowledge/1.0/apps/library/features/netsuite-item-assettype-sync.md +58 -142
  19. package/knowledge/1.0/apps/library/features/netsuite-item-isfulfillable-sync.md +39 -147
  20. package/knowledge/1.0/apps/library/features/netsuite-suiteql-api-reference.md +116 -381
  21. package/knowledge/1.0/apps/library/features/netsuite-suiteql-rest-shim.md +71 -451
  22. package/knowledge/1.0/apps/library/features/netsuite-sync-alert-monitor.md +25 -104
  23. package/knowledge/1.0/apps/library/features/startech-pcmaticb2b-sync.md +24 -56
  24. package/knowledge/1.0/apps/library/features/toga2-api-client-and-bridge.md +97 -489
  25. package/knowledge/1.0/apps/store/INDEX.md +2 -2
  26. package/knowledge/1.0/apps/store/architecture.md +13 -33
  27. package/knowledge/1.0/apps/store/features/saml-sso-certificate-and-keys.md +31 -116
  28. package/knowledge/1.0/apps/test/INDEX.md +16 -16
  29. package/knowledge/1.0/apps/test/architecture.md +15 -38
  30. package/knowledge/1.0/apps/test/features/2-0-deployment-client-sql.md +11 -17
  31. package/knowledge/1.0/apps/test/features/active-directory-auth-test.md +8 -12
  32. package/knowledge/1.0/apps/test/features/compass-retrofix2-sql-generator.md +39 -63
  33. package/knowledge/1.0/apps/test/features/create-elastic-beanstalk.md +22 -49
  34. package/knowledge/1.0/apps/test/features/dev-generators.md +12 -17
  35. package/knowledge/1.0/apps/test/features/forecast-netsuite-discrepancy-analysis.md +11 -20
  36. package/knowledge/1.0/apps/test/features/github-audit-script.md +13 -31
  37. package/knowledge/1.0/apps/test/features/goagilant-to-togatech-email-migration.md +28 -63
  38. package/knowledge/1.0/apps/test/features/static-no-db-regression-harness.md +44 -99
  39. package/knowledge/1.0/apps/test/features/tableview-builder.md +10 -17
  40. package/knowledge/1.0/apps/test/features/talos-kb-pipeline.md +38 -84
  41. package/knowledge/1.0/apps/test/features/toga2-client-onboarding-sql.md +17 -43
  42. package/knowledge/1.0/apps/test/features/toga2-onboarding-wizard.md +29 -66
  43. package/knowledge/1.0/apps/test/features/toga2-user-cross-client-access-sql.md +11 -16
  44. package/knowledge/1.0/apps/test/features/url-domain-markdown-document.md +10 -16
  45. package/knowledge/1.0/apps/toga/INDEX.md +2 -2
  46. package/knowledge/1.0/apps/toga/features/bundleconfirmation-cart-preservation.md +11 -23
  47. package/knowledge/1.0/apps/toga/features/odp-customer-search-loyalty-persistence.md +19 -57
  48. package/knowledge/1.0/apps/togadesk/INDEX.md +12 -12
  49. package/knowledge/1.0/apps/togadesk/architecture.md +44 -121
  50. package/knowledge/1.0/apps/togadesk/features/email-to-ticket-intake.md +42 -123
  51. package/knowledge/1.0/apps/togadesk/features/field-service-dispatch.md +37 -127
  52. package/knowledge/1.0/apps/togadesk/features/managed-service-order-create.md +37 -128
  53. package/knowledge/1.0/apps/togadesk/features/notifications.md +18 -63
  54. package/knowledge/1.0/apps/togadesk/features/per-client-host-restriction.md +26 -107
  55. package/knowledge/1.0/apps/togadesk/features/rest-api.md +27 -42
  56. package/knowledge/1.0/apps/togadesk/features/smb-contract-editing.md +23 -39
  57. package/knowledge/1.0/apps/togadesk/features/staff-login-authentication.md +22 -58
  58. package/knowledge/1.0/apps/togadesk/features/ticket-lifecycle.md +38 -120
  59. package/knowledge/1.0/apps/togadesk/workflows/production-revert-forward.md +21 -35
  60. package/knowledge/1.0/apps/togadesk/workflows/standalone-test-scripts.md +15 -42
  61. package/knowledge/1.0/apps/togaview/INDEX.md +8 -7
  62. package/knowledge/1.0/apps/togaview/architecture.md +48 -127
  63. package/knowledge/1.0/apps/togaview/features/login-flows.md +45 -141
  64. package/knowledge/1.0/apps/togaview/features/msp-dashboard.md +19 -35
  65. package/knowledge/1.0/apps/togaview/features/retail-commerce-lifecycle.md +25 -43
  66. package/knowledge/1.0/apps/togaview/features/ticket-detail-page.md +38 -134
  67. package/knowledge/1.0/apps/togaview/features/ticket-export.md +61 -0
  68. package/knowledge/1.0/apps/togaview/workflows/git-and-php-tooling-under-the-underscore-app-root.md +15 -26
  69. package/knowledge/1.0/apps/togaview/workflows/route53-cross-account-zone-migration.md +16 -42
  70. package/knowledge/1.0/apps/tools/INDEX.md +16 -16
  71. package/knowledge/1.0/apps/tools/architecture.md +28 -180
  72. package/knowledge/1.0/apps/tools/features/clickup-label-aliases-admin.md +35 -78
  73. package/knowledge/1.0/apps/tools/features/clickup-sprint-dashboard.md +49 -209
  74. package/knowledge/1.0/apps/tools/features/cloudfront-client-setup.md +36 -125
  75. package/knowledge/1.0/apps/tools/features/design-demo-admin.md +45 -150
  76. package/knowledge/1.0/apps/tools/features/developer-tools.md +15 -28
  77. package/knowledge/1.0/apps/tools/features/errors-curation-console.md +85 -345
  78. package/knowledge/1.0/apps/tools/features/github-audit.md +35 -124
  79. package/knowledge/1.0/apps/tools/features/legacy-email-notifier.md +26 -80
  80. package/knowledge/1.0/apps/tools/features/mvc-data-access-patterns.md +62 -151
  81. package/knowledge/1.0/apps/tools/features/oneuptime-monitor-status-panel.md +52 -243
  82. package/knowledge/1.0/apps/tools/features/persona-gated-navigation.md +21 -45
  83. package/knowledge/1.0/apps/tools/features/saml-sso-auth.md +50 -156
  84. package/knowledge/1.0/apps/tools/features/talos-kb-documents-admin.md +82 -422
  85. package/knowledge/1.0/apps/tools/features/theme-light-dark.md +44 -130
  86. package/knowledge/1.0/apps/tools/workflows/deploy-to-elastic-beanstalk-al2023.md +55 -233
  87. package/knowledge/1.0/apps/walmarttechservices/INDEX.md +1 -1
  88. package/knowledge/1.0/apps/walmarttechservices/architecture.md +32 -81
  89. package/knowledge/1.0/apps/webhook/INDEX.md +1 -1
  90. package/knowledge/1.0/apps/webhook/features/netsuite-clickup-opportunity-sync.md +51 -174
  91. package/knowledge/1.0/apps/worker/INDEX.md +17 -17
  92. package/knowledge/1.0/apps/worker/architecture.md +64 -166
  93. package/knowledge/1.0/apps/worker/features/canon-received-po-netsuite-order-sync.md +10 -12
  94. package/knowledge/1.0/apps/worker/features/compass-ma-sales-order-exception-report.md +10 -27
  95. package/knowledge/1.0/apps/worker/features/compass-manager-approval-reminder-emails.md +11 -11
  96. package/knowledge/1.0/apps/worker/features/elite-togadesk-attachment-sync.md +16 -9
  97. package/knowledge/1.0/apps/worker/features/forecast2-netsuite-reconciliation.md +10 -212
  98. package/knowledge/1.0/apps/worker/features/forecast2-supporting-records-import.md +13 -24
  99. package/knowledge/1.0/apps/worker/features/netsuite-sales-order-sales-rep-sourcing.md +8 -9
  100. package/knowledge/1.0/apps/worker/features/oneuptime-server-monitor-host-hygiene.md +12 -15
  101. package/knowledge/1.0/apps/worker/features/oneuptime-worker-uptime-monitoring.md +14 -16
  102. package/knowledge/1.0/apps/worker/features/send-shipments-for-the-day.md +11 -7
  103. package/knowledge/1.0/apps/worker/features/staples-cxml-order-import.md +11 -11
  104. package/knowledge/1.0/apps/worker/workflows/diagnosing-frozen-cron-checkins.md +23 -70
  105. package/knowledge/1.0/apps/worker/workflows/isfulfillable-multi-client-backfill.md +26 -82
  106. package/knowledge/1.0/apps/worker/workflows/netsuite-duplicate-items-dedup.md +28 -111
  107. package/knowledge/1.0/apps/worker/workflows/onboarding-client-to-netsuite-togasupply-sync.md +41 -173
  108. package/knowledge/1.0/apps/worker/workflows/tracing-a-worker-cron-run-in-production.md +63 -184
  109. package/knowledge/1.0/standards/backend-php.md +193 -343
  110. package/knowledge/1.0/standards/framework-rules.md +25 -52
  111. package/knowledge/1.0/standards/frontend.md +30 -92
  112. package/knowledge/2.0/apps/_underscore/INDEX.md +55 -55
  113. package/knowledge/2.0/apps/_underscore/architecture/surface-authoring-proposal.md +3 -1
  114. package/knowledge/2.0/apps/_underscore/architecture.md +4 -14
  115. package/knowledge/2.0/apps/_underscore/features/address-uniqueness-normalization.md +34 -67
  116. package/knowledge/2.0/apps/_underscore/features/address-validation.md +55 -130
  117. package/knowledge/2.0/apps/_underscore/features/apirequest-json-content-type.md +9 -47
  118. package/knowledge/2.0/apps/_underscore/features/assortment-name-translation.md +19 -63
  119. package/knowledge/2.0/apps/_underscore/features/async-query-execution.md +37 -86
  120. package/knowledge/2.0/apps/_underscore/features/autoincrement-record-numbering.md +22 -72
  121. package/knowledge/2.0/apps/_underscore/features/calculated-column-filter-options.md +11 -11
  122. package/knowledge/2.0/apps/_underscore/features/carrier-shipping-labels.md +22 -86
  123. package/knowledge/2.0/apps/_underscore/features/cli-script-bootstrap.md +5 -13
  124. package/knowledge/2.0/apps/_underscore/features/cloud-s3-helpers.md +21 -60
  125. package/knowledge/2.0/apps/_underscore/features/cloud-secrets-manager.md +19 -43
  126. package/knowledge/2.0/apps/_underscore/features/component-model-namespace-registration.md +14 -37
  127. package/knowledge/2.0/apps/_underscore/features/config-group-access.md +16 -30
  128. package/knowledge/2.0/apps/_underscore/features/core-domains-app-host-registry.md +16 -19
  129. package/knowledge/2.0/apps/_underscore/features/effective-persona-resolution.md +9 -9
  130. package/knowledge/2.0/apps/_underscore/features/error-reporting-issue-event.md +117 -317
  131. package/knowledge/2.0/apps/_underscore/features/event-publish-sqs.md +7 -8
  132. package/knowledge/2.0/apps/_underscore/features/field-storage-row-hydration.md +13 -14
  133. package/knowledge/2.0/apps/_underscore/features/forecast-sale-import.md +31 -198
  134. package/knowledge/2.0/apps/_underscore/features/fulfillable-item-propagation.md +14 -35
  135. package/knowledge/2.0/apps/_underscore/features/item-classification-itemclasses.md +18 -24
  136. package/knowledge/2.0/apps/_underscore/features/item-fulfillment-stage-lifecycle-and-order-status.md +14 -42
  137. package/knowledge/2.0/apps/_underscore/features/model-interceptor-unit-testing.md +13 -24
  138. package/knowledge/2.0/apps/_underscore/features/model-magic-field-access.md +12 -38
  139. package/knowledge/2.0/apps/_underscore/features/model-save-parent-cascade-stored-field-deadlock.md +36 -84
  140. package/knowledge/2.0/apps/_underscore/features/model-save-vs-query-atomic-update.md +28 -77
  141. package/knowledge/2.0/apps/_underscore/features/netsuite-rest-client.md +78 -307
  142. package/knowledge/2.0/apps/_underscore/features/netsuite-salesorder-address-phone-sync.md +38 -88
  143. package/knowledge/2.0/apps/_underscore/features/note-record-authorship.md +22 -51
  144. package/knowledge/2.0/apps/_underscore/features/outbound-api-rate-budget.md +40 -138
  145. package/knowledge/2.0/apps/_underscore/features/page-meta-context-field-settings.md +35 -186
  146. package/knowledge/2.0/apps/_underscore/features/per-client-database-connections.md +39 -238
  147. package/knowledge/2.0/apps/_underscore/features/persona-name-translation.md +44 -142
  148. package/knowledge/2.0/apps/_underscore/features/record-change-audit-log.md +42 -147
  149. package/knowledge/2.0/apps/_underscore/features/recursive-item-fulfillments.md +38 -163
  150. package/knowledge/2.0/apps/_underscore/features/sales-order-denial-reason.md +81 -299
  151. package/knowledge/2.0/apps/_underscore/features/sales-order-po-number-sourcing.md +25 -86
  152. package/knowledge/2.0/apps/_underscore/features/sales-order-purchase-order-bridge-direction.md +28 -91
  153. package/knowledge/2.0/apps/_underscore/features/sales-order-status-filter-surface.md +40 -82
  154. package/knowledge/2.0/apps/_underscore/features/shipping-carriers-and-accounts.md +37 -98
  155. package/knowledge/2.0/apps/_underscore/features/string-html-entity-helpers.md +23 -59
  156. package/knowledge/2.0/apps/_underscore/features/surface-field-recordfield-binding.md +54 -150
  157. package/knowledge/2.0/apps/_underscore/features/surface-resolver.md +209 -851
  158. package/knowledge/2.0/apps/_underscore/features/tableview-hyperlink-columns.md +50 -85
  159. package/knowledge/2.0/apps/_underscore/features/tableview-joins.md +118 -324
  160. package/knowledge/2.0/apps/_underscore/features/togaiq-gateway-client.md +45 -105
  161. package/knowledge/2.0/apps/_underscore/features/tracking-number-bridges.md +45 -249
  162. package/knowledge/2.0/apps/_underscore/features/units-for-items-for-purchase-orders.md +48 -156
  163. package/knowledge/2.0/apps/_underscore/features/user-email-as-identity-and-password-reset.md +26 -56
  164. package/knowledge/2.0/apps/_underscore/features/usps-dpv-deliverability.md +29 -53
  165. package/knowledge/2.0/apps/_underscore/workflows/local-db-refresh-from-beta.md +23 -99
  166. package/knowledge/2.0/apps/_underscore/workflows/recreated-shared-branch-stale-local-remerge.md +38 -91
  167. package/knowledge/2.0/apps/_underscore/workflows/running-a-2.0-app-locally.md +28 -102
  168. package/knowledge/2.0/apps/ai-bdr/INDEX.md +13 -13
  169. package/knowledge/2.0/apps/ai-bdr/architecture.md +31 -100
  170. package/knowledge/2.0/apps/ai-bdr/features/bdr-web-funnel-plan.md +128 -460
  171. package/knowledge/2.0/apps/ai-bdr/features/call-orchestration.md +55 -121
  172. package/knowledge/2.0/apps/ai-bdr/features/campaign-chat-handoff.md +68 -169
  173. package/knowledge/2.0/apps/ai-bdr/features/landing-call-flow.md +75 -188
  174. package/knowledge/2.0/apps/ai-bdr/features/landing-chat-drawer.md +78 -249
  175. package/knowledge/2.0/apps/ai-bdr/features/live-call-status.md +46 -104
  176. package/knowledge/2.0/apps/ai-bdr/features/security-landing-page.md +82 -266
  177. package/knowledge/2.0/apps/ai-bdr/features/vapi-integration.md +42 -108
  178. package/knowledge/2.0/apps/ai-bdr/features/web-funnel-app.md +213 -879
  179. package/knowledge/2.0/apps/ai-bdr/features/web-funnel-content-model.md +63 -194
  180. package/knowledge/2.0/apps/ai-bdr/workflows/new-campaign-onboarding.md +51 -88
  181. package/knowledge/2.0/apps/ai-bdr/workflows/safe-call-loop-testing.md +60 -187
  182. package/knowledge/2.0/apps/api2/INDEX.md +23 -23
  183. package/knowledge/2.0/apps/api2/features/api-key-authentication-and-scoping.md +32 -77
  184. package/knowledge/2.0/apps/api2/features/api-payload-interceptors.md +166 -652
  185. package/knowledge/2.0/apps/api2/features/cross-client-data-retrieval.md +63 -282
  186. package/knowledge/2.0/apps/api2/features/cxml-shipnotice-gateway.md +57 -151
  187. package/knowledge/2.0/apps/api2/features/encrypted-user-uuid-auth-handoff.md +22 -45
  188. package/knowledge/2.0/apps/api2/features/environment-variable-drives-underscore-branch.md +57 -339
  189. package/knowledge/2.0/apps/api2/features/health-check-endpoint.md +27 -64
  190. package/knowledge/2.0/apps/api2/features/language-translation-layer.md +57 -283
  191. package/knowledge/2.0/apps/api2/features/login-cross-client-user-resolution.md +18 -59
  192. package/knowledge/2.0/apps/api2/features/nested-fk-acl-embedding.md +24 -84
  193. package/knowledge/2.0/apps/api2/features/nested-relationship-writes.md +86 -474
  194. package/knowledge/2.0/apps/api2/features/record-scripts.md +58 -344
  195. package/knowledge/2.0/apps/api2/features/request-logging.md +119 -436
  196. package/knowledge/2.0/apps/api2/features/scripted-api-post-body-args.md +30 -59
  197. package/knowledge/2.0/apps/api2/features/sprint-dashboard-api.md +30 -93
  198. package/knowledge/2.0/apps/api2/features/surface-meta-option.md +19 -91
  199. package/knowledge/2.0/apps/api2/features/tableview-field-metadata.md +59 -274
  200. package/knowledge/2.0/apps/api2/features/tickets-api.md +21 -47
  201. package/knowledge/2.0/apps/api2/features/v2-api-error-codes.md +79 -353
  202. package/knowledge/2.0/apps/api2/features/v2-deadlock-retry.md +50 -188
  203. package/knowledge/2.0/apps/api2/features/v2-reverse-hasmany-fields-whitelist.md +15 -51
  204. package/knowledge/2.0/apps/api2/workflows/codepipeline-codeconnections-deploy.md +65 -294
  205. package/knowledge/2.0/apps/api2/workflows/environment-configuration-and-provisioning.md +40 -123
  206. package/knowledge/2.0/apps/dbchanges2/INDEX.md +10 -10
  207. package/knowledge/2.0/apps/dbchanges2/architecture.md +104 -402
  208. package/knowledge/2.0/apps/dbchanges2/features/surface-layer-schema.md +401 -1543
  209. package/knowledge/2.0/apps/dbchanges2/workflows/client-onboarding.md +31 -80
  210. package/knowledge/2.0/apps/dbchanges2/workflows/client-schema-drift-audit.md +92 -265
  211. package/knowledge/2.0/apps/dbchanges2/workflows/deleting-contacts-from-a-client-database.md +23 -50
  212. package/knowledge/2.0/apps/dbchanges2/workflows/framework-branch-ahead-of-schema.md +67 -177
  213. package/knowledge/2.0/apps/dbchanges2/workflows/local-vs-prod-mysql-config-parity.md +31 -76
  214. package/knowledge/2.0/apps/dbchanges2/workflows/nonprod-metadata-drift-repair.md +99 -316
  215. package/knowledge/2.0/apps/dbchanges2/workflows/targeting-the-right-database.md +45 -155
  216. package/knowledge/2.0/apps/dbchanges2/workflows/verifying-a-migration-ran.md +16 -33
  217. package/knowledge/2.0/apps/saml/INDEX.md +6 -6
  218. package/knowledge/2.0/apps/saml/architecture.md +22 -42
  219. package/knowledge/2.0/apps/saml/features/downstream-integration-contract.md +19 -33
  220. package/knowledge/2.0/apps/saml/features/healthcheck-endpoint.md +31 -97
  221. package/knowledge/2.0/apps/saml/features/rate-user-provisioning.md +10 -9
  222. package/knowledge/2.0/apps/saml/workflows/onboarding-a-new-sso-client.md +23 -63
  223. package/knowledge/2.0/apps/saml/workflows/rotating-the-saml-sp-certificate.md +72 -193
  224. package/knowledge/2.0/apps/talos/INDEX.md +6 -6
  225. package/knowledge/2.0/apps/talos/features/aegra-api.md +66 -153
  226. package/knowledge/2.0/apps/talos/features/chat-frontend.md +39 -96
  227. package/knowledge/2.0/apps/talos/features/deployment.md +29 -53
  228. package/knowledge/2.0/apps/talos/features/mcp-servers.md +39 -75
  229. package/knowledge/2.0/apps/talos/features/observability.md +34 -62
  230. package/knowledge/2.0/apps/talos/features/talos-agent.md +56 -95
  231. package/knowledge/2.0/apps/talos-backend/INDEX.md +1 -1
  232. package/knowledge/2.0/apps/talos-backend/workflows/toga-supply-client-onboarding.md +59 -149
  233. package/knowledge/2.0/apps/toga-blox/INDEX.md +14 -14
  234. package/knowledge/2.0/apps/toga-blox/architecture.md +25 -56
  235. package/knowledge/2.0/apps/toga-blox/features/add-notes-template.md +20 -40
  236. package/knowledge/2.0/apps/toga-blox/features/advanced-select.md +23 -49
  237. package/knowledge/2.0/apps/toga-blox/features/api-client.md +36 -143
  238. package/knowledge/2.0/apps/toga-blox/features/base-input.md +20 -35
  239. package/knowledge/2.0/apps/toga-blox/features/blox-authoring-defects.md +61 -178
  240. package/knowledge/2.0/apps/toga-blox/features/primary-table-templates.md +59 -179
  241. package/knowledge/2.0/apps/toga-blox/features/table-record-modal.md +32 -58
  242. package/knowledge/2.0/apps/toga-blox/features/table.md +50 -215
  243. package/knowledge/2.0/apps/toga-blox/features/talos-assistant.md +74 -303
  244. package/knowledge/2.0/apps/toga-blox/features/toaster.md +20 -56
  245. package/knowledge/2.0/apps/toga-blox/workflows/dynamic-publish-pipeline.md +49 -272
  246. package/knowledge/2.0/apps/toga-blox/workflows/landing-a-large-feature-branch.md +21 -60
  247. package/knowledge/2.0/apps/toga-blox/workflows/local-link-into-a-consumer-app.md +65 -254
  248. package/knowledge/2.0/apps/toga2-commerce/INDEX.md +14 -14
  249. package/knowledge/2.0/apps/toga2-commerce/features/bundle-item-visibility-and-selectability.md +51 -128
  250. package/knowledge/2.0/apps/toga2-commerce/features/cart-bundle-submission-and-identity.md +23 -61
  251. package/knowledge/2.0/apps/toga2-commerce/features/cart-order-total-computation.md +17 -30
  252. package/knowledge/2.0/apps/toga2-commerce/features/cart-page-config-architecture.md +81 -221
  253. package/knowledge/2.0/apps/toga2-commerce/features/catalog-cache-freshness.md +53 -168
  254. package/knowledge/2.0/apps/toga2-commerce/features/category-tile-sort-order.md +27 -78
  255. package/knowledge/2.0/apps/toga2-commerce/features/expedited-shipping-gating.md +29 -110
  256. package/knowledge/2.0/apps/toga2-commerce/features/filter-search-results-page.md +27 -80
  257. package/knowledge/2.0/apps/toga2-commerce/features/inactive-item-purchase-gating.md +46 -135
  258. package/knowledge/2.0/apps/toga2-commerce/features/multi-tenant-theming.md +36 -62
  259. package/knowledge/2.0/apps/toga2-commerce/features/order-submit-sync-sequencing.md +38 -102
  260. package/knowledge/2.0/apps/toga2-commerce/features/shipping-cost-waiver-gating.md +28 -64
  261. package/knowledge/2.0/apps/toga2-commerce/workflows/amplify-build-and-deploy.md +52 -188
  262. package/knowledge/2.0/apps/toga2-commerce/workflows/http2-protocol-error-diagnosis.md +36 -53
  263. package/knowledge/2.0/apps/toga2-hub/INDEX.md +2 -2
  264. package/knowledge/2.0/apps/toga2-hub/architecture.md +36 -85
  265. package/knowledge/2.0/apps/toga2-hub/features/acl-permissions-rendering.md +51 -85
  266. package/knowledge/2.0/apps/toga2-supply/INDEX.md +8 -8
  267. package/knowledge/2.0/apps/toga2-supply/architecture.md +20 -36
  268. package/knowledge/2.0/apps/toga2-supply/features/currency-amount-lines-editor.md +63 -156
  269. package/knowledge/2.0/apps/toga2-supply/features/fulfill-and-ship.md +203 -942
  270. package/knowledge/2.0/apps/toga2-supply/features/order-detail-field-config-and-customer-name.md +38 -99
  271. package/knowledge/2.0/apps/toga2-supply/features/table-data-additional-filters.md +22 -54
  272. package/knowledge/2.0/apps/toga2-supply/workflows/amplify-build-and-deploy.md +29 -89
  273. package/knowledge/2.0/apps/toga2-supply/workflows/client-host-scoping.md +79 -215
  274. package/knowledge/2.0/apps/toga2-supply/workflows/onboarding-a-client-to-fulfill-and-ship.md +29 -37
  275. package/knowledge/2.0/apps/toga2-view/INDEX.md +9 -9
  276. package/knowledge/2.0/apps/toga2-view/architecture.md +33 -98
  277. package/knowledge/2.0/apps/toga2-view/features/get-support-cancel-subscription.md +42 -132
  278. package/knowledge/2.0/apps/toga2-view/features/mobile-nav-header.md +15 -14
  279. package/knowledge/2.0/apps/toga2-view/features/property-questions-eligibility.md +15 -39
  280. package/knowledge/2.0/apps/toga2-view/features/query-string-builder.md +19 -39
  281. package/knowledge/2.0/apps/toga2-view/features/reference-dropdown-sorting.md +16 -32
  282. package/knowledge/2.0/apps/toga2-view/features/service-card.md +21 -24
  283. package/knowledge/2.0/apps/toga2-view/features/terms-and-conditions-page.md +18 -56
  284. package/knowledge/2.0/apps/toga2-view/features/zip-validation-contact-phone.md +11 -23
  285. package/knowledge/2.0/apps/toga25-supply/INDEX.md +19 -19
  286. package/knowledge/2.0/apps/toga25-supply/architecture.md +34 -103
  287. package/knowledge/2.0/apps/toga25-supply/features/action-button-rule-engine.md +30 -119
  288. package/knowledge/2.0/apps/toga25-supply/features/client-api-fetch-fields.md +25 -87
  289. package/knowledge/2.0/apps/toga25-supply/features/client-configurable-fields.md +37 -162
  290. package/knowledge/2.0/apps/toga25-supply/features/column-visibility.md +57 -177
  291. package/knowledge/2.0/apps/toga25-supply/features/force-logout-on-deployment.md +10 -47
  292. package/knowledge/2.0/apps/toga25-supply/features/meta-driven-table-data.md +39 -119
  293. package/knowledge/2.0/apps/toga25-supply/features/persisted-query-cache.md +34 -94
  294. package/knowledge/2.0/apps/toga25-supply/features/record-modals-and-nested-tables.md +85 -365
  295. package/knowledge/2.0/apps/toga25-supply/features/server-table-url-state.md +30 -83
  296. package/knowledge/2.0/apps/toga25-supply/features/side-navigation-and-default-route.md +20 -64
  297. package/knowledge/2.0/apps/toga25-supply/features/sso-redirect-and-session-gating.md +16 -71
  298. package/knowledge/2.0/apps/toga25-supply/features/surface-frontend.md +323 -1383
  299. package/knowledge/2.0/apps/toga25-supply/features/talos-integration.md +67 -272
  300. package/knowledge/2.0/apps/toga25-supply/features/toolbar-button-chrome.md +20 -59
  301. package/knowledge/2.0/apps/toga25-supply/features/transfer-orders-page.md +328 -1004
  302. package/knowledge/2.0/apps/toga25-supply/workflows/amplify-deployment.md +46 -222
  303. package/knowledge/2.0/apps/toga25-supply/workflows/cypress-testing.md +116 -349
  304. package/knowledge/2.0/apps/toga25-supply/workflows/porting-a-page-from-toga2-supply.md +16 -47
  305. package/knowledge/2.0/apps/voice-to-voice/INDEX.md +4 -4
  306. package/knowledge/2.0/apps/voice-to-voice/architecture.md +33 -78
  307. package/knowledge/2.0/apps/voice-to-voice/features/livekit-pipeline.md +44 -71
  308. package/knowledge/2.0/apps/voice-to-voice/features/post-call-lambda.md +40 -71
  309. package/knowledge/2.0/apps/voice-to-voice/features/ticket-api-integration.md +55 -101
  310. package/knowledge/2.0/apps/worker2/INDEX.md +58 -58
  311. package/knowledge/2.0/apps/worker2/architecture.md +55 -248
  312. package/knowledge/2.0/apps/worker2/features/alb-target-group-auto-registration.md +47 -153
  313. package/knowledge/2.0/apps/worker2/features/all-client-email-queue-monitor.md +46 -136
  314. package/knowledge/2.0/apps/worker2/features/api-stability-monitor.md +36 -116
  315. package/knowledge/2.0/apps/worker2/features/automated-pr-merger-force-push-race.md +23 -38
  316. package/knowledge/2.0/apps/worker2/features/callback-scheduling.md +100 -199
  317. package/knowledge/2.0/apps/worker2/features/clickup-connectivity-watchdog.md +17 -50
  318. package/knowledge/2.0/apps/worker2/features/clickup-custom-field-conventions.md +16 -26
  319. package/knowledge/2.0/apps/worker2/features/clickup-design-sprint-automation.md +52 -241
  320. package/knowledge/2.0/apps/worker2/features/clickup-general-automation.md +16 -32
  321. package/knowledge/2.0/apps/worker2/features/clickup-github-autolink.md +11 -21
  322. package/knowledge/2.0/apps/worker2/features/clickup-project-routing.md +58 -202
  323. package/knowledge/2.0/apps/worker2/features/clickup-richtext-api.md +22 -41
  324. package/knowledge/2.0/apps/worker2/features/clickup-subtask-activity.md +30 -79
  325. package/knowledge/2.0/apps/worker2/features/clickup-task-fluffer-talos.md +39 -106
  326. package/knowledge/2.0/apps/worker2/features/clickup-work-type-automation.md +20 -63
  327. package/knowledge/2.0/apps/worker2/features/compass-vip-support-importer.md +37 -119
  328. package/knowledge/2.0/apps/worker2/features/cross-account-aws-access.md +78 -209
  329. package/knowledge/2.0/apps/worker2/features/elastic-beanstalk-health-monitor.md +95 -278
  330. package/knowledge/2.0/apps/worker2/features/elite-freshservice-sync.md +66 -96
  331. package/knowledge/2.0/apps/worker2/features/error-escalation-cron.md +118 -420
  332. package/knowledge/2.0/apps/worker2/features/error-issue-auto-resolution.md +53 -150
  333. package/knowledge/2.0/apps/worker2/features/etilize-catalog-item-import.md +42 -78
  334. package/knowledge/2.0/apps/worker2/features/etilize-item-translation-import.md +41 -75
  335. package/knowledge/2.0/apps/worker2/features/monitoring-framework.md +64 -172
  336. package/knowledge/2.0/apps/worker2/features/netsuite-clickup-opportunity-bidirectional-design.md +33 -87
  337. package/knowledge/2.0/apps/worker2/features/netsuite-integrations-monitor.md +37 -97
  338. package/knowledge/2.0/apps/worker2/features/netsuite-item-client-routing.md +39 -88
  339. package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-client-labels.md +94 -323
  340. package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-sync.md +208 -979
  341. package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-open-orders-sync.md +62 -181
  342. package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-outbound-push.md +123 -170
  343. package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-backfill-worker.md +51 -76
  344. package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-webhook-importer.md +73 -122
  345. package/knowledge/2.0/apps/worker2/features/netsuite-transferorder-outbound-push.md +131 -449
  346. package/knowledge/2.0/apps/worker2/features/notification-email-template.md +37 -97
  347. package/knowledge/2.0/apps/worker2/features/notification-email.md +49 -140
  348. package/knowledge/2.0/apps/worker2/features/nychh-asset-tag-backfill.md +35 -62
  349. package/knowledge/2.0/apps/worker2/features/oneuptime-incident-clickup-sync.md +52 -138
  350. package/knowledge/2.0/apps/worker2/features/platform-cache-cleanup.md +50 -61
  351. package/knowledge/2.0/apps/worker2/features/qa-qc-branch-automation.md +42 -52
  352. package/knowledge/2.0/apps/worker2/features/qa-qc-review-pipeline.md +56 -66
  353. package/knowledge/2.0/apps/worker2/features/s3-folder-retention-cleanup.md +58 -74
  354. package/knowledge/2.0/apps/worker2/features/service-request-sales-order-generation.md +62 -175
  355. package/knowledge/2.0/apps/worker2/features/sso-stability-monitor.md +29 -69
  356. package/knowledge/2.0/apps/worker2/features/startech-webhook-handler.md +24 -33
  357. package/knowledge/2.0/apps/worker2/features/talos-meeting-notes-integration.md +35 -70
  358. package/knowledge/2.0/apps/worker2/features/talos-transcript-ingestion.md +319 -431
  359. package/knowledge/2.0/apps/worker2/features/team-sprint-management.md +244 -303
  360. package/knowledge/2.0/apps/worker2/features/teams-transcript-export.md +128 -173
  361. package/knowledge/2.0/apps/worker2/features/tracking-status-refresh.md +103 -124
  362. package/knowledge/2.0/apps/worker2/features/vapi-webhook-handler.md +198 -277
  363. package/knowledge/2.0/apps/worker2/features/wje-freshservice-sync.md +16 -21
  364. package/knowledge/2.0/apps/worker2/features/worker-fleet-role-assignment-monitor.md +97 -105
  365. package/knowledge/2.0/apps/worker2/workflows/clickup-credential-rotation.md +47 -52
  366. package/knowledge/2.0/apps/worker2/workflows/php-runtime-upgrade-dependency-audit.md +112 -120
  367. package/knowledge/2.0/apps/worker2/workflows/running-worker2-locally.md +88 -124
  368. package/knowledge/2.0/apps/worker2/workflows/ticket-to-pseudocode-planning.md +52 -49
  369. package/knowledge/2.0/standards/backend-php.md +23 -99
  370. package/knowledge/2.0/standards/backend-testing.md +29 -93
  371. package/knowledge/2.0/standards/framework-rules.md +10 -47
  372. package/knowledge/2.0/standards/frontend-deploy.md +13 -34
  373. package/knowledge/2.0/standards/frontend.md +40 -111
  374. package/knowledge/2.0/standards/python.md +33 -76
  375. package/knowledge/2.0/standards/ssl-certificate-trust-model.md +20 -71
  376. package/knowledge/INDEX.md +1 -1
  377. package/knowledge/clients/adyen/INDEX.md +1 -1
  378. package/knowledge/clients/adyen/profile.md +38 -90
  379. package/knowledge/clients/aig/INDEX.md +3 -3
  380. package/knowledge/clients/aig/features/contract-reconciliation.md +55 -123
  381. package/knowledge/clients/aig/features/entitlement-intake.md +165 -536
  382. package/knowledge/clients/aig/profile.md +10 -22
  383. package/knowledge/clients/canon/INDEX.md +1 -1
  384. package/knowledge/clients/canon/profile.md +9 -17
  385. package/knowledge/clients/compass-canada/INDEX.md +6 -6
  386. package/knowledge/clients/compass-canada/features/french-item-feature-translations.md +21 -55
  387. package/knowledge/clients/compass-canada/features/french-order-email-localization.md +83 -306
  388. package/knowledge/clients/compass-canada/features/grand-and-toy-asn-import.md +70 -302
  389. package/knowledge/clients/compass-canada/features/item-fulfillment-tableviews.md +42 -104
  390. package/knowledge/clients/compass-canada/features/order-fulfillment-status-per-line.md +52 -178
  391. package/knowledge/clients/compass-canada/workflows/grand-and-toy-asn-backfill.md +30 -104
  392. package/knowledge/clients/compass-usa/INDEX.md +30 -30
  393. package/knowledge/clients/compass-usa/features/approval-decision-flow.md +110 -570
  394. package/knowledge/clients/compass-usa/features/asn-to-item-fulfillment.md +56 -332
  395. package/knowledge/clients/compass-usa/features/contact-email-resolution.md +38 -94
  396. package/knowledge/clients/compass-usa/features/cost-centers.md +32 -114
  397. package/knowledge/clients/compass-usa/features/isfulfillable-data-quality-and-type-rule.md +56 -197
  398. package/knowledge/clients/compass-usa/features/item-catalogs-and-duplicate-items.md +52 -243
  399. package/knowledge/clients/compass-usa/features/item-fulfillment-tracking-tableview.md +30 -91
  400. package/knowledge/clients/compass-usa/features/mits-po-to-so-item-linking.md +51 -273
  401. package/knowledge/clients/compass-usa/features/mits-po-transmission-to-vendors.md +29 -112
  402. package/knowledge/clients/compass-usa/features/mits-po-zero-line-item-rejection.md +45 -124
  403. package/knowledge/clients/compass-usa/features/mits-sales-order-transmission-alerting.md +67 -213
  404. package/knowledge/clients/compass-usa/features/mr-ma-order-approval-and-status.md +50 -188
  405. package/knowledge/clients/compass-usa/features/odp-edi-850-item-resolution.md +63 -230
  406. package/knowledge/clients/compass-usa/features/odp-edi-855-acknowledgement-and-overquantity-guard.md +48 -166
  407. package/knowledge/clients/compass-usa/features/odp-edi-file-retention-and-retry.md +39 -121
  408. package/knowledge/clients/compass-usa/features/oneuptime-ma-refresh-order-monitor.md +33 -97
  409. package/knowledge/clients/compass-usa/features/order-fulfillment-status-per-line.md +68 -196
  410. package/knowledge/clients/compass-usa/features/sales-order-line-renumbering.md +29 -116
  411. package/knowledge/clients/compass-usa/features/stranded-approval-reassignment.md +50 -164
  412. package/knowledge/clients/compass-usa/workflows/catalog-fold-reversal.md +56 -259
  413. package/knowledge/clients/compass-usa/workflows/changing-a-kit-line-item.md +40 -117
  414. package/knowledge/clients/compass-usa/workflows/cross-kit-bundle-corruption.md +35 -71
  415. package/knowledge/clients/compass-usa/workflows/granting-api-access.md +43 -111
  416. package/knowledge/clients/compass-usa/workflows/granting-navigation-access.md +54 -206
  417. package/knowledge/clients/compass-usa/workflows/granting-persona-bundle-access.md +37 -140
  418. package/knowledge/clients/compass-usa/workflows/odp-duplicate-po-line-cleanup.md +34 -76
  419. package/knowledge/clients/compass-usa/workflows/odp-edi-import-recovery.md +33 -114
  420. package/knowledge/clients/compass-usa/workflows/odp-order-pipeline-to-netsuite.md +71 -371
  421. package/knowledge/clients/compass-usa/workflows/order-lifecycle-and-data-integrity.md +56 -172
  422. package/knowledge/clients/compass-usa/workflows/persona-population-env-comparison.md +20 -54
  423. package/knowledge/clients/elite/INDEX.md +4 -4
  424. package/knowledge/clients/elite/features/salesorder-netsuite-push.md +64 -215
  425. package/knowledge/clients/elite/features/salesorder-status-togadesk-reply.md +27 -57
  426. package/knowledge/clients/elite/features/supply2-scope.md +59 -190
  427. package/knowledge/clients/elite/features/togadesk-service-request-intake.md +57 -176
  428. package/knowledge/clients/endeavor-health/INDEX.md +1 -1
  429. package/knowledge/clients/endeavor-health/profile.md +7 -11
  430. package/knowledge/clients/fordham/INDEX.md +1 -1
  431. package/knowledge/clients/fordham/profile.md +10 -19
  432. package/knowledge/clients/growrk/INDEX.md +4 -4
  433. package/knowledge/clients/growrk/features/shipping-carrier-cleanup.md +23 -46
  434. package/knowledge/clients/growrk/features/transfer-order-flow.md +39 -88
  435. package/knowledge/clients/growrk/features/units-netsuite-custom-fields.md +59 -149
  436. package/knowledge/clients/growrk/profile.md +14 -46
  437. package/knowledge/clients/northwell/INDEX.md +2 -2
  438. package/knowledge/clients/northwell/features/sso-jit-provisioning.md +25 -75
  439. package/knowledge/clients/northwell/profile.md +12 -31
  440. package/knowledge/clients/nycdoe/INDEX.md +4 -4
  441. package/knowledge/clients/nycdoe/features/edi-850-receive-and-997-ack.md +28 -68
  442. package/knowledge/clients/nycdoe/features/hold-status-sync.md +72 -321
  443. package/knowledge/clients/nycdoe/features/servicenow-integration.md +132 -643
  444. package/knowledge/clients/nycdoe/profile.md +11 -28
  445. package/knowledge/clients/nychh/INDEX.md +7 -7
  446. package/knowledge/clients/nychh/features/location-shipping-addresses.md +36 -110
  447. package/knowledge/clients/nychh/features/netsuite-inventory-adjustment-fulfillment-link.md +55 -235
  448. package/knowledge/clients/nychh/features/netsuite-transfer-order-import.md +126 -403
  449. package/knowledge/clients/nychh/features/po-number-upstream-direction.md +19 -63
  450. package/knowledge/clients/nychh/features/talos-assistant-enablement.md +42 -106
  451. package/knowledge/clients/nychh/features/transfer-order-inventory-quantities.md +118 -386
  452. package/knowledge/clients/nychh/profile.md +55 -363
  453. package/knowledge/clients/office-depot/INDEX.md +3 -3
  454. package/knowledge/clients/office-depot/features/odp-tech-support.md +30 -56
  455. package/knowledge/clients/office-depot/features/togarefresh2026-linkbuilder-routing.md +17 -21
  456. package/knowledge/clients/office-depot/profile.md +16 -46
  457. package/knowledge/clients/pcmaticb2b/INDEX.md +4 -4
  458. package/knowledge/clients/pcmaticb2b/features/startech-entitlement-provisioning.md +35 -101
  459. package/knowledge/clients/pcmaticb2b/features/startech-per-ticket-type-stages.md +42 -123
  460. package/knowledge/clients/pcmaticb2b/features/startech-ticket-sync.md +58 -105
  461. package/knowledge/clients/pcmaticb2b/profile.md +5 -10
  462. package/knowledge/clients/prudential/INDEX.md +14 -14
  463. package/knowledge/clients/prudential/features/dell-asn-units-interceptor.md +21 -69
  464. package/knowledge/clients/prudential/features/dell-lch-iop-transmissions.md +53 -170
  465. package/knowledge/clients/prudential/features/device-information-import-and-contact-linking.md +27 -115
  466. package/knowledge/clients/prudential/features/itemclasses-device-tier-data.md +25 -74
  467. package/knowledge/clients/prudential/features/oneuptime-order-pipeline-monitors.md +19 -55
  468. package/knowledge/clients/prudential/features/order-email-pdf-attachments.md +53 -177
  469. package/knowledge/clients/prudential/features/service-request-address-validation.md +51 -105
  470. package/knowledge/clients/prudential/features/service-request-auth-rejection-alert.md +37 -113
  471. package/knowledge/clients/prudential/features/service-request-rejection-alert-email.md +30 -77
  472. package/knowledge/clients/prudential/features/supply-orders-csv-export.md +29 -90
  473. package/knowledge/clients/prudential/features/transmit-ordershipped-email.md +58 -211
  474. package/knowledge/clients/prudential/workflows/dell-asn-backfill-replay.md +14 -38
  475. package/knowledge/clients/prudential/workflows/http2-alb-workaround.md +15 -34
  476. package/knowledge/clients/prudential/workflows/store-saml-deploy-topology.md +39 -115
  477. package/knowledge/clients/quad/INDEX.md +4 -4
  478. package/knowledge/clients/quad/features/enter-po-details-vendor-selection-ev12.md +20 -36
  479. package/knowledge/clients/quad/features/multi-currency-item-pricing.md +43 -139
  480. package/knowledge/clients/quad/features/po-asn-email-import.md +48 -139
  481. package/knowledge/clients/quad/workflows/catalog-fold-reversal.md +36 -84
  482. package/knowledge/clients/rate/INDEX.md +12 -12
  483. package/knowledge/clients/rate/features/aig-contract-creation.md +90 -554
  484. package/knowledge/clients/rate/features/checkout-terms-delivery-preference.md +28 -69
  485. package/knowledge/clients/rate/features/home-warranty-terms-content.md +23 -65
  486. package/knowledge/clients/rate/features/monthly-reconciliation-report.md +18 -37
  487. package/knowledge/clients/rate/features/netsuite-cashsale-export.md +19 -56
  488. package/knowledge/clients/rate/features/paypal-subscription-purchase-webhook.md +60 -204
  489. package/knowledge/clients/rate/features/saml-sso.md +12 -16
  490. package/knowledge/clients/rate/features/service-card-entitlements.md +44 -141
  491. package/knowledge/clients/rate/features/service-purchase-emails.md +40 -132
  492. package/knowledge/clients/rate/features/subscription-cancellation.md +82 -412
  493. package/knowledge/clients/rate/features/whole-home-warranty-purchase-guard.md +97 -610
  494. package/knowledge/clients/rate/profile.md +3 -5
  495. package/knowledge/clients/rumcsi/INDEX.md +1 -1
  496. package/knowledge/clients/rumcsi/profile.md +34 -102
  497. package/knowledge/clients/spglobal/INDEX.md +1 -1
  498. package/knowledge/clients/spglobal/profile.md +7 -11
  499. package/knowledge/clients/staples/INDEX.md +2 -2
  500. package/knowledge/clients/staples/features/oneuptime-sftp-folder-monitors.md +30 -71
  501. package/knowledge/clients/staples/profile.md +9 -23
  502. package/knowledge/clients/tow-foundation/INDEX.md +2 -2
  503. package/knowledge/clients/tow-foundation/features/receipt-processing.md +96 -306
  504. package/knowledge/clients/tow-foundation/profile.md +18 -45
  505. package/knowledge/clients/true/INDEX.md +2 -2
  506. package/knowledge/clients/true/features/users-personas-data-model.md +12 -15
  507. package/knowledge/clients/true/profile.md +9 -31
  508. package/knowledge/clients/walmart/INDEX.md +3 -3
  509. package/knowledge/clients/walmart/features/domain-migration.md +16 -13
  510. package/knowledge/clients/walmart/features/registration-route.md +23 -24
  511. package/knowledge/clients/walmart/profile.md +13 -12
  512. package/knowledge/clients/wje/INDEX.md +1 -1
  513. package/knowledge/clients/wje/profile.md +14 -19
  514. package/knowledge/standalone/apps/claude/INDEX.md +5 -5
  515. package/knowledge/standalone/apps/claude/features/review-enforcement-hooks.md +19 -44
  516. package/knowledge/standalone/apps/claude/workflows/harness-distribution.md +29 -40
  517. package/knowledge/standalone/apps/claude/workflows/knowledge-publish-pipeline.md +23 -43
  518. package/knowledge/standalone/apps/claude/workflows/mcp-tool-usage.md +68 -149
  519. package/knowledge/standalone/apps/claude/workflows/ticket-branch-creation-safety.md +32 -62
  520. package/knowledge/standalone/apps/forward/INDEX.md +3 -3
  521. package/knowledge/standalone/apps/forward/architecture.md +26 -71
  522. package/knowledge/standalone/apps/forward/features/encrypted-link-handler.md +19 -33
  523. package/knowledge/standalone/apps/forward/features/static-demo-hosting.md +33 -93
  524. package/knowledge/standalone/apps/togatech/INDEX.md +5 -5
  525. package/knowledge/standalone/apps/togatech/architecture.md +40 -71
  526. package/knowledge/standalone/apps/togatech/features/careers-paylocity-job-openings.md +31 -106
  527. package/knowledge/standalone/apps/togatech/features/seo-aeo-geo-prerender.md +11 -13
  528. package/knowledge/standalone/apps/togatech/workflows/creating-pull-requests.md +14 -13
  529. package/knowledge/standalone/apps/togatech/workflows/local-dev-and-headless-verification.md +15 -46
  530. package/knowledge/standalone/apps/websocket/INDEX.md +2 -2
  531. package/knowledge/standalone/apps/websocket/architecture.md +16 -22
  532. package/knowledge/standalone/apps/websocket/features/sqs-fanout.md +18 -50
  533. package/knowledge/standalone/standards/brand-naming.md +7 -12
  534. package/knowledge/standalone/standards/communication-clarity.md +12 -42
  535. package/knowledge/standalone/standards/deploy-instruction-communication.md +7 -27
  536. package/knowledge/standalone/standards/session-priming.md +15 -57
  537. package/package.json +1 -1
@@ -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) | `dbchanges` is the **1.0** (legacy/V1) schema-and-data change repository — the 1.0 sibling of 2.0's `dbchanges2`. |
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 |
@@ -6,7 +6,7 @@ project: Database Changes
6
6
  client: shared
7
7
  type: workflow
8
8
  status: active
9
- updated: 2026-08-14
9
+ updated: 2026-09-16
10
10
  owners: [sking]
11
11
  files:
12
12
  - dbchanges/index.php
@@ -19,42 +19,36 @@ 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
+
22
24
  ## Summary
23
25
 
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.
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.
29
27
 
30
28
  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
- 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.
32
+ > `dbchanges/Core/*` targets the **legacy (V1) `Core` schema** — not the 2.0 prod `Core`. Confirm the target environment before writing anything.
36
33
 
37
- > `dbchanges/Core/*` targets the **legacy (V1) `Core` schema** — not the 2.0 prod `Core`. Confirm
38
- > the target environment before writing anything.
34
+ ## Steps
39
35
 
40
- ## How the runner parses a file (`dbchanges/index.php`)
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.
41
43
 
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.
44
+ ### How the runner parses a file (`dbchanges/index.php`)
52
45
 
53
- ### Consequence: the "empty query" trap
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.
54
50
 
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.
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.
58
52
 
59
53
  ```sql
60
54
  -- CORRECT: all commentary lives above the statement, one trailing statement.
@@ -71,22 +65,14 @@ UPDATE ...;
71
65
 
72
66
  All 13 pre-existing files under `dbchanges/Core/` comply with this. Follow them.
73
67
 
74
- ## Expressing an all-or-nothing guard (the only pattern that works)
68
+ ### The all-or-nothing guard pattern (the only one that works)
75
69
 
76
70
  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.
77
74
 
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**.
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**.
90
76
 
91
77
  ```sql
92
78
  UPDATE SomeTable t
@@ -98,28 +84,15 @@ WHERE t.id IN (<ids>)
98
84
  ) AS preflight) = <expected-row-count>;
99
85
  ```
100
86
 
101
- ## One top-level folder = one DATABASE (and the silent-skip trap)
87
+ ### One top-level folder = one DATABASE (and the silent-skip trap)
102
88
 
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.
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.
109
90
 
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**.
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**.
116
92
 
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.
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.
121
94
 
122
- ## Which branches actually auto-apply
95
+ ### Which branches actually auto-apply
123
96
 
124
97
  | Path | Trigger | Timing |
125
98
  |---|---|---|
@@ -127,64 +100,20 @@ didn't.
127
100
  | Elastic Beanstalk container command (`worker/.ebextensions/030_dbchanges.config`) | worker **deploy** | on next deploy |
128
101
 
129
102
  The repo ships `config.alpha/beta/demo/hotfix/prod/stage/test/worker.ini`, therefore:
130
-
131
103
  - **Auto-apply within ~2 min of a push:** `_alpha`, `_beta`, `_demo`, `_hotfix`, `_stage`.
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.
135
-
136
- ## Steps
137
-
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.
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.
151
105
 
152
106
  ## Gotchas
153
107
 
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.
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.
158
110
  - **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)
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.
115
+
116
+ ## Related
117
+
118
+ - [Worker architecture](../../worker/architecture.md) — the worker tier drives every dbchanges application.
119
+ - [NYCDOE ServiceNow integration](../../../../clients/nycdoe/features/servicenow-integration.md)
@@ -2,25 +2,25 @@
2
2
 
3
3
  | Doc | Summary |
4
4
  |-----|---------|
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 |
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
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 |
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 |
@@ -6,7 +6,7 @@ project: Library
6
6
  client: shared
7
7
  type: architecture
8
8
  status: active
9
- updated: 2026-06-08
9
+ updated: 2026-09-17
10
10
  owners: [jcardinal]
11
11
  files:
12
12
  - library/_.php
@@ -15,57 +15,47 @@ 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
+
18
20
  ## Summary
19
21
 
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.
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).
24
25
 
25
26
  ## Role in the stack
26
27
 
27
28
  - **`library/`** — server-side PHP classes, third-party packages, bootstrap/autoloader.
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.**
29
+ - **Application repos** — each `require`s `library/_.php` to bootstrap the framework.
30
+ - **`resources/` repo** — purely front-end assets (JS/CSS).
30
31
 
31
32
  ## Bootstrap & autoloader (`_.php`)
32
33
 
33
- `_.php` is the single framework include. Every app starts with
34
- `require_once '/path/to/library/_.php';`. It:
34
+ `_.php` is the single framework include. Every app starts with `require_once '/path/to/library/_.php';`. It:
35
35
 
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).
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).
40
38
  3. Registers the autoloader via `spl_autoload_register('autoloader')`.
41
39
 
42
- Global helper: `debugVar($input, $stopExecution, $withHrLineBreaker)` — dumps a variable
43
- as HTML `<PRE>`, optionally halting. **Remove all `debugVar()` calls before merging.**
40
+ Global helper: `debugVar($input, $stopExecution, $withHrLineBreaker)` — dumps a variable as HTML `<PRE>`, optionally halting.
44
41
 
45
42
  ### Class-to-file mapping
46
43
 
47
- Convert the class name to a path by replacing every `_` with `/`, then **lowercase the
48
- entire result** and append `.php`:
44
+ Convert the class name to a path by replacing every `_` with `/`, then **lowercase the entire result** and append `.php`:
49
45
 
50
46
  ```
51
47
  App_Email_Nycdoe_InstallationConfirmation
52
48
  → app/email/nycdoe/installationconfirmation.php (under __APPROOT__ or __LIBROOT__)
53
49
  ```
54
50
 
55
- - All folder/file names **must be lowercase**.
56
51
  - Class names are **not** case-sensitive (autoloader lowercases before lookup).
57
- - Both `__APPROOT__` and `__LIBROOT__` are checked, so app-level classes can **shadow**
58
- library classes. Namespace separators (`\`) normalize to `_`.
52
+ - Both `__APPROOT__` and `__LIBROOT__` are checked, so app-level classes can **shadow** library classes. Namespace separators (`\`) normalize to `_`.
59
53
 
60
54
  ## Custom code — `app/` and `browser/`
61
55
 
62
56
  ### `app/` — back-end logic (prefix `App_`)
63
57
 
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/`.
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/`.
69
59
 
70
60
  ```php
71
61
  class App_Model_Client extends App_Model {
@@ -76,40 +66,23 @@ class App_Model_Client extends App_Model {
76
66
  }
77
67
  ```
78
68
 
79
- API pattern: `abstract class App_Api` with static methods; `class App_Api_Microsoft
80
- extends App_Api` with `initialize()`.
69
+ API pattern: `abstract class App_Api` with static methods; `class App_Api_Microsoft extends App_Api` with `initialize()`.
81
70
 
82
71
  ### `browser/` — server-rendered UI (prefix `Browser_`)
83
72
 
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/`.
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/`.
88
74
 
89
75
  ## Third-party packages (vendored, no Composer)
90
76
 
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`.
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`.
96
78
 
97
- ## Key conventions
79
+ ## App_String cross-framework crypto (`encryptWithKey` / `decryptWithKey`)
98
80
 
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.
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`).
106
82
 
107
- ## App_String cross-framework crypto (`encryptWithKey` / `decryptWithKey`)
83
+ ## Gotchas
108
84
 
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`).
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).
@@ -6,7 +6,7 @@ project: Library
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-08-13
9
+ updated: 2026-09-16
10
10
  owners: [jcardinal]
11
11
  files:
12
12
  - library/app/api/officedepot.php
@@ -15,63 +15,29 @@ 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
+
18
20
  ## 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.
26
21
 
27
- ## Key files / entry points
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:
28
27
  - `library/app/api/officedepot.php` — `App_Api_OfficeDepot::validateAddress()`, the gateway.
29
28
  - `library/app/api/usps.php` — `App_Api_USPS::validateAddress()`, the fallback carrier.
30
29
 
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).
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
43
36
 
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.
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.
69
40
 
70
- ## Related docs
71
- - `../../toga/features/odp-customer-search-loyalty-persistence.md` — the customersearch save
72
- flow, where the write-back fix was applied.
41
+ ## Related
73
42
 
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)
43
+ - `../../toga/features/odp-customer-search-loyalty-persistence.md` — the customersearch save flow, where the write-back fix was applied.