toga-ai 1.0.828 → 1.0.830

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 (589) hide show
  1. package/agents/knowledge-writer.md +13 -6
  2. package/agents/session-capture.md +7 -2
  3. package/knowledge/1.0/apps/dbchanges/INDEX.md +1 -1
  4. package/knowledge/1.0/apps/dbchanges/workflows/authoring-and-shipping-sql-files.md +43 -114
  5. package/knowledge/1.0/apps/library/INDEX.md +23 -23
  6. package/knowledge/1.0/apps/library/architecture.md +25 -52
  7. package/knowledge/1.0/apps/library/features/address-validation-gateway.md +19 -53
  8. package/knowledge/1.0/apps/library/features/app-class-placement-base-contracts.md +19 -33
  9. package/knowledge/1.0/apps/library/features/app-sso-initiation.md +38 -75
  10. package/knowledge/1.0/apps/library/features/cron-execution-monitoring.md +24 -90
  11. package/knowledge/1.0/apps/library/features/diagnostic-dialog-view-recommended-services.md +33 -67
  12. package/knowledge/1.0/apps/library/features/elite-freshservice-sync.md +43 -71
  13. package/knowledge/1.0/apps/library/features/email-queue-attachments.md +34 -84
  14. package/knowledge/1.0/apps/library/features/email-templates.md +35 -84
  15. package/knowledge/1.0/apps/library/features/email-test-mode-and-write-free-sends.md +37 -98
  16. package/knowledge/1.0/apps/library/features/error-capture-1-0.md +57 -271
  17. package/knowledge/1.0/apps/library/features/http-500-error-monitor.md +33 -117
  18. package/knowledge/1.0/apps/library/features/mvc-page-pattern-and-app-skeleton.md +21 -42
  19. package/knowledge/1.0/apps/library/features/netsuite-filecabinet-restlet.md +29 -87
  20. package/knowledge/1.0/apps/library/features/netsuite-item-assettype-sync.md +58 -142
  21. package/knowledge/1.0/apps/library/features/netsuite-item-class-sync.md +32 -97
  22. package/knowledge/1.0/apps/library/features/netsuite-item-isfulfillable-sync.md +39 -147
  23. package/knowledge/1.0/apps/library/features/netsuite-suiteql-api-reference.md +116 -381
  24. package/knowledge/1.0/apps/library/features/netsuite-suiteql-rest-shim.md +71 -451
  25. package/knowledge/1.0/apps/library/features/netsuite-sync-alert-monitor.md +25 -104
  26. package/knowledge/1.0/apps/library/features/startech-pcmaticb2b-sync.md +24 -56
  27. package/knowledge/1.0/apps/library/features/toga2-api-client-and-bridge.md +97 -489
  28. package/knowledge/1.0/apps/library/workflows/render-1-0-email-templates-offline.md +17 -37
  29. package/knowledge/1.0/apps/store/INDEX.md +2 -2
  30. package/knowledge/1.0/apps/store/architecture.md +13 -33
  31. package/knowledge/1.0/apps/store/features/saml-sso-certificate-and-keys.md +31 -116
  32. package/knowledge/1.0/apps/test/INDEX.md +16 -16
  33. package/knowledge/1.0/apps/test/architecture.md +15 -38
  34. package/knowledge/1.0/apps/test/features/2-0-deployment-client-sql.md +11 -17
  35. package/knowledge/1.0/apps/test/features/active-directory-auth-test.md +8 -12
  36. package/knowledge/1.0/apps/test/features/compass-retrofix2-sql-generator.md +39 -63
  37. package/knowledge/1.0/apps/test/features/create-elastic-beanstalk.md +22 -49
  38. package/knowledge/1.0/apps/test/features/dev-generators.md +12 -17
  39. package/knowledge/1.0/apps/test/features/forecast-netsuite-discrepancy-analysis.md +11 -20
  40. package/knowledge/1.0/apps/test/features/github-audit-script.md +13 -31
  41. package/knowledge/1.0/apps/test/features/goagilant-to-togatech-email-migration.md +28 -63
  42. package/knowledge/1.0/apps/test/features/static-no-db-regression-harness.md +44 -99
  43. package/knowledge/1.0/apps/test/features/tableview-builder.md +10 -17
  44. package/knowledge/1.0/apps/test/features/talos-kb-pipeline.md +38 -84
  45. package/knowledge/1.0/apps/test/features/toga2-client-onboarding-sql.md +17 -43
  46. package/knowledge/1.0/apps/test/features/toga2-onboarding-wizard.md +29 -66
  47. package/knowledge/1.0/apps/test/features/toga2-user-cross-client-access-sql.md +11 -16
  48. package/knowledge/1.0/apps/test/features/url-domain-markdown-document.md +10 -16
  49. package/knowledge/1.0/apps/toga/INDEX.md +2 -2
  50. package/knowledge/1.0/apps/toga/features/bundleconfirmation-cart-preservation.md +11 -23
  51. package/knowledge/1.0/apps/toga/features/odp-customer-search-loyalty-persistence.md +19 -57
  52. package/knowledge/1.0/apps/togadesk/INDEX.md +12 -12
  53. package/knowledge/1.0/apps/togadesk/architecture.md +44 -121
  54. package/knowledge/1.0/apps/togadesk/features/email-to-ticket-intake.md +42 -123
  55. package/knowledge/1.0/apps/togadesk/features/field-service-dispatch.md +37 -127
  56. package/knowledge/1.0/apps/togadesk/features/managed-service-order-create.md +37 -128
  57. package/knowledge/1.0/apps/togadesk/features/notifications.md +18 -63
  58. package/knowledge/1.0/apps/togadesk/features/per-client-host-restriction.md +26 -107
  59. package/knowledge/1.0/apps/togadesk/features/rest-api.md +27 -42
  60. package/knowledge/1.0/apps/togadesk/features/smb-contract-editing.md +23 -39
  61. package/knowledge/1.0/apps/togadesk/features/staff-login-authentication.md +22 -58
  62. package/knowledge/1.0/apps/togadesk/features/ticket-lifecycle.md +38 -120
  63. package/knowledge/1.0/apps/togadesk/workflows/production-revert-forward.md +21 -35
  64. package/knowledge/1.0/apps/togadesk/workflows/standalone-test-scripts.md +15 -42
  65. package/knowledge/1.0/apps/togaview/INDEX.md +7 -7
  66. package/knowledge/1.0/apps/togaview/architecture.md +45 -127
  67. package/knowledge/1.0/apps/togaview/features/login-flows.md +42 -142
  68. package/knowledge/1.0/apps/togaview/features/msp-dashboard.md +16 -37
  69. package/knowledge/1.0/apps/togaview/features/retail-commerce-lifecycle.md +25 -43
  70. package/knowledge/1.0/apps/togaview/features/ticket-detail-page.md +38 -134
  71. package/knowledge/1.0/apps/togaview/workflows/git-and-php-tooling-under-the-underscore-app-root.md +15 -26
  72. package/knowledge/1.0/apps/togaview/workflows/route53-cross-account-zone-migration.md +16 -42
  73. package/knowledge/1.0/apps/tools/INDEX.md +17 -17
  74. package/knowledge/1.0/apps/tools/architecture.md +28 -180
  75. package/knowledge/1.0/apps/tools/features/clickup-label-aliases-admin.md +35 -78
  76. package/knowledge/1.0/apps/tools/features/clickup-sprint-dashboard.md +49 -209
  77. package/knowledge/1.0/apps/tools/features/cloudfront-client-setup.md +36 -125
  78. package/knowledge/1.0/apps/tools/features/compass-user-persona-admin.md +0 -37
  79. package/knowledge/1.0/apps/tools/features/design-demo-admin.md +45 -150
  80. package/knowledge/1.0/apps/tools/features/developer-tools.md +15 -28
  81. package/knowledge/1.0/apps/tools/features/errors-curation-console.md +85 -345
  82. package/knowledge/1.0/apps/tools/features/github-audit.md +35 -124
  83. package/knowledge/1.0/apps/tools/features/legacy-email-notifier.md +26 -80
  84. package/knowledge/1.0/apps/tools/features/mvc-data-access-patterns.md +62 -151
  85. package/knowledge/1.0/apps/tools/features/oneuptime-monitor-status-panel.md +52 -243
  86. package/knowledge/1.0/apps/tools/features/persona-gated-navigation.md +21 -45
  87. package/knowledge/1.0/apps/tools/features/saml-sso-auth.md +50 -156
  88. package/knowledge/1.0/apps/tools/features/talos-kb-documents-admin.md +82 -422
  89. package/knowledge/1.0/apps/tools/features/talos-pricing-ui.md +30 -77
  90. package/knowledge/1.0/apps/tools/features/theme-light-dark.md +44 -130
  91. package/knowledge/1.0/apps/tools/workflows/deploy-to-elastic-beanstalk-al2023.md +55 -233
  92. package/knowledge/1.0/apps/walmarttechservices/INDEX.md +1 -1
  93. package/knowledge/1.0/apps/walmarttechservices/architecture.md +32 -81
  94. package/knowledge/1.0/apps/webhook/INDEX.md +1 -1
  95. package/knowledge/1.0/apps/webhook/features/netsuite-clickup-opportunity-sync.md +51 -174
  96. package/knowledge/1.0/apps/worker/INDEX.md +19 -19
  97. package/knowledge/1.0/apps/worker/architecture.md +64 -166
  98. package/knowledge/1.0/apps/worker/features/canon-received-po-netsuite-order-sync.md +10 -12
  99. package/knowledge/1.0/apps/worker/features/compass-ma-sales-order-exception-report.md +10 -27
  100. package/knowledge/1.0/apps/worker/features/compass-manager-approval-reminder-emails.md +11 -11
  101. package/knowledge/1.0/apps/worker/features/compass-partial-in-transit-delivered-emails.md +9 -72
  102. package/knowledge/1.0/apps/worker/features/elite-togadesk-attachment-sync.md +16 -9
  103. package/knowledge/1.0/apps/worker/features/forecast2-netsuite-reconciliation.md +10 -212
  104. package/knowledge/1.0/apps/worker/features/forecast2-supporting-records-import.md +13 -24
  105. package/knowledge/1.0/apps/worker/features/netsuite-sales-order-sales-rep-sourcing.md +8 -9
  106. package/knowledge/1.0/apps/worker/features/netsuite-togasupply-per-client-sync.md +22 -500
  107. package/knowledge/1.0/apps/worker/features/oneuptime-server-monitor-host-hygiene.md +12 -15
  108. package/knowledge/1.0/apps/worker/features/oneuptime-worker-uptime-monitoring.md +14 -16
  109. package/knowledge/1.0/apps/worker/features/send-shipments-for-the-day.md +11 -7
  110. package/knowledge/1.0/apps/worker/features/staples-cxml-order-import.md +11 -11
  111. package/knowledge/1.0/apps/worker/workflows/diagnosing-frozen-cron-checkins.md +23 -70
  112. package/knowledge/1.0/apps/worker/workflows/isfulfillable-multi-client-backfill.md +26 -82
  113. package/knowledge/1.0/apps/worker/workflows/netsuite-duplicate-items-dedup.md +28 -111
  114. package/knowledge/1.0/apps/worker/workflows/onboarding-client-to-netsuite-togasupply-sync.md +41 -173
  115. package/knowledge/1.0/apps/worker/workflows/tracing-a-worker-cron-run-in-production.md +63 -184
  116. package/knowledge/1.0/standards/backend-php-cases.md +75 -0
  117. package/knowledge/1.0/standards/backend-php.md +181 -343
  118. package/knowledge/1.0/standards/framework-rules-cases.md +26 -0
  119. package/knowledge/1.0/standards/framework-rules.md +25 -52
  120. package/knowledge/1.0/standards/frontend-cases.md +37 -0
  121. package/knowledge/1.0/standards/frontend.md +30 -92
  122. package/knowledge/2.0/apps/_underscore/INDEX.md +62 -62
  123. package/knowledge/2.0/apps/_underscore/architecture/surface-authoring-proposal.md +3 -1
  124. package/knowledge/2.0/apps/_underscore/architecture.md +4 -14
  125. package/knowledge/2.0/apps/_underscore/features/acl-permission-chain.md +78 -264
  126. package/knowledge/2.0/apps/_underscore/features/address-uniqueness-normalization.md +34 -67
  127. package/knowledge/2.0/apps/_underscore/features/address-validation.md +55 -130
  128. package/knowledge/2.0/apps/_underscore/features/apirequest-json-content-type.md +9 -47
  129. package/knowledge/2.0/apps/_underscore/features/assortment-name-translation.md +19 -63
  130. package/knowledge/2.0/apps/_underscore/features/async-query-execution.md +37 -86
  131. package/knowledge/2.0/apps/_underscore/features/autoincrement-record-numbering.md +22 -59
  132. package/knowledge/2.0/apps/_underscore/features/calculated-column-filter-options.md +11 -11
  133. package/knowledge/2.0/apps/_underscore/features/calculated-sql-fields.md +20 -90
  134. package/knowledge/2.0/apps/_underscore/features/carrier-shipping-labels.md +22 -86
  135. package/knowledge/2.0/apps/_underscore/features/cli-script-bootstrap.md +5 -13
  136. package/knowledge/2.0/apps/_underscore/features/cloud-s3-helpers.md +21 -60
  137. package/knowledge/2.0/apps/_underscore/features/cloud-secrets-manager.md +19 -43
  138. package/knowledge/2.0/apps/_underscore/features/component-model-namespace-registration.md +14 -37
  139. package/knowledge/2.0/apps/_underscore/features/config-group-access.md +16 -30
  140. package/knowledge/2.0/apps/_underscore/features/core-domains-app-host-registry.md +16 -19
  141. package/knowledge/2.0/apps/_underscore/features/database-alias-repointing.md +11 -16
  142. package/knowledge/2.0/apps/_underscore/features/effective-persona-resolution.md +9 -9
  143. package/knowledge/2.0/apps/_underscore/features/email-send-pipeline.md +15 -48
  144. package/knowledge/2.0/apps/_underscore/features/email-template-sending.md +28 -83
  145. package/knowledge/2.0/apps/_underscore/features/error-reporting-issue-event.md +117 -317
  146. package/knowledge/2.0/apps/_underscore/features/event-publish-sqs.md +7 -8
  147. package/knowledge/2.0/apps/_underscore/features/field-storage-row-hydration.md +13 -14
  148. package/knowledge/2.0/apps/_underscore/features/forecast-sale-import.md +31 -198
  149. package/knowledge/2.0/apps/_underscore/features/fulfillable-item-propagation.md +14 -35
  150. package/knowledge/2.0/apps/_underscore/features/item-classification-itemclasses.md +18 -24
  151. package/knowledge/2.0/apps/_underscore/features/item-fulfillment-stage-lifecycle-and-order-status.md +14 -42
  152. package/knowledge/2.0/apps/_underscore/features/model-interceptor-unit-testing.md +13 -24
  153. package/knowledge/2.0/apps/_underscore/features/model-magic-field-access.md +12 -38
  154. package/knowledge/2.0/apps/_underscore/features/model-save-parent-cascade-stored-field-deadlock.md +36 -84
  155. package/knowledge/2.0/apps/_underscore/features/model-save-vs-query-atomic-update.md +28 -77
  156. package/knowledge/2.0/apps/_underscore/features/model-storage-field-s3.md +22 -44
  157. package/knowledge/2.0/apps/_underscore/features/netsuite-rest-client.md +78 -307
  158. package/knowledge/2.0/apps/_underscore/features/netsuite-salesorder-address-phone-sync.md +38 -88
  159. package/knowledge/2.0/apps/_underscore/features/note-record-authorship.md +22 -51
  160. package/knowledge/2.0/apps/_underscore/features/outbound-api-rate-budget.md +40 -138
  161. package/knowledge/2.0/apps/_underscore/features/page-meta-context-field-settings.md +35 -186
  162. package/knowledge/2.0/apps/_underscore/features/per-client-database-connections.md +39 -238
  163. package/knowledge/2.0/apps/_underscore/features/persona-name-translation.md +44 -142
  164. package/knowledge/2.0/apps/_underscore/features/record-change-audit-log.md +42 -147
  165. package/knowledge/2.0/apps/_underscore/features/recursive-item-fulfillments.md +38 -163
  166. package/knowledge/2.0/apps/_underscore/features/sales-order-denial-reason.md +81 -299
  167. package/knowledge/2.0/apps/_underscore/features/sales-order-po-number-sourcing.md +25 -86
  168. package/knowledge/2.0/apps/_underscore/features/sales-order-purchase-order-bridge-direction.md +28 -91
  169. package/knowledge/2.0/apps/_underscore/features/sales-order-status-filter-surface.md +40 -82
  170. package/knowledge/2.0/apps/_underscore/features/shipping-carriers-and-accounts.md +37 -98
  171. package/knowledge/2.0/apps/_underscore/features/string-html-entity-helpers.md +23 -59
  172. package/knowledge/2.0/apps/_underscore/features/surface-field-recordfield-binding.md +54 -150
  173. package/knowledge/2.0/apps/_underscore/features/surface-resolver.md +209 -851
  174. package/knowledge/2.0/apps/_underscore/features/tableview-hyperlink-columns.md +50 -85
  175. package/knowledge/2.0/apps/_underscore/features/tableview-joins.md +118 -324
  176. package/knowledge/2.0/apps/_underscore/features/togaiq-gateway-client.md +45 -105
  177. package/knowledge/2.0/apps/_underscore/features/tracking-number-bridges.md +45 -249
  178. package/knowledge/2.0/apps/_underscore/features/units-for-items-for-purchase-orders.md +48 -156
  179. package/knowledge/2.0/apps/_underscore/features/user-email-as-identity-and-password-reset.md +26 -56
  180. package/knowledge/2.0/apps/_underscore/features/usps-dpv-deliverability.md +29 -53
  181. package/knowledge/2.0/apps/_underscore/workflows/local-db-refresh-from-beta.md +23 -99
  182. package/knowledge/2.0/apps/_underscore/workflows/recreated-shared-branch-stale-local-remerge.md +38 -91
  183. package/knowledge/2.0/apps/_underscore/workflows/rotating-public-tls-certificates.md +44 -151
  184. package/knowledge/2.0/apps/_underscore/workflows/running-a-2.0-app-locally.md +28 -102
  185. package/knowledge/2.0/apps/ai-bdr/INDEX.md +13 -13
  186. package/knowledge/2.0/apps/ai-bdr/architecture.md +31 -100
  187. package/knowledge/2.0/apps/ai-bdr/features/bdr-web-funnel-plan.md +128 -460
  188. package/knowledge/2.0/apps/ai-bdr/features/call-orchestration.md +55 -121
  189. package/knowledge/2.0/apps/ai-bdr/features/campaign-chat-handoff.md +68 -169
  190. package/knowledge/2.0/apps/ai-bdr/features/landing-call-flow.md +75 -188
  191. package/knowledge/2.0/apps/ai-bdr/features/landing-chat-drawer.md +78 -249
  192. package/knowledge/2.0/apps/ai-bdr/features/live-call-status.md +46 -104
  193. package/knowledge/2.0/apps/ai-bdr/features/security-landing-page.md +82 -266
  194. package/knowledge/2.0/apps/ai-bdr/features/vapi-integration.md +42 -108
  195. package/knowledge/2.0/apps/ai-bdr/features/web-funnel-app.md +213 -879
  196. package/knowledge/2.0/apps/ai-bdr/features/web-funnel-content-model.md +63 -194
  197. package/knowledge/2.0/apps/ai-bdr/workflows/new-campaign-onboarding.md +51 -88
  198. package/knowledge/2.0/apps/ai-bdr/workflows/safe-call-loop-testing.md +60 -187
  199. package/knowledge/2.0/apps/api2/INDEX.md +26 -26
  200. package/knowledge/2.0/apps/api2/architecture.md +91 -461
  201. package/knowledge/2.0/apps/api2/features/api-key-authentication-and-scoping.md +32 -77
  202. package/knowledge/2.0/apps/api2/features/api-payload-interceptors.md +166 -652
  203. package/knowledge/2.0/apps/api2/features/cross-client-data-retrieval.md +63 -282
  204. package/knowledge/2.0/apps/api2/features/cxml-shipnotice-gateway.md +57 -151
  205. package/knowledge/2.0/apps/api2/features/encrypted-user-uuid-auth-handoff.md +22 -45
  206. package/knowledge/2.0/apps/api2/features/environment-variable-drives-underscore-branch.md +57 -339
  207. package/knowledge/2.0/apps/api2/features/health-check-endpoint.md +27 -64
  208. package/knowledge/2.0/apps/api2/features/language-translation-layer.md +57 -283
  209. package/knowledge/2.0/apps/api2/features/login-cross-client-user-resolution.md +18 -59
  210. package/knowledge/2.0/apps/api2/features/nested-fk-acl-embedding.md +24 -84
  211. package/knowledge/2.0/apps/api2/features/nested-relationship-writes.md +86 -474
  212. package/knowledge/2.0/apps/api2/features/record-scripts.md +58 -344
  213. package/knowledge/2.0/apps/api2/features/request-logging.md +119 -436
  214. package/knowledge/2.0/apps/api2/features/scripted-api-post-body-args.md +30 -59
  215. package/knowledge/2.0/apps/api2/features/sprint-dashboard-api.md +30 -93
  216. package/knowledge/2.0/apps/api2/features/surface-meta-option.md +19 -91
  217. package/knowledge/2.0/apps/api2/features/tableview-apiwhereclause-row-filtering.md +32 -104
  218. package/knowledge/2.0/apps/api2/features/tableview-field-metadata.md +59 -274
  219. package/knowledge/2.0/apps/api2/features/tickets-api.md +21 -47
  220. package/knowledge/2.0/apps/api2/features/v2-api-error-codes.md +79 -353
  221. package/knowledge/2.0/apps/api2/features/v2-deadlock-retry.md +50 -188
  222. package/knowledge/2.0/apps/api2/features/v2-rest-query-contract.md +102 -542
  223. package/knowledge/2.0/apps/api2/features/v2-reverse-hasmany-fields-whitelist.md +15 -51
  224. package/knowledge/2.0/apps/api2/workflows/codepipeline-codeconnections-deploy.md +65 -294
  225. package/knowledge/2.0/apps/api2/workflows/environment-configuration-and-provisioning.md +40 -123
  226. package/knowledge/2.0/apps/dbchanges2/INDEX.md +11 -11
  227. package/knowledge/2.0/apps/dbchanges2/architecture.md +104 -402
  228. package/knowledge/2.0/apps/dbchanges2/features/rerunnable-additive-inserts.md +64 -253
  229. package/knowledge/2.0/apps/dbchanges2/features/surface-layer-schema.md +401 -1543
  230. package/knowledge/2.0/apps/dbchanges2/workflows/client-onboarding.md +31 -80
  231. package/knowledge/2.0/apps/dbchanges2/workflows/client-schema-drift-audit.md +92 -265
  232. package/knowledge/2.0/apps/dbchanges2/workflows/deleting-contacts-from-a-client-database.md +23 -50
  233. package/knowledge/2.0/apps/dbchanges2/workflows/framework-branch-ahead-of-schema.md +67 -177
  234. package/knowledge/2.0/apps/dbchanges2/workflows/local-vs-prod-mysql-config-parity.md +31 -76
  235. package/knowledge/2.0/apps/dbchanges2/workflows/nonprod-metadata-drift-repair.md +99 -316
  236. package/knowledge/2.0/apps/dbchanges2/workflows/targeting-the-right-database.md +45 -155
  237. package/knowledge/2.0/apps/dbchanges2/workflows/verifying-a-migration-ran.md +16 -33
  238. package/knowledge/2.0/apps/saml/INDEX.md +6 -6
  239. package/knowledge/2.0/apps/saml/architecture.md +22 -42
  240. package/knowledge/2.0/apps/saml/features/downstream-integration-contract.md +19 -33
  241. package/knowledge/2.0/apps/saml/features/healthcheck-endpoint.md +31 -97
  242. package/knowledge/2.0/apps/saml/features/rate-user-provisioning.md +10 -9
  243. package/knowledge/2.0/apps/saml/workflows/onboarding-a-new-sso-client.md +23 -63
  244. package/knowledge/2.0/apps/saml/workflows/rotating-the-saml-sp-certificate.md +72 -193
  245. package/knowledge/2.0/apps/talos/INDEX.md +8 -8
  246. package/knowledge/2.0/apps/talos/architecture.md +48 -129
  247. package/knowledge/2.0/apps/talos/features/aegra-api.md +66 -153
  248. package/knowledge/2.0/apps/talos/features/chat-frontend.md +39 -96
  249. package/knowledge/2.0/apps/talos/features/deployment.md +29 -53
  250. package/knowledge/2.0/apps/talos/features/mcp-servers.md +39 -75
  251. package/knowledge/2.0/apps/talos/features/observability.md +34 -62
  252. package/knowledge/2.0/apps/talos/features/pricing-cogs-model.md +66 -143
  253. package/knowledge/2.0/apps/talos/features/talos-agent.md +56 -95
  254. package/knowledge/2.0/apps/talos-backend/INDEX.md +1 -1
  255. package/knowledge/2.0/apps/talos-backend/workflows/toga-supply-client-onboarding.md +59 -149
  256. package/knowledge/2.0/apps/toga-blox/INDEX.md +14 -14
  257. package/knowledge/2.0/apps/toga-blox/architecture.md +25 -56
  258. package/knowledge/2.0/apps/toga-blox/features/add-notes-template.md +20 -40
  259. package/knowledge/2.0/apps/toga-blox/features/advanced-select.md +23 -49
  260. package/knowledge/2.0/apps/toga-blox/features/api-client.md +36 -143
  261. package/knowledge/2.0/apps/toga-blox/features/base-input.md +20 -35
  262. package/knowledge/2.0/apps/toga-blox/features/blox-authoring-defects.md +61 -178
  263. package/knowledge/2.0/apps/toga-blox/features/primary-table-templates.md +59 -179
  264. package/knowledge/2.0/apps/toga-blox/features/table-record-modal.md +32 -58
  265. package/knowledge/2.0/apps/toga-blox/features/table.md +50 -215
  266. package/knowledge/2.0/apps/toga-blox/features/talos-assistant.md +74 -303
  267. package/knowledge/2.0/apps/toga-blox/features/toaster.md +20 -56
  268. package/knowledge/2.0/apps/toga-blox/workflows/dynamic-publish-pipeline.md +49 -272
  269. package/knowledge/2.0/apps/toga-blox/workflows/landing-a-large-feature-branch.md +21 -60
  270. package/knowledge/2.0/apps/toga-blox/workflows/local-link-into-a-consumer-app.md +65 -254
  271. package/knowledge/2.0/apps/toga2-commerce/INDEX.md +18 -18
  272. package/knowledge/2.0/apps/toga2-commerce/architecture.md +32 -98
  273. package/knowledge/2.0/apps/toga2-commerce/features/bundle-item-visibility-and-selectability.md +51 -128
  274. package/knowledge/2.0/apps/toga2-commerce/features/cart-bundle-submission-and-identity.md +23 -61
  275. package/knowledge/2.0/apps/toga2-commerce/features/cart-notification-emails.md +55 -142
  276. package/knowledge/2.0/apps/toga2-commerce/features/cart-order-total-computation.md +17 -30
  277. package/knowledge/2.0/apps/toga2-commerce/features/cart-page-config-architecture.md +81 -221
  278. package/knowledge/2.0/apps/toga2-commerce/features/catalog-cache-freshness.md +53 -168
  279. package/knowledge/2.0/apps/toga2-commerce/features/category-tile-sort-order.md +27 -78
  280. package/knowledge/2.0/apps/toga2-commerce/features/client-fields.md +120 -393
  281. package/knowledge/2.0/apps/toga2-commerce/features/expedited-shipping-gating.md +29 -110
  282. package/knowledge/2.0/apps/toga2-commerce/features/filter-search-results-page.md +27 -80
  283. package/knowledge/2.0/apps/toga2-commerce/features/inactive-item-purchase-gating.md +46 -135
  284. package/knowledge/2.0/apps/toga2-commerce/features/multi-tenant-theming.md +36 -62
  285. package/knowledge/2.0/apps/toga2-commerce/features/order-submit-sync-sequencing.md +38 -102
  286. package/knowledge/2.0/apps/toga2-commerce/features/shipping-cost-waiver-gating.md +28 -64
  287. package/knowledge/2.0/apps/toga2-commerce/workflows/amplify-build-and-deploy.md +52 -188
  288. package/knowledge/2.0/apps/toga2-commerce/workflows/cypress-testing.md +62 -144
  289. package/knowledge/2.0/apps/toga2-commerce/workflows/http2-protocol-error-diagnosis.md +36 -53
  290. package/knowledge/2.0/apps/toga2-hub/INDEX.md +2 -2
  291. package/knowledge/2.0/apps/toga2-hub/architecture.md +36 -85
  292. package/knowledge/2.0/apps/toga2-hub/features/acl-permissions-rendering.md +51 -85
  293. package/knowledge/2.0/apps/toga2-supply/INDEX.md +8 -8
  294. package/knowledge/2.0/apps/toga2-supply/architecture.md +20 -36
  295. package/knowledge/2.0/apps/toga2-supply/features/currency-amount-lines-editor.md +63 -156
  296. package/knowledge/2.0/apps/toga2-supply/features/fulfill-and-ship.md +203 -942
  297. package/knowledge/2.0/apps/toga2-supply/features/order-detail-field-config-and-customer-name.md +38 -99
  298. package/knowledge/2.0/apps/toga2-supply/features/table-data-additional-filters.md +22 -54
  299. package/knowledge/2.0/apps/toga2-supply/workflows/amplify-build-and-deploy.md +29 -89
  300. package/knowledge/2.0/apps/toga2-supply/workflows/client-host-scoping.md +79 -215
  301. package/knowledge/2.0/apps/toga2-supply/workflows/onboarding-a-client-to-fulfill-and-ship.md +29 -37
  302. package/knowledge/2.0/apps/toga2-view/INDEX.md +9 -9
  303. package/knowledge/2.0/apps/toga2-view/architecture.md +33 -98
  304. package/knowledge/2.0/apps/toga2-view/features/get-support-cancel-subscription.md +42 -132
  305. package/knowledge/2.0/apps/toga2-view/features/mobile-nav-header.md +15 -14
  306. package/knowledge/2.0/apps/toga2-view/features/property-questions-eligibility.md +15 -39
  307. package/knowledge/2.0/apps/toga2-view/features/query-string-builder.md +19 -39
  308. package/knowledge/2.0/apps/toga2-view/features/reference-dropdown-sorting.md +16 -32
  309. package/knowledge/2.0/apps/toga2-view/features/service-card.md +21 -24
  310. package/knowledge/2.0/apps/toga2-view/features/terms-and-conditions-page.md +18 -56
  311. package/knowledge/2.0/apps/toga2-view/features/zip-validation-contact-phone.md +11 -23
  312. package/knowledge/2.0/apps/toga25-supply/INDEX.md +19 -19
  313. package/knowledge/2.0/apps/toga25-supply/architecture.md +34 -103
  314. package/knowledge/2.0/apps/toga25-supply/features/action-button-rule-engine.md +30 -119
  315. package/knowledge/2.0/apps/toga25-supply/features/client-api-fetch-fields.md +25 -87
  316. package/knowledge/2.0/apps/toga25-supply/features/client-configurable-fields.md +37 -162
  317. package/knowledge/2.0/apps/toga25-supply/features/column-visibility.md +57 -177
  318. package/knowledge/2.0/apps/toga25-supply/features/force-logout-on-deployment.md +10 -47
  319. package/knowledge/2.0/apps/toga25-supply/features/meta-driven-table-data.md +39 -119
  320. package/knowledge/2.0/apps/toga25-supply/features/persisted-query-cache.md +34 -94
  321. package/knowledge/2.0/apps/toga25-supply/features/record-modals-and-nested-tables.md +85 -365
  322. package/knowledge/2.0/apps/toga25-supply/features/server-table-url-state.md +30 -83
  323. package/knowledge/2.0/apps/toga25-supply/features/side-navigation-and-default-route.md +20 -64
  324. package/knowledge/2.0/apps/toga25-supply/features/sso-redirect-and-session-gating.md +16 -71
  325. package/knowledge/2.0/apps/toga25-supply/features/surface-frontend.md +323 -1383
  326. package/knowledge/2.0/apps/toga25-supply/features/talos-integration.md +67 -272
  327. package/knowledge/2.0/apps/toga25-supply/features/toolbar-button-chrome.md +20 -59
  328. package/knowledge/2.0/apps/toga25-supply/features/transfer-orders-page.md +328 -1004
  329. package/knowledge/2.0/apps/toga25-supply/workflows/amplify-deployment.md +46 -222
  330. package/knowledge/2.0/apps/toga25-supply/workflows/cypress-testing.md +116 -349
  331. package/knowledge/2.0/apps/toga25-supply/workflows/porting-a-page-from-toga2-supply.md +16 -47
  332. package/knowledge/2.0/apps/voice-to-voice/INDEX.md +4 -4
  333. package/knowledge/2.0/apps/voice-to-voice/architecture.md +33 -78
  334. package/knowledge/2.0/apps/voice-to-voice/features/livekit-pipeline.md +44 -71
  335. package/knowledge/2.0/apps/voice-to-voice/features/post-call-lambda.md +40 -71
  336. package/knowledge/2.0/apps/voice-to-voice/features/ticket-api-integration.md +55 -101
  337. package/knowledge/2.0/apps/worker2/INDEX.md +61 -61
  338. package/knowledge/2.0/apps/worker2/architecture.md +55 -248
  339. package/knowledge/2.0/apps/worker2/features/alb-target-group-auto-registration.md +47 -153
  340. package/knowledge/2.0/apps/worker2/features/all-client-email-queue-monitor.md +46 -136
  341. package/knowledge/2.0/apps/worker2/features/api-stability-monitor.md +36 -116
  342. package/knowledge/2.0/apps/worker2/features/automated-pr-merger-force-push-race.md +23 -38
  343. package/knowledge/2.0/apps/worker2/features/callback-scheduling.md +100 -199
  344. package/knowledge/2.0/apps/worker2/features/clickup-connectivity-watchdog.md +17 -50
  345. package/knowledge/2.0/apps/worker2/features/clickup-custom-field-conventions.md +16 -26
  346. package/knowledge/2.0/apps/worker2/features/clickup-design-sprint-automation.md +52 -241
  347. package/knowledge/2.0/apps/worker2/features/clickup-general-automation.md +16 -32
  348. package/knowledge/2.0/apps/worker2/features/clickup-github-autolink.md +11 -21
  349. package/knowledge/2.0/apps/worker2/features/clickup-project-routing.md +58 -202
  350. package/knowledge/2.0/apps/worker2/features/clickup-richtext-api.md +22 -41
  351. package/knowledge/2.0/apps/worker2/features/clickup-subtask-activity.md +30 -79
  352. package/knowledge/2.0/apps/worker2/features/clickup-task-fluffer-talos.md +39 -106
  353. package/knowledge/2.0/apps/worker2/features/clickup-work-type-automation.md +20 -63
  354. package/knowledge/2.0/apps/worker2/features/compass-vip-support-importer.md +37 -119
  355. package/knowledge/2.0/apps/worker2/features/creating-worker-actions.md +99 -430
  356. package/knowledge/2.0/apps/worker2/features/cross-account-aws-access.md +78 -209
  357. package/knowledge/2.0/apps/worker2/features/elastic-beanstalk-health-monitor.md +95 -278
  358. package/knowledge/2.0/apps/worker2/features/elite-freshservice-sync.md +66 -96
  359. package/knowledge/2.0/apps/worker2/features/error-escalation-cron.md +118 -420
  360. package/knowledge/2.0/apps/worker2/features/error-issue-auto-resolution.md +53 -150
  361. package/knowledge/2.0/apps/worker2/features/etilize-catalog-item-import.md +42 -78
  362. package/knowledge/2.0/apps/worker2/features/etilize-item-translation-import.md +41 -75
  363. package/knowledge/2.0/apps/worker2/features/monitoring-framework.md +64 -172
  364. package/knowledge/2.0/apps/worker2/features/netsuite-clickup-opportunity-bidirectional-design.md +33 -87
  365. package/knowledge/2.0/apps/worker2/features/netsuite-integrations-monitor.md +37 -97
  366. package/knowledge/2.0/apps/worker2/features/netsuite-item-client-routing.md +39 -88
  367. package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-client-labels.md +94 -323
  368. package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-sync.md +208 -979
  369. package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-open-orders-sync.md +62 -181
  370. package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-outbound-push.md +123 -170
  371. package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-backfill-worker.md +51 -76
  372. package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-webhook-importer.md +73 -122
  373. package/knowledge/2.0/apps/worker2/features/netsuite-transferorder-outbound-push.md +131 -449
  374. package/knowledge/2.0/apps/worker2/features/notification-email-template.md +37 -97
  375. package/knowledge/2.0/apps/worker2/features/notification-email.md +49 -140
  376. package/knowledge/2.0/apps/worker2/features/nychh-asset-tag-backfill.md +35 -62
  377. package/knowledge/2.0/apps/worker2/features/oneuptime-incident-clickup-sync.md +52 -138
  378. package/knowledge/2.0/apps/worker2/features/oneuptime-worker2-monitoring.md +373 -540
  379. package/knowledge/2.0/apps/worker2/features/platform-cache-cleanup.md +50 -61
  380. package/knowledge/2.0/apps/worker2/features/qa-qc-branch-automation.md +42 -52
  381. package/knowledge/2.0/apps/worker2/features/qa-qc-review-pipeline.md +56 -66
  382. package/knowledge/2.0/apps/worker2/features/s3-folder-retention-cleanup.md +58 -74
  383. package/knowledge/2.0/apps/worker2/features/service-request-sales-order-generation.md +62 -175
  384. package/knowledge/2.0/apps/worker2/features/sso-stability-monitor.md +29 -69
  385. package/knowledge/2.0/apps/worker2/features/startech-webhook-handler.md +24 -33
  386. package/knowledge/2.0/apps/worker2/features/talos-meeting-notes-integration.md +35 -70
  387. package/knowledge/2.0/apps/worker2/features/talos-pricing-automation.md +50 -106
  388. package/knowledge/2.0/apps/worker2/features/talos-transcript-ingestion.md +319 -431
  389. package/knowledge/2.0/apps/worker2/features/team-sprint-management.md +244 -303
  390. package/knowledge/2.0/apps/worker2/features/teams-transcript-export.md +128 -173
  391. package/knowledge/2.0/apps/worker2/features/tracking-status-refresh.md +103 -124
  392. package/knowledge/2.0/apps/worker2/features/vapi-webhook-handler.md +198 -277
  393. package/knowledge/2.0/apps/worker2/features/wje-freshservice-sync.md +16 -21
  394. package/knowledge/2.0/apps/worker2/features/worker-fleet-role-assignment-monitor.md +97 -105
  395. package/knowledge/2.0/apps/worker2/workflows/clickup-credential-rotation.md +47 -52
  396. package/knowledge/2.0/apps/worker2/workflows/php-runtime-upgrade-dependency-audit.md +112 -120
  397. package/knowledge/2.0/apps/worker2/workflows/running-worker2-locally.md +88 -124
  398. package/knowledge/2.0/apps/worker2/workflows/ticket-to-pseudocode-planning.md +52 -49
  399. package/knowledge/2.0/standards/backend-php-cases.md +55 -0
  400. package/knowledge/2.0/standards/backend-php.md +23 -99
  401. package/knowledge/2.0/standards/backend-testing.md +29 -93
  402. package/knowledge/2.0/standards/framework-rules-cases.md +25 -0
  403. package/knowledge/2.0/standards/framework-rules.md +10 -47
  404. package/knowledge/2.0/standards/frontend-cases.md +57 -0
  405. package/knowledge/2.0/standards/frontend-deploy-cases.md +18 -0
  406. package/knowledge/2.0/standards/frontend-deploy.md +13 -34
  407. package/knowledge/2.0/standards/frontend.md +40 -111
  408. package/knowledge/2.0/standards/python.md +33 -76
  409. package/knowledge/2.0/standards/ssl-certificate-trust-model-cases.md +30 -0
  410. package/knowledge/2.0/standards/ssl-certificate-trust-model.md +20 -71
  411. package/knowledge/CONVENTIONS.md +52 -29
  412. package/knowledge/INDEX.md +1 -1
  413. package/knowledge/clients/adyen/INDEX.md +1 -1
  414. package/knowledge/clients/adyen/profile.md +38 -90
  415. package/knowledge/clients/aig/INDEX.md +3 -3
  416. package/knowledge/clients/aig/features/contract-reconciliation.md +55 -123
  417. package/knowledge/clients/aig/features/entitlement-intake.md +165 -536
  418. package/knowledge/clients/aig/profile.md +10 -22
  419. package/knowledge/clients/canon/INDEX.md +1 -1
  420. package/knowledge/clients/canon/profile.md +9 -17
  421. package/knowledge/clients/compass-canada/INDEX.md +7 -7
  422. package/knowledge/clients/compass-canada/features/french-item-feature-translations.md +21 -55
  423. package/knowledge/clients/compass-canada/features/french-order-email-localization.md +83 -306
  424. package/knowledge/clients/compass-canada/features/grand-and-toy-asn-import.md +70 -302
  425. package/knowledge/clients/compass-canada/features/item-fulfillment-tableviews.md +42 -104
  426. package/knowledge/clients/compass-canada/features/order-fulfillment-status-per-line.md +52 -178
  427. package/knowledge/clients/compass-canada/profile.md +31 -188
  428. package/knowledge/clients/compass-canada/workflows/grand-and-toy-asn-backfill.md +30 -104
  429. package/knowledge/clients/compass-usa/INDEX.md +35 -35
  430. package/knowledge/clients/compass-usa/features/approval-decision-flow.md +110 -570
  431. package/knowledge/clients/compass-usa/features/asn-to-item-fulfillment.md +56 -332
  432. package/knowledge/clients/compass-usa/features/contact-email-resolution.md +38 -94
  433. package/knowledge/clients/compass-usa/features/cost-centers.md +32 -114
  434. package/knowledge/clients/compass-usa/features/isfulfillable-data-quality-and-type-rule.md +56 -197
  435. package/knowledge/clients/compass-usa/features/item-catalogs-and-duplicate-items.md +52 -243
  436. package/knowledge/clients/compass-usa/features/item-fulfillment-tracking-tableview.md +30 -91
  437. package/knowledge/clients/compass-usa/features/mits-po-to-so-item-linking.md +51 -273
  438. package/knowledge/clients/compass-usa/features/mits-po-transmission-to-vendors.md +29 -112
  439. package/knowledge/clients/compass-usa/features/mits-po-zero-line-item-rejection.md +45 -124
  440. package/knowledge/clients/compass-usa/features/mits-sales-order-transmission-alerting.md +67 -213
  441. package/knowledge/clients/compass-usa/features/mr-ma-order-approval-and-status.md +50 -188
  442. package/knowledge/clients/compass-usa/features/odp-edi-850-item-resolution.md +63 -230
  443. package/knowledge/clients/compass-usa/features/odp-edi-855-acknowledgement-and-overquantity-guard.md +48 -166
  444. package/knowledge/clients/compass-usa/features/odp-edi-file-retention-and-retry.md +39 -121
  445. package/knowledge/clients/compass-usa/features/oneuptime-ma-refresh-order-monitor.md +33 -97
  446. package/knowledge/clients/compass-usa/features/order-fulfillment-status-per-line.md +68 -196
  447. package/knowledge/clients/compass-usa/features/people-file-user-lifecycle.md +53 -267
  448. package/knowledge/clients/compass-usa/features/persona-model-and-levy-gating.md +31 -109
  449. package/knowledge/clients/compass-usa/features/sales-order-line-renumbering.md +29 -116
  450. package/knowledge/clients/compass-usa/features/stranded-approval-reassignment.md +50 -164
  451. package/knowledge/clients/compass-usa/features/tracking-number-origin-and-asn-link.md +32 -70
  452. package/knowledge/clients/compass-usa/profile.md +1 -1
  453. package/knowledge/clients/compass-usa/workflows/catalog-fold-reversal.md +56 -259
  454. package/knowledge/clients/compass-usa/workflows/changing-a-kit-line-item.md +40 -117
  455. package/knowledge/clients/compass-usa/workflows/cross-kit-bundle-corruption.md +35 -71
  456. package/knowledge/clients/compass-usa/workflows/granting-api-access.md +43 -111
  457. package/knowledge/clients/compass-usa/workflows/granting-navigation-access.md +54 -206
  458. package/knowledge/clients/compass-usa/workflows/granting-persona-bundle-access.md +37 -140
  459. package/knowledge/clients/compass-usa/workflows/odp-duplicate-po-line-cleanup.md +34 -76
  460. package/knowledge/clients/compass-usa/workflows/odp-edi-import-recovery.md +33 -114
  461. package/knowledge/clients/compass-usa/workflows/odp-order-pipeline-to-netsuite.md +71 -371
  462. package/knowledge/clients/compass-usa/workflows/order-lifecycle-and-data-integrity.md +56 -172
  463. package/knowledge/clients/compass-usa/workflows/persona-population-env-comparison.md +20 -54
  464. package/knowledge/clients/compass-usa/workflows/persona-refactor-migration.md +51 -123
  465. package/knowledge/clients/elite/INDEX.md +7 -7
  466. package/knowledge/clients/elite/features/netsuite-togasupply-sync.md +67 -334
  467. package/knowledge/clients/elite/features/salesorder-netsuite-push.md +64 -215
  468. package/knowledge/clients/elite/features/salesorder-status-togadesk-reply.md +27 -57
  469. package/knowledge/clients/elite/features/supply2-scope.md +59 -190
  470. package/knowledge/clients/elite/features/supply2-tableview-config-drift.md +76 -239
  471. package/knowledge/clients/elite/features/togadesk-service-request-intake.md +57 -176
  472. package/knowledge/clients/elite/profile.md +31 -108
  473. package/knowledge/clients/endeavor-health/INDEX.md +1 -1
  474. package/knowledge/clients/endeavor-health/profile.md +7 -11
  475. package/knowledge/clients/fordham/INDEX.md +1 -1
  476. package/knowledge/clients/fordham/profile.md +10 -19
  477. package/knowledge/clients/growrk/INDEX.md +4 -4
  478. package/knowledge/clients/growrk/features/shipping-carrier-cleanup.md +23 -46
  479. package/knowledge/clients/growrk/features/transfer-order-flow.md +39 -88
  480. package/knowledge/clients/growrk/features/units-netsuite-custom-fields.md +59 -149
  481. package/knowledge/clients/growrk/profile.md +14 -46
  482. package/knowledge/clients/northwell/INDEX.md +2 -2
  483. package/knowledge/clients/northwell/features/sso-jit-provisioning.md +25 -75
  484. package/knowledge/clients/northwell/profile.md +12 -31
  485. package/knowledge/clients/nycdoe/INDEX.md +4 -4
  486. package/knowledge/clients/nycdoe/features/edi-850-receive-and-997-ack.md +28 -68
  487. package/knowledge/clients/nycdoe/features/hold-status-sync.md +72 -321
  488. package/knowledge/clients/nycdoe/features/servicenow-integration.md +132 -643
  489. package/knowledge/clients/nycdoe/profile.md +11 -28
  490. package/knowledge/clients/nychh/INDEX.md +8 -8
  491. package/knowledge/clients/nychh/features/location-shipping-addresses.md +36 -110
  492. package/knowledge/clients/nychh/features/netsuite-inventory-adjustment-fulfillment-link.md +55 -235
  493. package/knowledge/clients/nychh/features/netsuite-transfer-order-import.md +122 -492
  494. package/knowledge/clients/nychh/features/po-number-upstream-direction.md +19 -63
  495. package/knowledge/clients/nychh/features/talos-assistant-enablement.md +42 -106
  496. package/knowledge/clients/nychh/features/transfer-order-inventory-quantities.md +118 -386
  497. package/knowledge/clients/nychh/features/transfer-order-netsuite-push.md +79 -193
  498. package/knowledge/clients/nychh/profile.md +55 -363
  499. package/knowledge/clients/office-depot/INDEX.md +3 -3
  500. package/knowledge/clients/office-depot/features/odp-tech-support.md +30 -56
  501. package/knowledge/clients/office-depot/features/togarefresh2026-linkbuilder-routing.md +17 -21
  502. package/knowledge/clients/office-depot/profile.md +16 -46
  503. package/knowledge/clients/pcmaticb2b/INDEX.md +4 -4
  504. package/knowledge/clients/pcmaticb2b/features/startech-entitlement-provisioning.md +35 -101
  505. package/knowledge/clients/pcmaticb2b/features/startech-per-ticket-type-stages.md +42 -123
  506. package/knowledge/clients/pcmaticb2b/features/startech-ticket-sync.md +58 -105
  507. package/knowledge/clients/pcmaticb2b/profile.md +5 -10
  508. package/knowledge/clients/prudential/INDEX.md +15 -15
  509. package/knowledge/clients/prudential/features/dell-asn-units-interceptor.md +21 -69
  510. package/knowledge/clients/prudential/features/dell-lch-iop-transmissions.md +53 -170
  511. package/knowledge/clients/prudential/features/device-information-import-and-contact-linking.md +27 -115
  512. package/knowledge/clients/prudential/features/itemclasses-device-tier-data.md +25 -74
  513. package/knowledge/clients/prudential/features/oneuptime-order-pipeline-monitors.md +19 -55
  514. package/knowledge/clients/prudential/features/order-email-pdf-attachments.md +53 -177
  515. package/knowledge/clients/prudential/features/service-request-address-validation.md +51 -105
  516. package/knowledge/clients/prudential/features/service-request-auth-rejection-alert.md +37 -113
  517. package/knowledge/clients/prudential/features/service-request-rejection-alert-email.md +30 -77
  518. package/knowledge/clients/prudential/features/supply-orders-csv-export.md +29 -90
  519. package/knowledge/clients/prudential/features/transmit-ordershipped-email.md +58 -211
  520. package/knowledge/clients/prudential/profile.md +29 -81
  521. package/knowledge/clients/prudential/workflows/dell-asn-backfill-replay.md +14 -38
  522. package/knowledge/clients/prudential/workflows/http2-alb-workaround.md +15 -34
  523. package/knowledge/clients/prudential/workflows/store-saml-deploy-topology.md +39 -115
  524. package/knowledge/clients/quad/INDEX.md +5 -5
  525. package/knowledge/clients/quad/features/enter-po-details-vendor-selection-ev12.md +20 -36
  526. package/knowledge/clients/quad/features/multi-currency-item-pricing.md +43 -139
  527. package/knowledge/clients/quad/features/po-asn-email-import.md +48 -139
  528. package/knowledge/clients/quad/profile.md +24 -118
  529. package/knowledge/clients/quad/workflows/catalog-fold-reversal.md +36 -84
  530. package/knowledge/clients/rate/INDEX.md +12 -12
  531. package/knowledge/clients/rate/features/aig-contract-creation.md +90 -554
  532. package/knowledge/clients/rate/features/checkout-terms-delivery-preference.md +28 -69
  533. package/knowledge/clients/rate/features/home-warranty-terms-content.md +23 -65
  534. package/knowledge/clients/rate/features/monthly-reconciliation-report.md +18 -37
  535. package/knowledge/clients/rate/features/netsuite-cashsale-export.md +19 -56
  536. package/knowledge/clients/rate/features/paypal-subscription-purchase-webhook.md +60 -204
  537. package/knowledge/clients/rate/features/saml-sso.md +12 -16
  538. package/knowledge/clients/rate/features/service-card-entitlements.md +44 -141
  539. package/knowledge/clients/rate/features/service-purchase-emails.md +40 -132
  540. package/knowledge/clients/rate/features/subscription-cancellation.md +82 -412
  541. package/knowledge/clients/rate/features/whole-home-warranty-purchase-guard.md +97 -610
  542. package/knowledge/clients/rate/profile.md +3 -5
  543. package/knowledge/clients/rumcsi/INDEX.md +1 -1
  544. package/knowledge/clients/rumcsi/profile.md +34 -102
  545. package/knowledge/clients/spglobal/INDEX.md +1 -1
  546. package/knowledge/clients/spglobal/profile.md +7 -11
  547. package/knowledge/clients/staples/INDEX.md +2 -2
  548. package/knowledge/clients/staples/features/oneuptime-sftp-folder-monitors.md +30 -71
  549. package/knowledge/clients/staples/profile.md +9 -23
  550. package/knowledge/clients/tow-foundation/INDEX.md +2 -2
  551. package/knowledge/clients/tow-foundation/features/receipt-processing.md +96 -306
  552. package/knowledge/clients/tow-foundation/profile.md +18 -45
  553. package/knowledge/clients/true/INDEX.md +2 -2
  554. package/knowledge/clients/true/features/users-personas-data-model.md +12 -15
  555. package/knowledge/clients/true/profile.md +9 -31
  556. package/knowledge/clients/walmart/INDEX.md +4 -4
  557. package/knowledge/clients/walmart/features/customer-email-lifecycle.md +33 -66
  558. package/knowledge/clients/walmart/features/domain-migration.md +16 -13
  559. package/knowledge/clients/walmart/features/registration-route.md +23 -24
  560. package/knowledge/clients/walmart/profile.md +6 -11
  561. package/knowledge/clients/wje/INDEX.md +1 -1
  562. package/knowledge/clients/wje/profile.md +14 -19
  563. package/knowledge/standalone/apps/claude/INDEX.md +5 -5
  564. package/knowledge/standalone/apps/claude/features/review-enforcement-hooks.md +19 -44
  565. package/knowledge/standalone/apps/claude/workflows/harness-distribution.md +29 -40
  566. package/knowledge/standalone/apps/claude/workflows/knowledge-publish-pipeline.md +23 -43
  567. package/knowledge/standalone/apps/claude/workflows/mcp-tool-usage.md +68 -149
  568. package/knowledge/standalone/apps/claude/workflows/ticket-branch-creation-safety.md +32 -62
  569. package/knowledge/standalone/apps/forward/INDEX.md +3 -3
  570. package/knowledge/standalone/apps/forward/architecture.md +26 -71
  571. package/knowledge/standalone/apps/forward/features/encrypted-link-handler.md +19 -33
  572. package/knowledge/standalone/apps/forward/features/static-demo-hosting.md +33 -93
  573. package/knowledge/standalone/apps/togatech/INDEX.md +5 -5
  574. package/knowledge/standalone/apps/togatech/architecture.md +40 -71
  575. package/knowledge/standalone/apps/togatech/features/careers-paylocity-job-openings.md +31 -106
  576. package/knowledge/standalone/apps/togatech/features/seo-aeo-geo-prerender.md +11 -13
  577. package/knowledge/standalone/apps/togatech/workflows/creating-pull-requests.md +14 -13
  578. package/knowledge/standalone/apps/togatech/workflows/local-dev-and-headless-verification.md +15 -46
  579. package/knowledge/standalone/apps/websocket/INDEX.md +2 -2
  580. package/knowledge/standalone/apps/websocket/architecture.md +16 -22
  581. package/knowledge/standalone/apps/websocket/features/sqs-fanout.md +18 -50
  582. package/knowledge/standalone/standards/brand-naming-cases.md +21 -0
  583. package/knowledge/standalone/standards/brand-naming.md +7 -12
  584. package/knowledge/standalone/standards/communication-clarity.md +12 -42
  585. package/knowledge/standalone/standards/deploy-instruction-communication.md +7 -27
  586. package/knowledge/standalone/standards/session-priming.md +15 -57
  587. package/knowledge.js +5 -25
  588. package/package.json +1 -1
  589. package/skills/kickoff/SKILL.md +4 -5
@@ -53,12 +53,19 @@ Search first: `node .claude/knowledge.js search --repo=<repo> --q=<keywords>`
53
53
 
54
54
  ## Step 5 — Write the doc
55
55
 
56
- Structure: YAML frontmatter one-paragraph overview main contentcode examples (correct framework prefix).
57
-
58
- **On an UPDATE, append to `## Change history`, don't silently overwrite.** Every standard/architecture
59
- doc ends with a dated, attributed change-history list. Add a new line
60
- `- YYYY-MM-DD <what changed and why>. (<git-username>)` — and bump `updated:` in the frontmatter.
61
- Prefer a small UPDATE to an existing doc over a new near-duplicate.
56
+ **Follow the doc schema (CONVENTIONSRequired sections).** Frontmatter **first line = the
57
+ menu entry** (one sentence: what it is + when to open it) → the type's fixed sections in order
58
+ (feature: `## Summary` `## How it works` → `## Gotchas` `## Related`; workflow: `## Summary`
59
+ `## Steps` `## Gotchas` `## Related`; standard: rules only, cases in `<name>-cases.md`).
60
+ Correct framework prefix in code examples.
61
+
62
+ **Write for Claude, not humans (CONVENTIONS → Efficiency doctrine).** Terse and exact; no
63
+ narrative preamble, no restating the ticket. One rule, one home — link, don't restate.
64
+
65
+ **On an UPDATE, TIGHTEN — never append.** Re-read the whole doc and make it leaner. Bump
66
+ `updated:`. Prefer a small UPDATE over a near-duplicate; merge same-subject docs; delete a doc
67
+ that is no longer true (git keeps history). Do **not** keep an in-doc changelog — git history is
68
+ that record.
62
69
 
63
70
  ## Step 6 — Validate and re-index
64
71
 
@@ -44,14 +44,19 @@ subject doc — the default), **DEPRECATE/DELETE** (removed/obsolete), or **NO-O
44
44
  **Guardrails (enforce):**
45
45
  - One doc per **subject**, never one per change/bug/ticket.
46
46
  - **Bias UPDATE over CREATE.** A small "how it works" change updates the feature's
47
- *How it works* section + a dated *Change history* line — it does not spawn a file.
47
+ *How it works* section — it does not spawn a file.
48
+ - **Follow the doc schema + write for Claude (CONVENTIONS → Required sections / Efficiency
49
+ doctrine).** First line = menu entry; the type's fixed sections in order; terse, no human
50
+ prose; one rule, one home (link, don't restate).
51
+ - **UPDATE tightens, never appends.** Make the doc leaner; merge same-subject docs; delete
52
+ no-longer-true docs (git keeps history).
48
53
  - Relevance test: *"Will a teammate act differently in six months because this is
49
54
  written?"* If no → **NO-OP**. NO-OP is a blessed outcome; never manufacture a doc.
50
55
 
51
56
  **Type assignment (you assign; default `feature`):** capability/model/class → `feature`;
52
57
  standalone multi-step process → `workflow`; a client's override of a shared feature →
53
58
  `client-feature`; a reversible team-wide rule → `standard` (⚠ ELEVATED); a bug's durable
54
- lesson → a *gotcha* / *Change history* line on the owning doc, never its own doc.
59
+ lesson → a *gotcha* on the owning doc, never its own doc.
55
60
 
56
61
  ## Step 2 — Clients (auto — never wait to be asked)
57
62
 
@@ -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,26 +2,26 @@
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 |
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 |
27
- | [Rendering a 1.0 App_Email Template to HTML Offline (no DB, no send)](workflows/render-1-0-email-templates-offline.md) | How to produce a standalone `.html` copy of any 1.0 `App_Email` template no database, no mail server, no `EmailsQueued` row. |
5
+ | [Library (1.0 Framework) Architecture](architecture.md) | The 1.0 `App_` framework core: bootstrap/autoloader, the `app/` (`App_`) + `browser/` (`Browser_`) class trees, and vendored packages; open for how any 1.0 app |
6
+ | [Address Validation Gateway (App_Api_OfficeDepot::validateAddress + USPS fallback)](features/address-validation-gateway.md) | The shared 1.0 address-validation gateway (`App_Api_OfficeDepot::validateAddress` → USPS fallback); open when standardizing/verifying a typed address before sav |
7
+ | [Where a new App_ class goes — the app/ folder IS a behavioral contract](features/app-class-placement-base-contracts.md) | Where a new `App_` class goes each `app/` folder's base class carries real inherited behavior; open before creating any class under `app/model|client|api`. |
8
+ | [App_Sso — Reusable 1.0 SSO Initiation (SP-initiated SAML via saml.togahub.com)](features/app-sso-initiation.md) | Reusable 1.0 SP-initiated SAML SSO via `saml.togahub.com` (`App_Sso::initiate`); the canonical doc to follow for any "add SSO to `<1.0 app>`" request. |
9
+ | [Cron Execution Monitoring (App_Framework check-in/out → CronJobExecutions)](features/cron-execution-monitoring.md) | 1.0 cron check-in/out lifecycle via `App_Framework::cronInitialization()`/`cronFinished()` `Common.CronJobExecutions`; open to monitor a 1.0 cron or read its |
10
+ | [Diagnostic Dialog — View Recommended Services Routing](features/diagnostic-dialog-view-recommended-services.md) | TOGa Refresh 2026 "View Recommended Services" routing per-device diagnostic `resultCode` decides serviceselection vs techsupport; open when touching that rout |
11
+ | [Elite Freshservice Sync (library)](features/elite-freshservice-sync.md) | Elite bidirectional ticket/attachment sync between TOGA 2 and TOGaDesk (`App_Api_Toga2::syncWithTogadesk`); open for the sync mechanics, watermarks, and Elite-s |
12
+ | [App_Email Queued Sending & Attachments (Common.EmailsQueued)](features/email-queue-attachments.md) | 1.0 `App_Email` queued sending + attachment embedding via `Common.EmailsQueued`; open when a queued email loses attachments or when deploying worker/togadesk to |
13
+ | [Branded HTML Email Templates (App_Email_Template)](features/email-templates.md) | Branded HTML email base class `App_Email_Template` (header/body/footer); open when building or fixing a 1.0 branded email or its Outlook rendering. |
14
+ | [App_Email Side Effects & Test Mode (how to send a real email that writes nothing)](features/email-test-mode-and-write-free-sends.md) | 1.0 `App_Email::send()` side effects (log/queue writes, test-mode recipient rewrite) and how to send a genuinely write-free test; open before writing any 1.0 dr |
15
+ | [Error Capture in 1.0 (App_Error_Capture → shared 2.0 Logs DB)](features/error-capture-1-0.md) | 1.0 error-reporting into the shared 2.0 Logs DB (`App_Error_Capture::captureException`), mirroring 2.0's Issue/Event; open when adding a 1.0 capture path or deb |
16
+ | [HTTP 500 Error Monitor (App_SystemMonitor_500Error) — and why its \"Error Type\" is not a diagnosis](features/http-500-error-monitor.md) | 1.0 monitor `App_SystemMonitor_500Error` watching `Logs.Api` responseCode=500; open when an api2 500 alert arrives its "Error Type" is noise, use `error.id`. |
17
+ | [1.0 MVC Page Pattern & New-App Skeleton](features/mvc-page-pattern-and-app-skeleton.md) | Recipe for a new 1.0 (`App_`) app and for adding pages: folder-based MVC routing, page lifecycle, models, multi-DB config; open when standing up a 1.0 app or ad |
18
+ | [NetSuite File Cabinet Content Retrieval via RESTlet (fetchInvoiceFile)](features/netsuite-filecabinet-restlet.md) | How 1.0 pulls NetSuite File Cabinet binary content (invoice PDFs) via a SuiteScript RESTlet (`fetchInvoiceFile`); open when fetching NetSuite file bytes over RE |
19
+ | [assetType from NetSuite itemtype during Item Sync (opt-in per client)](features/netsuite-item-assettype-sync.md) | Stamp `Items.assetTypeId` from NetSuite `item.itemtype` during item sync (opt-in per client, fill-NULL-only); open before enabling asset-type mapping for a clie |
20
+ | [NetSuite classification → ItemClasses sync (opt-in per client)](features/netsuite-item-class-sync.md) | Mirror NetSuite's classification tree into client `ItemClasses` + stamp `Items.itemClassId` (`getCreateItemClass`, opt-in per client); open before enabling item |
21
+ | [isFulfillable from NetSuite during Item Sync (Phase 1)](features/netsuite-item-isfulfillable-sync.md) | 1.0 Phase-1 stamping of the NetSuite `isfulfillable` flag onto the Agilant source item during sync; open before changing fulfillability sync or a client overrid |
22
+ | [NetSuite SuiteQL/REST API Reference](features/netsuite-suiteql-api-reference.md) | Working reference for the Agilant NetSuite REST/SuiteQL integration (`App_Api_Netsuite_Rest`): auth, SuiteQL mechanics, table schemas, type/status codes, perfor |
23
+ | [NetSuite SuiteQL/REST Shim — Field Semantics](features/netsuite-suiteql-rest-shim.md) | Non-obvious NetSuite SuiteQL/REST field semantics behind `App_Api_Netsuite_Rest` shims (signs, `tl.id`==line, `iscogs`, ShipItem cost, `createdFrom`, shim-shape |
24
+ | [NetSuite Sync Alert Monitor (App_SystemMonitor_NetSuiteIntegration)](features/netsuite-sync-alert-monitor.md) | 1.0 monitor `App_SystemMonitor_NetSuiteIntegration` flags stale per-client NetSuite sync checkpoints (>48h) to ClickUp; open when a sync-stale alert is missin |
25
+ | [Startech PC Matic B2B Sync (library)](features/startech-pcmaticb2b-sync.md) | PC Matic B2B bidirectional ticket sync between TOGaDesk 1.0 and TOGA 2.0 (`App_Api_Toga2`); open for ticket-type maps, StarTech client onboarding, and the V1 th |
26
+ | [App_Api_Toga2 — TOGa2 API Client & 1.0↔2.0 Sync Bridge](features/toga2-api-client-and-bridge.md) | `App_Api_Toga2` the 1.0-side client for the TOGa2/api2 REST API + cross-framework sync routines (`send`/`authenticate`, options DSL, `syncWithToga`/`syncWithT |
27
+ | [Rendering a 1.0 App_Email Template to HTML Offline (no DB, no send)](workflows/render-1-0-email-templates-offline.md) | Produce a standalone `.html` copy of any 1.0 `App_Email` template offline (no DB / mail / queue) via stubs; open when asked "show me exactly what we email the c |
@@ -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.