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.
- package/agents/knowledge-writer.md +13 -6
- package/agents/session-capture.md +7 -2
- package/knowledge/1.0/apps/dbchanges/INDEX.md +1 -1
- package/knowledge/1.0/apps/dbchanges/workflows/authoring-and-shipping-sql-files.md +43 -114
- package/knowledge/1.0/apps/library/INDEX.md +23 -23
- package/knowledge/1.0/apps/library/architecture.md +25 -52
- package/knowledge/1.0/apps/library/features/address-validation-gateway.md +19 -53
- package/knowledge/1.0/apps/library/features/app-class-placement-base-contracts.md +19 -33
- package/knowledge/1.0/apps/library/features/app-sso-initiation.md +38 -75
- package/knowledge/1.0/apps/library/features/cron-execution-monitoring.md +24 -90
- package/knowledge/1.0/apps/library/features/diagnostic-dialog-view-recommended-services.md +33 -67
- package/knowledge/1.0/apps/library/features/elite-freshservice-sync.md +43 -71
- package/knowledge/1.0/apps/library/features/email-queue-attachments.md +34 -84
- package/knowledge/1.0/apps/library/features/email-templates.md +35 -84
- package/knowledge/1.0/apps/library/features/email-test-mode-and-write-free-sends.md +37 -98
- package/knowledge/1.0/apps/library/features/error-capture-1-0.md +57 -271
- package/knowledge/1.0/apps/library/features/http-500-error-monitor.md +33 -117
- package/knowledge/1.0/apps/library/features/mvc-page-pattern-and-app-skeleton.md +21 -42
- package/knowledge/1.0/apps/library/features/netsuite-filecabinet-restlet.md +29 -87
- package/knowledge/1.0/apps/library/features/netsuite-item-assettype-sync.md +58 -142
- package/knowledge/1.0/apps/library/features/netsuite-item-class-sync.md +32 -97
- package/knowledge/1.0/apps/library/features/netsuite-item-isfulfillable-sync.md +39 -147
- package/knowledge/1.0/apps/library/features/netsuite-suiteql-api-reference.md +116 -381
- package/knowledge/1.0/apps/library/features/netsuite-suiteql-rest-shim.md +71 -451
- package/knowledge/1.0/apps/library/features/netsuite-sync-alert-monitor.md +25 -104
- package/knowledge/1.0/apps/library/features/startech-pcmaticb2b-sync.md +24 -56
- package/knowledge/1.0/apps/library/features/toga2-api-client-and-bridge.md +97 -489
- package/knowledge/1.0/apps/library/workflows/render-1-0-email-templates-offline.md +17 -37
- package/knowledge/1.0/apps/store/INDEX.md +2 -2
- package/knowledge/1.0/apps/store/architecture.md +13 -33
- package/knowledge/1.0/apps/store/features/saml-sso-certificate-and-keys.md +31 -116
- package/knowledge/1.0/apps/test/INDEX.md +16 -16
- package/knowledge/1.0/apps/test/architecture.md +15 -38
- package/knowledge/1.0/apps/test/features/2-0-deployment-client-sql.md +11 -17
- package/knowledge/1.0/apps/test/features/active-directory-auth-test.md +8 -12
- package/knowledge/1.0/apps/test/features/compass-retrofix2-sql-generator.md +39 -63
- package/knowledge/1.0/apps/test/features/create-elastic-beanstalk.md +22 -49
- package/knowledge/1.0/apps/test/features/dev-generators.md +12 -17
- package/knowledge/1.0/apps/test/features/forecast-netsuite-discrepancy-analysis.md +11 -20
- package/knowledge/1.0/apps/test/features/github-audit-script.md +13 -31
- package/knowledge/1.0/apps/test/features/goagilant-to-togatech-email-migration.md +28 -63
- package/knowledge/1.0/apps/test/features/static-no-db-regression-harness.md +44 -99
- package/knowledge/1.0/apps/test/features/tableview-builder.md +10 -17
- package/knowledge/1.0/apps/test/features/talos-kb-pipeline.md +38 -84
- package/knowledge/1.0/apps/test/features/toga2-client-onboarding-sql.md +17 -43
- package/knowledge/1.0/apps/test/features/toga2-onboarding-wizard.md +29 -66
- package/knowledge/1.0/apps/test/features/toga2-user-cross-client-access-sql.md +11 -16
- package/knowledge/1.0/apps/test/features/url-domain-markdown-document.md +10 -16
- package/knowledge/1.0/apps/toga/INDEX.md +2 -2
- package/knowledge/1.0/apps/toga/features/bundleconfirmation-cart-preservation.md +11 -23
- package/knowledge/1.0/apps/toga/features/odp-customer-search-loyalty-persistence.md +19 -57
- package/knowledge/1.0/apps/togadesk/INDEX.md +12 -12
- package/knowledge/1.0/apps/togadesk/architecture.md +44 -121
- package/knowledge/1.0/apps/togadesk/features/email-to-ticket-intake.md +42 -123
- package/knowledge/1.0/apps/togadesk/features/field-service-dispatch.md +37 -127
- package/knowledge/1.0/apps/togadesk/features/managed-service-order-create.md +37 -128
- package/knowledge/1.0/apps/togadesk/features/notifications.md +18 -63
- package/knowledge/1.0/apps/togadesk/features/per-client-host-restriction.md +26 -107
- package/knowledge/1.0/apps/togadesk/features/rest-api.md +27 -42
- package/knowledge/1.0/apps/togadesk/features/smb-contract-editing.md +23 -39
- package/knowledge/1.0/apps/togadesk/features/staff-login-authentication.md +22 -58
- package/knowledge/1.0/apps/togadesk/features/ticket-lifecycle.md +38 -120
- package/knowledge/1.0/apps/togadesk/workflows/production-revert-forward.md +21 -35
- package/knowledge/1.0/apps/togadesk/workflows/standalone-test-scripts.md +15 -42
- package/knowledge/1.0/apps/togaview/INDEX.md +7 -7
- package/knowledge/1.0/apps/togaview/architecture.md +45 -127
- package/knowledge/1.0/apps/togaview/features/login-flows.md +42 -142
- package/knowledge/1.0/apps/togaview/features/msp-dashboard.md +16 -37
- package/knowledge/1.0/apps/togaview/features/retail-commerce-lifecycle.md +25 -43
- package/knowledge/1.0/apps/togaview/features/ticket-detail-page.md +38 -134
- package/knowledge/1.0/apps/togaview/workflows/git-and-php-tooling-under-the-underscore-app-root.md +15 -26
- package/knowledge/1.0/apps/togaview/workflows/route53-cross-account-zone-migration.md +16 -42
- package/knowledge/1.0/apps/tools/INDEX.md +17 -17
- package/knowledge/1.0/apps/tools/architecture.md +28 -180
- package/knowledge/1.0/apps/tools/features/clickup-label-aliases-admin.md +35 -78
- package/knowledge/1.0/apps/tools/features/clickup-sprint-dashboard.md +49 -209
- package/knowledge/1.0/apps/tools/features/cloudfront-client-setup.md +36 -125
- package/knowledge/1.0/apps/tools/features/compass-user-persona-admin.md +0 -37
- package/knowledge/1.0/apps/tools/features/design-demo-admin.md +45 -150
- package/knowledge/1.0/apps/tools/features/developer-tools.md +15 -28
- package/knowledge/1.0/apps/tools/features/errors-curation-console.md +85 -345
- package/knowledge/1.0/apps/tools/features/github-audit.md +35 -124
- package/knowledge/1.0/apps/tools/features/legacy-email-notifier.md +26 -80
- package/knowledge/1.0/apps/tools/features/mvc-data-access-patterns.md +62 -151
- package/knowledge/1.0/apps/tools/features/oneuptime-monitor-status-panel.md +52 -243
- package/knowledge/1.0/apps/tools/features/persona-gated-navigation.md +21 -45
- package/knowledge/1.0/apps/tools/features/saml-sso-auth.md +50 -156
- package/knowledge/1.0/apps/tools/features/talos-kb-documents-admin.md +82 -422
- package/knowledge/1.0/apps/tools/features/talos-pricing-ui.md +30 -77
- package/knowledge/1.0/apps/tools/features/theme-light-dark.md +44 -130
- package/knowledge/1.0/apps/tools/workflows/deploy-to-elastic-beanstalk-al2023.md +55 -233
- package/knowledge/1.0/apps/walmarttechservices/INDEX.md +1 -1
- package/knowledge/1.0/apps/walmarttechservices/architecture.md +32 -81
- package/knowledge/1.0/apps/webhook/INDEX.md +1 -1
- package/knowledge/1.0/apps/webhook/features/netsuite-clickup-opportunity-sync.md +51 -174
- package/knowledge/1.0/apps/worker/INDEX.md +19 -19
- package/knowledge/1.0/apps/worker/architecture.md +64 -166
- package/knowledge/1.0/apps/worker/features/canon-received-po-netsuite-order-sync.md +10 -12
- package/knowledge/1.0/apps/worker/features/compass-ma-sales-order-exception-report.md +10 -27
- package/knowledge/1.0/apps/worker/features/compass-manager-approval-reminder-emails.md +11 -11
- package/knowledge/1.0/apps/worker/features/compass-partial-in-transit-delivered-emails.md +9 -72
- package/knowledge/1.0/apps/worker/features/elite-togadesk-attachment-sync.md +16 -9
- package/knowledge/1.0/apps/worker/features/forecast2-netsuite-reconciliation.md +10 -212
- package/knowledge/1.0/apps/worker/features/forecast2-supporting-records-import.md +13 -24
- package/knowledge/1.0/apps/worker/features/netsuite-sales-order-sales-rep-sourcing.md +8 -9
- package/knowledge/1.0/apps/worker/features/netsuite-togasupply-per-client-sync.md +22 -500
- package/knowledge/1.0/apps/worker/features/oneuptime-server-monitor-host-hygiene.md +12 -15
- package/knowledge/1.0/apps/worker/features/oneuptime-worker-uptime-monitoring.md +14 -16
- package/knowledge/1.0/apps/worker/features/send-shipments-for-the-day.md +11 -7
- package/knowledge/1.0/apps/worker/features/staples-cxml-order-import.md +11 -11
- package/knowledge/1.0/apps/worker/workflows/diagnosing-frozen-cron-checkins.md +23 -70
- package/knowledge/1.0/apps/worker/workflows/isfulfillable-multi-client-backfill.md +26 -82
- package/knowledge/1.0/apps/worker/workflows/netsuite-duplicate-items-dedup.md +28 -111
- package/knowledge/1.0/apps/worker/workflows/onboarding-client-to-netsuite-togasupply-sync.md +41 -173
- package/knowledge/1.0/apps/worker/workflows/tracing-a-worker-cron-run-in-production.md +63 -184
- package/knowledge/1.0/standards/backend-php-cases.md +75 -0
- package/knowledge/1.0/standards/backend-php.md +181 -343
- package/knowledge/1.0/standards/framework-rules-cases.md +26 -0
- package/knowledge/1.0/standards/framework-rules.md +25 -52
- package/knowledge/1.0/standards/frontend-cases.md +37 -0
- package/knowledge/1.0/standards/frontend.md +30 -92
- package/knowledge/2.0/apps/_underscore/INDEX.md +62 -62
- package/knowledge/2.0/apps/_underscore/architecture/surface-authoring-proposal.md +3 -1
- package/knowledge/2.0/apps/_underscore/architecture.md +4 -14
- package/knowledge/2.0/apps/_underscore/features/acl-permission-chain.md +78 -264
- package/knowledge/2.0/apps/_underscore/features/address-uniqueness-normalization.md +34 -67
- package/knowledge/2.0/apps/_underscore/features/address-validation.md +55 -130
- package/knowledge/2.0/apps/_underscore/features/apirequest-json-content-type.md +9 -47
- package/knowledge/2.0/apps/_underscore/features/assortment-name-translation.md +19 -63
- package/knowledge/2.0/apps/_underscore/features/async-query-execution.md +37 -86
- package/knowledge/2.0/apps/_underscore/features/autoincrement-record-numbering.md +22 -59
- package/knowledge/2.0/apps/_underscore/features/calculated-column-filter-options.md +11 -11
- package/knowledge/2.0/apps/_underscore/features/calculated-sql-fields.md +20 -90
- package/knowledge/2.0/apps/_underscore/features/carrier-shipping-labels.md +22 -86
- package/knowledge/2.0/apps/_underscore/features/cli-script-bootstrap.md +5 -13
- package/knowledge/2.0/apps/_underscore/features/cloud-s3-helpers.md +21 -60
- package/knowledge/2.0/apps/_underscore/features/cloud-secrets-manager.md +19 -43
- package/knowledge/2.0/apps/_underscore/features/component-model-namespace-registration.md +14 -37
- package/knowledge/2.0/apps/_underscore/features/config-group-access.md +16 -30
- package/knowledge/2.0/apps/_underscore/features/core-domains-app-host-registry.md +16 -19
- package/knowledge/2.0/apps/_underscore/features/database-alias-repointing.md +11 -16
- package/knowledge/2.0/apps/_underscore/features/effective-persona-resolution.md +9 -9
- package/knowledge/2.0/apps/_underscore/features/email-send-pipeline.md +15 -48
- package/knowledge/2.0/apps/_underscore/features/email-template-sending.md +28 -83
- package/knowledge/2.0/apps/_underscore/features/error-reporting-issue-event.md +117 -317
- package/knowledge/2.0/apps/_underscore/features/event-publish-sqs.md +7 -8
- package/knowledge/2.0/apps/_underscore/features/field-storage-row-hydration.md +13 -14
- package/knowledge/2.0/apps/_underscore/features/forecast-sale-import.md +31 -198
- package/knowledge/2.0/apps/_underscore/features/fulfillable-item-propagation.md +14 -35
- package/knowledge/2.0/apps/_underscore/features/item-classification-itemclasses.md +18 -24
- package/knowledge/2.0/apps/_underscore/features/item-fulfillment-stage-lifecycle-and-order-status.md +14 -42
- package/knowledge/2.0/apps/_underscore/features/model-interceptor-unit-testing.md +13 -24
- package/knowledge/2.0/apps/_underscore/features/model-magic-field-access.md +12 -38
- package/knowledge/2.0/apps/_underscore/features/model-save-parent-cascade-stored-field-deadlock.md +36 -84
- package/knowledge/2.0/apps/_underscore/features/model-save-vs-query-atomic-update.md +28 -77
- package/knowledge/2.0/apps/_underscore/features/model-storage-field-s3.md +22 -44
- package/knowledge/2.0/apps/_underscore/features/netsuite-rest-client.md +78 -307
- package/knowledge/2.0/apps/_underscore/features/netsuite-salesorder-address-phone-sync.md +38 -88
- package/knowledge/2.0/apps/_underscore/features/note-record-authorship.md +22 -51
- package/knowledge/2.0/apps/_underscore/features/outbound-api-rate-budget.md +40 -138
- package/knowledge/2.0/apps/_underscore/features/page-meta-context-field-settings.md +35 -186
- package/knowledge/2.0/apps/_underscore/features/per-client-database-connections.md +39 -238
- package/knowledge/2.0/apps/_underscore/features/persona-name-translation.md +44 -142
- package/knowledge/2.0/apps/_underscore/features/record-change-audit-log.md +42 -147
- package/knowledge/2.0/apps/_underscore/features/recursive-item-fulfillments.md +38 -163
- package/knowledge/2.0/apps/_underscore/features/sales-order-denial-reason.md +81 -299
- package/knowledge/2.0/apps/_underscore/features/sales-order-po-number-sourcing.md +25 -86
- package/knowledge/2.0/apps/_underscore/features/sales-order-purchase-order-bridge-direction.md +28 -91
- package/knowledge/2.0/apps/_underscore/features/sales-order-status-filter-surface.md +40 -82
- package/knowledge/2.0/apps/_underscore/features/shipping-carriers-and-accounts.md +37 -98
- package/knowledge/2.0/apps/_underscore/features/string-html-entity-helpers.md +23 -59
- package/knowledge/2.0/apps/_underscore/features/surface-field-recordfield-binding.md +54 -150
- package/knowledge/2.0/apps/_underscore/features/surface-resolver.md +209 -851
- package/knowledge/2.0/apps/_underscore/features/tableview-hyperlink-columns.md +50 -85
- package/knowledge/2.0/apps/_underscore/features/tableview-joins.md +118 -324
- package/knowledge/2.0/apps/_underscore/features/togaiq-gateway-client.md +45 -105
- package/knowledge/2.0/apps/_underscore/features/tracking-number-bridges.md +45 -249
- package/knowledge/2.0/apps/_underscore/features/units-for-items-for-purchase-orders.md +48 -156
- package/knowledge/2.0/apps/_underscore/features/user-email-as-identity-and-password-reset.md +26 -56
- package/knowledge/2.0/apps/_underscore/features/usps-dpv-deliverability.md +29 -53
- package/knowledge/2.0/apps/_underscore/workflows/local-db-refresh-from-beta.md +23 -99
- package/knowledge/2.0/apps/_underscore/workflows/recreated-shared-branch-stale-local-remerge.md +38 -91
- package/knowledge/2.0/apps/_underscore/workflows/rotating-public-tls-certificates.md +44 -151
- package/knowledge/2.0/apps/_underscore/workflows/running-a-2.0-app-locally.md +28 -102
- package/knowledge/2.0/apps/ai-bdr/INDEX.md +13 -13
- package/knowledge/2.0/apps/ai-bdr/architecture.md +31 -100
- package/knowledge/2.0/apps/ai-bdr/features/bdr-web-funnel-plan.md +128 -460
- package/knowledge/2.0/apps/ai-bdr/features/call-orchestration.md +55 -121
- package/knowledge/2.0/apps/ai-bdr/features/campaign-chat-handoff.md +68 -169
- package/knowledge/2.0/apps/ai-bdr/features/landing-call-flow.md +75 -188
- package/knowledge/2.0/apps/ai-bdr/features/landing-chat-drawer.md +78 -249
- package/knowledge/2.0/apps/ai-bdr/features/live-call-status.md +46 -104
- package/knowledge/2.0/apps/ai-bdr/features/security-landing-page.md +82 -266
- package/knowledge/2.0/apps/ai-bdr/features/vapi-integration.md +42 -108
- package/knowledge/2.0/apps/ai-bdr/features/web-funnel-app.md +213 -879
- package/knowledge/2.0/apps/ai-bdr/features/web-funnel-content-model.md +63 -194
- package/knowledge/2.0/apps/ai-bdr/workflows/new-campaign-onboarding.md +51 -88
- package/knowledge/2.0/apps/ai-bdr/workflows/safe-call-loop-testing.md +60 -187
- package/knowledge/2.0/apps/api2/INDEX.md +26 -26
- package/knowledge/2.0/apps/api2/architecture.md +91 -461
- package/knowledge/2.0/apps/api2/features/api-key-authentication-and-scoping.md +32 -77
- package/knowledge/2.0/apps/api2/features/api-payload-interceptors.md +166 -652
- package/knowledge/2.0/apps/api2/features/cross-client-data-retrieval.md +63 -282
- package/knowledge/2.0/apps/api2/features/cxml-shipnotice-gateway.md +57 -151
- package/knowledge/2.0/apps/api2/features/encrypted-user-uuid-auth-handoff.md +22 -45
- package/knowledge/2.0/apps/api2/features/environment-variable-drives-underscore-branch.md +57 -339
- package/knowledge/2.0/apps/api2/features/health-check-endpoint.md +27 -64
- package/knowledge/2.0/apps/api2/features/language-translation-layer.md +57 -283
- package/knowledge/2.0/apps/api2/features/login-cross-client-user-resolution.md +18 -59
- package/knowledge/2.0/apps/api2/features/nested-fk-acl-embedding.md +24 -84
- package/knowledge/2.0/apps/api2/features/nested-relationship-writes.md +86 -474
- package/knowledge/2.0/apps/api2/features/record-scripts.md +58 -344
- package/knowledge/2.0/apps/api2/features/request-logging.md +119 -436
- package/knowledge/2.0/apps/api2/features/scripted-api-post-body-args.md +30 -59
- package/knowledge/2.0/apps/api2/features/sprint-dashboard-api.md +30 -93
- package/knowledge/2.0/apps/api2/features/surface-meta-option.md +19 -91
- package/knowledge/2.0/apps/api2/features/tableview-apiwhereclause-row-filtering.md +32 -104
- package/knowledge/2.0/apps/api2/features/tableview-field-metadata.md +59 -274
- package/knowledge/2.0/apps/api2/features/tickets-api.md +21 -47
- package/knowledge/2.0/apps/api2/features/v2-api-error-codes.md +79 -353
- package/knowledge/2.0/apps/api2/features/v2-deadlock-retry.md +50 -188
- package/knowledge/2.0/apps/api2/features/v2-rest-query-contract.md +102 -542
- package/knowledge/2.0/apps/api2/features/v2-reverse-hasmany-fields-whitelist.md +15 -51
- package/knowledge/2.0/apps/api2/workflows/codepipeline-codeconnections-deploy.md +65 -294
- package/knowledge/2.0/apps/api2/workflows/environment-configuration-and-provisioning.md +40 -123
- package/knowledge/2.0/apps/dbchanges2/INDEX.md +11 -11
- package/knowledge/2.0/apps/dbchanges2/architecture.md +104 -402
- package/knowledge/2.0/apps/dbchanges2/features/rerunnable-additive-inserts.md +64 -253
- package/knowledge/2.0/apps/dbchanges2/features/surface-layer-schema.md +401 -1543
- package/knowledge/2.0/apps/dbchanges2/workflows/client-onboarding.md +31 -80
- package/knowledge/2.0/apps/dbchanges2/workflows/client-schema-drift-audit.md +92 -265
- package/knowledge/2.0/apps/dbchanges2/workflows/deleting-contacts-from-a-client-database.md +23 -50
- package/knowledge/2.0/apps/dbchanges2/workflows/framework-branch-ahead-of-schema.md +67 -177
- package/knowledge/2.0/apps/dbchanges2/workflows/local-vs-prod-mysql-config-parity.md +31 -76
- package/knowledge/2.0/apps/dbchanges2/workflows/nonprod-metadata-drift-repair.md +99 -316
- package/knowledge/2.0/apps/dbchanges2/workflows/targeting-the-right-database.md +45 -155
- package/knowledge/2.0/apps/dbchanges2/workflows/verifying-a-migration-ran.md +16 -33
- package/knowledge/2.0/apps/saml/INDEX.md +6 -6
- package/knowledge/2.0/apps/saml/architecture.md +22 -42
- package/knowledge/2.0/apps/saml/features/downstream-integration-contract.md +19 -33
- package/knowledge/2.0/apps/saml/features/healthcheck-endpoint.md +31 -97
- package/knowledge/2.0/apps/saml/features/rate-user-provisioning.md +10 -9
- package/knowledge/2.0/apps/saml/workflows/onboarding-a-new-sso-client.md +23 -63
- package/knowledge/2.0/apps/saml/workflows/rotating-the-saml-sp-certificate.md +72 -193
- package/knowledge/2.0/apps/talos/INDEX.md +8 -8
- package/knowledge/2.0/apps/talos/architecture.md +48 -129
- package/knowledge/2.0/apps/talos/features/aegra-api.md +66 -153
- package/knowledge/2.0/apps/talos/features/chat-frontend.md +39 -96
- package/knowledge/2.0/apps/talos/features/deployment.md +29 -53
- package/knowledge/2.0/apps/talos/features/mcp-servers.md +39 -75
- package/knowledge/2.0/apps/talos/features/observability.md +34 -62
- package/knowledge/2.0/apps/talos/features/pricing-cogs-model.md +66 -143
- package/knowledge/2.0/apps/talos/features/talos-agent.md +56 -95
- package/knowledge/2.0/apps/talos-backend/INDEX.md +1 -1
- package/knowledge/2.0/apps/talos-backend/workflows/toga-supply-client-onboarding.md +59 -149
- package/knowledge/2.0/apps/toga-blox/INDEX.md +14 -14
- package/knowledge/2.0/apps/toga-blox/architecture.md +25 -56
- package/knowledge/2.0/apps/toga-blox/features/add-notes-template.md +20 -40
- package/knowledge/2.0/apps/toga-blox/features/advanced-select.md +23 -49
- package/knowledge/2.0/apps/toga-blox/features/api-client.md +36 -143
- package/knowledge/2.0/apps/toga-blox/features/base-input.md +20 -35
- package/knowledge/2.0/apps/toga-blox/features/blox-authoring-defects.md +61 -178
- package/knowledge/2.0/apps/toga-blox/features/primary-table-templates.md +59 -179
- package/knowledge/2.0/apps/toga-blox/features/table-record-modal.md +32 -58
- package/knowledge/2.0/apps/toga-blox/features/table.md +50 -215
- package/knowledge/2.0/apps/toga-blox/features/talos-assistant.md +74 -303
- package/knowledge/2.0/apps/toga-blox/features/toaster.md +20 -56
- package/knowledge/2.0/apps/toga-blox/workflows/dynamic-publish-pipeline.md +49 -272
- package/knowledge/2.0/apps/toga-blox/workflows/landing-a-large-feature-branch.md +21 -60
- package/knowledge/2.0/apps/toga-blox/workflows/local-link-into-a-consumer-app.md +65 -254
- package/knowledge/2.0/apps/toga2-commerce/INDEX.md +18 -18
- package/knowledge/2.0/apps/toga2-commerce/architecture.md +32 -98
- package/knowledge/2.0/apps/toga2-commerce/features/bundle-item-visibility-and-selectability.md +51 -128
- package/knowledge/2.0/apps/toga2-commerce/features/cart-bundle-submission-and-identity.md +23 -61
- package/knowledge/2.0/apps/toga2-commerce/features/cart-notification-emails.md +55 -142
- package/knowledge/2.0/apps/toga2-commerce/features/cart-order-total-computation.md +17 -30
- package/knowledge/2.0/apps/toga2-commerce/features/cart-page-config-architecture.md +81 -221
- package/knowledge/2.0/apps/toga2-commerce/features/catalog-cache-freshness.md +53 -168
- package/knowledge/2.0/apps/toga2-commerce/features/category-tile-sort-order.md +27 -78
- package/knowledge/2.0/apps/toga2-commerce/features/client-fields.md +120 -393
- package/knowledge/2.0/apps/toga2-commerce/features/expedited-shipping-gating.md +29 -110
- package/knowledge/2.0/apps/toga2-commerce/features/filter-search-results-page.md +27 -80
- package/knowledge/2.0/apps/toga2-commerce/features/inactive-item-purchase-gating.md +46 -135
- package/knowledge/2.0/apps/toga2-commerce/features/multi-tenant-theming.md +36 -62
- package/knowledge/2.0/apps/toga2-commerce/features/order-submit-sync-sequencing.md +38 -102
- package/knowledge/2.0/apps/toga2-commerce/features/shipping-cost-waiver-gating.md +28 -64
- package/knowledge/2.0/apps/toga2-commerce/workflows/amplify-build-and-deploy.md +52 -188
- package/knowledge/2.0/apps/toga2-commerce/workflows/cypress-testing.md +62 -144
- package/knowledge/2.0/apps/toga2-commerce/workflows/http2-protocol-error-diagnosis.md +36 -53
- package/knowledge/2.0/apps/toga2-hub/INDEX.md +2 -2
- package/knowledge/2.0/apps/toga2-hub/architecture.md +36 -85
- package/knowledge/2.0/apps/toga2-hub/features/acl-permissions-rendering.md +51 -85
- package/knowledge/2.0/apps/toga2-supply/INDEX.md +8 -8
- package/knowledge/2.0/apps/toga2-supply/architecture.md +20 -36
- package/knowledge/2.0/apps/toga2-supply/features/currency-amount-lines-editor.md +63 -156
- package/knowledge/2.0/apps/toga2-supply/features/fulfill-and-ship.md +203 -942
- package/knowledge/2.0/apps/toga2-supply/features/order-detail-field-config-and-customer-name.md +38 -99
- package/knowledge/2.0/apps/toga2-supply/features/table-data-additional-filters.md +22 -54
- package/knowledge/2.0/apps/toga2-supply/workflows/amplify-build-and-deploy.md +29 -89
- package/knowledge/2.0/apps/toga2-supply/workflows/client-host-scoping.md +79 -215
- package/knowledge/2.0/apps/toga2-supply/workflows/onboarding-a-client-to-fulfill-and-ship.md +29 -37
- package/knowledge/2.0/apps/toga2-view/INDEX.md +9 -9
- package/knowledge/2.0/apps/toga2-view/architecture.md +33 -98
- package/knowledge/2.0/apps/toga2-view/features/get-support-cancel-subscription.md +42 -132
- package/knowledge/2.0/apps/toga2-view/features/mobile-nav-header.md +15 -14
- package/knowledge/2.0/apps/toga2-view/features/property-questions-eligibility.md +15 -39
- package/knowledge/2.0/apps/toga2-view/features/query-string-builder.md +19 -39
- package/knowledge/2.0/apps/toga2-view/features/reference-dropdown-sorting.md +16 -32
- package/knowledge/2.0/apps/toga2-view/features/service-card.md +21 -24
- package/knowledge/2.0/apps/toga2-view/features/terms-and-conditions-page.md +18 -56
- package/knowledge/2.0/apps/toga2-view/features/zip-validation-contact-phone.md +11 -23
- package/knowledge/2.0/apps/toga25-supply/INDEX.md +19 -19
- package/knowledge/2.0/apps/toga25-supply/architecture.md +34 -103
- package/knowledge/2.0/apps/toga25-supply/features/action-button-rule-engine.md +30 -119
- package/knowledge/2.0/apps/toga25-supply/features/client-api-fetch-fields.md +25 -87
- package/knowledge/2.0/apps/toga25-supply/features/client-configurable-fields.md +37 -162
- package/knowledge/2.0/apps/toga25-supply/features/column-visibility.md +57 -177
- package/knowledge/2.0/apps/toga25-supply/features/force-logout-on-deployment.md +10 -47
- package/knowledge/2.0/apps/toga25-supply/features/meta-driven-table-data.md +39 -119
- package/knowledge/2.0/apps/toga25-supply/features/persisted-query-cache.md +34 -94
- package/knowledge/2.0/apps/toga25-supply/features/record-modals-and-nested-tables.md +85 -365
- package/knowledge/2.0/apps/toga25-supply/features/server-table-url-state.md +30 -83
- package/knowledge/2.0/apps/toga25-supply/features/side-navigation-and-default-route.md +20 -64
- package/knowledge/2.0/apps/toga25-supply/features/sso-redirect-and-session-gating.md +16 -71
- package/knowledge/2.0/apps/toga25-supply/features/surface-frontend.md +323 -1383
- package/knowledge/2.0/apps/toga25-supply/features/talos-integration.md +67 -272
- package/knowledge/2.0/apps/toga25-supply/features/toolbar-button-chrome.md +20 -59
- package/knowledge/2.0/apps/toga25-supply/features/transfer-orders-page.md +328 -1004
- package/knowledge/2.0/apps/toga25-supply/workflows/amplify-deployment.md +46 -222
- package/knowledge/2.0/apps/toga25-supply/workflows/cypress-testing.md +116 -349
- package/knowledge/2.0/apps/toga25-supply/workflows/porting-a-page-from-toga2-supply.md +16 -47
- package/knowledge/2.0/apps/voice-to-voice/INDEX.md +4 -4
- package/knowledge/2.0/apps/voice-to-voice/architecture.md +33 -78
- package/knowledge/2.0/apps/voice-to-voice/features/livekit-pipeline.md +44 -71
- package/knowledge/2.0/apps/voice-to-voice/features/post-call-lambda.md +40 -71
- package/knowledge/2.0/apps/voice-to-voice/features/ticket-api-integration.md +55 -101
- package/knowledge/2.0/apps/worker2/INDEX.md +61 -61
- package/knowledge/2.0/apps/worker2/architecture.md +55 -248
- package/knowledge/2.0/apps/worker2/features/alb-target-group-auto-registration.md +47 -153
- package/knowledge/2.0/apps/worker2/features/all-client-email-queue-monitor.md +46 -136
- package/knowledge/2.0/apps/worker2/features/api-stability-monitor.md +36 -116
- package/knowledge/2.0/apps/worker2/features/automated-pr-merger-force-push-race.md +23 -38
- package/knowledge/2.0/apps/worker2/features/callback-scheduling.md +100 -199
- package/knowledge/2.0/apps/worker2/features/clickup-connectivity-watchdog.md +17 -50
- package/knowledge/2.0/apps/worker2/features/clickup-custom-field-conventions.md +16 -26
- package/knowledge/2.0/apps/worker2/features/clickup-design-sprint-automation.md +52 -241
- package/knowledge/2.0/apps/worker2/features/clickup-general-automation.md +16 -32
- package/knowledge/2.0/apps/worker2/features/clickup-github-autolink.md +11 -21
- package/knowledge/2.0/apps/worker2/features/clickup-project-routing.md +58 -202
- package/knowledge/2.0/apps/worker2/features/clickup-richtext-api.md +22 -41
- package/knowledge/2.0/apps/worker2/features/clickup-subtask-activity.md +30 -79
- package/knowledge/2.0/apps/worker2/features/clickup-task-fluffer-talos.md +39 -106
- package/knowledge/2.0/apps/worker2/features/clickup-work-type-automation.md +20 -63
- package/knowledge/2.0/apps/worker2/features/compass-vip-support-importer.md +37 -119
- package/knowledge/2.0/apps/worker2/features/creating-worker-actions.md +99 -430
- package/knowledge/2.0/apps/worker2/features/cross-account-aws-access.md +78 -209
- package/knowledge/2.0/apps/worker2/features/elastic-beanstalk-health-monitor.md +95 -278
- package/knowledge/2.0/apps/worker2/features/elite-freshservice-sync.md +66 -96
- package/knowledge/2.0/apps/worker2/features/error-escalation-cron.md +118 -420
- package/knowledge/2.0/apps/worker2/features/error-issue-auto-resolution.md +53 -150
- package/knowledge/2.0/apps/worker2/features/etilize-catalog-item-import.md +42 -78
- package/knowledge/2.0/apps/worker2/features/etilize-item-translation-import.md +41 -75
- package/knowledge/2.0/apps/worker2/features/monitoring-framework.md +64 -172
- package/knowledge/2.0/apps/worker2/features/netsuite-clickup-opportunity-bidirectional-design.md +33 -87
- package/knowledge/2.0/apps/worker2/features/netsuite-integrations-monitor.md +37 -97
- package/knowledge/2.0/apps/worker2/features/netsuite-item-client-routing.md +39 -88
- package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-client-labels.md +94 -323
- package/knowledge/2.0/apps/worker2/features/netsuite-opportunity-sync.md +208 -979
- package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-open-orders-sync.md +62 -181
- package/knowledge/2.0/apps/worker2/features/netsuite-salesorder-outbound-push.md +123 -170
- package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-backfill-worker.md +51 -76
- package/knowledge/2.0/apps/worker2/features/netsuite-supporting-record-webhook-importer.md +73 -122
- package/knowledge/2.0/apps/worker2/features/netsuite-transferorder-outbound-push.md +131 -449
- package/knowledge/2.0/apps/worker2/features/notification-email-template.md +37 -97
- package/knowledge/2.0/apps/worker2/features/notification-email.md +49 -140
- package/knowledge/2.0/apps/worker2/features/nychh-asset-tag-backfill.md +35 -62
- package/knowledge/2.0/apps/worker2/features/oneuptime-incident-clickup-sync.md +52 -138
- package/knowledge/2.0/apps/worker2/features/oneuptime-worker2-monitoring.md +373 -540
- package/knowledge/2.0/apps/worker2/features/platform-cache-cleanup.md +50 -61
- package/knowledge/2.0/apps/worker2/features/qa-qc-branch-automation.md +42 -52
- package/knowledge/2.0/apps/worker2/features/qa-qc-review-pipeline.md +56 -66
- package/knowledge/2.0/apps/worker2/features/s3-folder-retention-cleanup.md +58 -74
- package/knowledge/2.0/apps/worker2/features/service-request-sales-order-generation.md +62 -175
- package/knowledge/2.0/apps/worker2/features/sso-stability-monitor.md +29 -69
- package/knowledge/2.0/apps/worker2/features/startech-webhook-handler.md +24 -33
- package/knowledge/2.0/apps/worker2/features/talos-meeting-notes-integration.md +35 -70
- package/knowledge/2.0/apps/worker2/features/talos-pricing-automation.md +50 -106
- package/knowledge/2.0/apps/worker2/features/talos-transcript-ingestion.md +319 -431
- package/knowledge/2.0/apps/worker2/features/team-sprint-management.md +244 -303
- package/knowledge/2.0/apps/worker2/features/teams-transcript-export.md +128 -173
- package/knowledge/2.0/apps/worker2/features/tracking-status-refresh.md +103 -124
- package/knowledge/2.0/apps/worker2/features/vapi-webhook-handler.md +198 -277
- package/knowledge/2.0/apps/worker2/features/wje-freshservice-sync.md +16 -21
- package/knowledge/2.0/apps/worker2/features/worker-fleet-role-assignment-monitor.md +97 -105
- package/knowledge/2.0/apps/worker2/workflows/clickup-credential-rotation.md +47 -52
- package/knowledge/2.0/apps/worker2/workflows/php-runtime-upgrade-dependency-audit.md +112 -120
- package/knowledge/2.0/apps/worker2/workflows/running-worker2-locally.md +88 -124
- package/knowledge/2.0/apps/worker2/workflows/ticket-to-pseudocode-planning.md +52 -49
- package/knowledge/2.0/standards/backend-php-cases.md +55 -0
- package/knowledge/2.0/standards/backend-php.md +23 -99
- package/knowledge/2.0/standards/backend-testing.md +29 -93
- package/knowledge/2.0/standards/framework-rules-cases.md +25 -0
- package/knowledge/2.0/standards/framework-rules.md +10 -47
- package/knowledge/2.0/standards/frontend-cases.md +57 -0
- package/knowledge/2.0/standards/frontend-deploy-cases.md +18 -0
- package/knowledge/2.0/standards/frontend-deploy.md +13 -34
- package/knowledge/2.0/standards/frontend.md +40 -111
- package/knowledge/2.0/standards/python.md +33 -76
- package/knowledge/2.0/standards/ssl-certificate-trust-model-cases.md +30 -0
- package/knowledge/2.0/standards/ssl-certificate-trust-model.md +20 -71
- package/knowledge/CONVENTIONS.md +52 -29
- package/knowledge/INDEX.md +1 -1
- package/knowledge/clients/adyen/INDEX.md +1 -1
- package/knowledge/clients/adyen/profile.md +38 -90
- package/knowledge/clients/aig/INDEX.md +3 -3
- package/knowledge/clients/aig/features/contract-reconciliation.md +55 -123
- package/knowledge/clients/aig/features/entitlement-intake.md +165 -536
- package/knowledge/clients/aig/profile.md +10 -22
- package/knowledge/clients/canon/INDEX.md +1 -1
- package/knowledge/clients/canon/profile.md +9 -17
- package/knowledge/clients/compass-canada/INDEX.md +7 -7
- package/knowledge/clients/compass-canada/features/french-item-feature-translations.md +21 -55
- package/knowledge/clients/compass-canada/features/french-order-email-localization.md +83 -306
- package/knowledge/clients/compass-canada/features/grand-and-toy-asn-import.md +70 -302
- package/knowledge/clients/compass-canada/features/item-fulfillment-tableviews.md +42 -104
- package/knowledge/clients/compass-canada/features/order-fulfillment-status-per-line.md +52 -178
- package/knowledge/clients/compass-canada/profile.md +31 -188
- package/knowledge/clients/compass-canada/workflows/grand-and-toy-asn-backfill.md +30 -104
- package/knowledge/clients/compass-usa/INDEX.md +35 -35
- package/knowledge/clients/compass-usa/features/approval-decision-flow.md +110 -570
- package/knowledge/clients/compass-usa/features/asn-to-item-fulfillment.md +56 -332
- package/knowledge/clients/compass-usa/features/contact-email-resolution.md +38 -94
- package/knowledge/clients/compass-usa/features/cost-centers.md +32 -114
- package/knowledge/clients/compass-usa/features/isfulfillable-data-quality-and-type-rule.md +56 -197
- package/knowledge/clients/compass-usa/features/item-catalogs-and-duplicate-items.md +52 -243
- package/knowledge/clients/compass-usa/features/item-fulfillment-tracking-tableview.md +30 -91
- package/knowledge/clients/compass-usa/features/mits-po-to-so-item-linking.md +51 -273
- package/knowledge/clients/compass-usa/features/mits-po-transmission-to-vendors.md +29 -112
- package/knowledge/clients/compass-usa/features/mits-po-zero-line-item-rejection.md +45 -124
- package/knowledge/clients/compass-usa/features/mits-sales-order-transmission-alerting.md +67 -213
- package/knowledge/clients/compass-usa/features/mr-ma-order-approval-and-status.md +50 -188
- package/knowledge/clients/compass-usa/features/odp-edi-850-item-resolution.md +63 -230
- package/knowledge/clients/compass-usa/features/odp-edi-855-acknowledgement-and-overquantity-guard.md +48 -166
- package/knowledge/clients/compass-usa/features/odp-edi-file-retention-and-retry.md +39 -121
- package/knowledge/clients/compass-usa/features/oneuptime-ma-refresh-order-monitor.md +33 -97
- package/knowledge/clients/compass-usa/features/order-fulfillment-status-per-line.md +68 -196
- package/knowledge/clients/compass-usa/features/people-file-user-lifecycle.md +53 -267
- package/knowledge/clients/compass-usa/features/persona-model-and-levy-gating.md +31 -109
- package/knowledge/clients/compass-usa/features/sales-order-line-renumbering.md +29 -116
- package/knowledge/clients/compass-usa/features/stranded-approval-reassignment.md +50 -164
- package/knowledge/clients/compass-usa/features/tracking-number-origin-and-asn-link.md +32 -70
- package/knowledge/clients/compass-usa/profile.md +1 -1
- package/knowledge/clients/compass-usa/workflows/catalog-fold-reversal.md +56 -259
- package/knowledge/clients/compass-usa/workflows/changing-a-kit-line-item.md +40 -117
- package/knowledge/clients/compass-usa/workflows/cross-kit-bundle-corruption.md +35 -71
- package/knowledge/clients/compass-usa/workflows/granting-api-access.md +43 -111
- package/knowledge/clients/compass-usa/workflows/granting-navigation-access.md +54 -206
- package/knowledge/clients/compass-usa/workflows/granting-persona-bundle-access.md +37 -140
- package/knowledge/clients/compass-usa/workflows/odp-duplicate-po-line-cleanup.md +34 -76
- package/knowledge/clients/compass-usa/workflows/odp-edi-import-recovery.md +33 -114
- package/knowledge/clients/compass-usa/workflows/odp-order-pipeline-to-netsuite.md +71 -371
- package/knowledge/clients/compass-usa/workflows/order-lifecycle-and-data-integrity.md +56 -172
- package/knowledge/clients/compass-usa/workflows/persona-population-env-comparison.md +20 -54
- package/knowledge/clients/compass-usa/workflows/persona-refactor-migration.md +51 -123
- package/knowledge/clients/elite/INDEX.md +7 -7
- package/knowledge/clients/elite/features/netsuite-togasupply-sync.md +67 -334
- package/knowledge/clients/elite/features/salesorder-netsuite-push.md +64 -215
- package/knowledge/clients/elite/features/salesorder-status-togadesk-reply.md +27 -57
- package/knowledge/clients/elite/features/supply2-scope.md +59 -190
- package/knowledge/clients/elite/features/supply2-tableview-config-drift.md +76 -239
- package/knowledge/clients/elite/features/togadesk-service-request-intake.md +57 -176
- package/knowledge/clients/elite/profile.md +31 -108
- package/knowledge/clients/endeavor-health/INDEX.md +1 -1
- package/knowledge/clients/endeavor-health/profile.md +7 -11
- package/knowledge/clients/fordham/INDEX.md +1 -1
- package/knowledge/clients/fordham/profile.md +10 -19
- package/knowledge/clients/growrk/INDEX.md +4 -4
- package/knowledge/clients/growrk/features/shipping-carrier-cleanup.md +23 -46
- package/knowledge/clients/growrk/features/transfer-order-flow.md +39 -88
- package/knowledge/clients/growrk/features/units-netsuite-custom-fields.md +59 -149
- package/knowledge/clients/growrk/profile.md +14 -46
- package/knowledge/clients/northwell/INDEX.md +2 -2
- package/knowledge/clients/northwell/features/sso-jit-provisioning.md +25 -75
- package/knowledge/clients/northwell/profile.md +12 -31
- package/knowledge/clients/nycdoe/INDEX.md +4 -4
- package/knowledge/clients/nycdoe/features/edi-850-receive-and-997-ack.md +28 -68
- package/knowledge/clients/nycdoe/features/hold-status-sync.md +72 -321
- package/knowledge/clients/nycdoe/features/servicenow-integration.md +132 -643
- package/knowledge/clients/nycdoe/profile.md +11 -28
- package/knowledge/clients/nychh/INDEX.md +8 -8
- package/knowledge/clients/nychh/features/location-shipping-addresses.md +36 -110
- package/knowledge/clients/nychh/features/netsuite-inventory-adjustment-fulfillment-link.md +55 -235
- package/knowledge/clients/nychh/features/netsuite-transfer-order-import.md +122 -492
- package/knowledge/clients/nychh/features/po-number-upstream-direction.md +19 -63
- package/knowledge/clients/nychh/features/talos-assistant-enablement.md +42 -106
- package/knowledge/clients/nychh/features/transfer-order-inventory-quantities.md +118 -386
- package/knowledge/clients/nychh/features/transfer-order-netsuite-push.md +79 -193
- package/knowledge/clients/nychh/profile.md +55 -363
- package/knowledge/clients/office-depot/INDEX.md +3 -3
- package/knowledge/clients/office-depot/features/odp-tech-support.md +30 -56
- package/knowledge/clients/office-depot/features/togarefresh2026-linkbuilder-routing.md +17 -21
- package/knowledge/clients/office-depot/profile.md +16 -46
- package/knowledge/clients/pcmaticb2b/INDEX.md +4 -4
- package/knowledge/clients/pcmaticb2b/features/startech-entitlement-provisioning.md +35 -101
- package/knowledge/clients/pcmaticb2b/features/startech-per-ticket-type-stages.md +42 -123
- package/knowledge/clients/pcmaticb2b/features/startech-ticket-sync.md +58 -105
- package/knowledge/clients/pcmaticb2b/profile.md +5 -10
- package/knowledge/clients/prudential/INDEX.md +15 -15
- package/knowledge/clients/prudential/features/dell-asn-units-interceptor.md +21 -69
- package/knowledge/clients/prudential/features/dell-lch-iop-transmissions.md +53 -170
- package/knowledge/clients/prudential/features/device-information-import-and-contact-linking.md +27 -115
- package/knowledge/clients/prudential/features/itemclasses-device-tier-data.md +25 -74
- package/knowledge/clients/prudential/features/oneuptime-order-pipeline-monitors.md +19 -55
- package/knowledge/clients/prudential/features/order-email-pdf-attachments.md +53 -177
- package/knowledge/clients/prudential/features/service-request-address-validation.md +51 -105
- package/knowledge/clients/prudential/features/service-request-auth-rejection-alert.md +37 -113
- package/knowledge/clients/prudential/features/service-request-rejection-alert-email.md +30 -77
- package/knowledge/clients/prudential/features/supply-orders-csv-export.md +29 -90
- package/knowledge/clients/prudential/features/transmit-ordershipped-email.md +58 -211
- package/knowledge/clients/prudential/profile.md +29 -81
- package/knowledge/clients/prudential/workflows/dell-asn-backfill-replay.md +14 -38
- package/knowledge/clients/prudential/workflows/http2-alb-workaround.md +15 -34
- package/knowledge/clients/prudential/workflows/store-saml-deploy-topology.md +39 -115
- package/knowledge/clients/quad/INDEX.md +5 -5
- package/knowledge/clients/quad/features/enter-po-details-vendor-selection-ev12.md +20 -36
- package/knowledge/clients/quad/features/multi-currency-item-pricing.md +43 -139
- package/knowledge/clients/quad/features/po-asn-email-import.md +48 -139
- package/knowledge/clients/quad/profile.md +24 -118
- package/knowledge/clients/quad/workflows/catalog-fold-reversal.md +36 -84
- package/knowledge/clients/rate/INDEX.md +12 -12
- package/knowledge/clients/rate/features/aig-contract-creation.md +90 -554
- package/knowledge/clients/rate/features/checkout-terms-delivery-preference.md +28 -69
- package/knowledge/clients/rate/features/home-warranty-terms-content.md +23 -65
- package/knowledge/clients/rate/features/monthly-reconciliation-report.md +18 -37
- package/knowledge/clients/rate/features/netsuite-cashsale-export.md +19 -56
- package/knowledge/clients/rate/features/paypal-subscription-purchase-webhook.md +60 -204
- package/knowledge/clients/rate/features/saml-sso.md +12 -16
- package/knowledge/clients/rate/features/service-card-entitlements.md +44 -141
- package/knowledge/clients/rate/features/service-purchase-emails.md +40 -132
- package/knowledge/clients/rate/features/subscription-cancellation.md +82 -412
- package/knowledge/clients/rate/features/whole-home-warranty-purchase-guard.md +97 -610
- package/knowledge/clients/rate/profile.md +3 -5
- package/knowledge/clients/rumcsi/INDEX.md +1 -1
- package/knowledge/clients/rumcsi/profile.md +34 -102
- package/knowledge/clients/spglobal/INDEX.md +1 -1
- package/knowledge/clients/spglobal/profile.md +7 -11
- package/knowledge/clients/staples/INDEX.md +2 -2
- package/knowledge/clients/staples/features/oneuptime-sftp-folder-monitors.md +30 -71
- package/knowledge/clients/staples/profile.md +9 -23
- package/knowledge/clients/tow-foundation/INDEX.md +2 -2
- package/knowledge/clients/tow-foundation/features/receipt-processing.md +96 -306
- package/knowledge/clients/tow-foundation/profile.md +18 -45
- package/knowledge/clients/true/INDEX.md +2 -2
- package/knowledge/clients/true/features/users-personas-data-model.md +12 -15
- package/knowledge/clients/true/profile.md +9 -31
- package/knowledge/clients/walmart/INDEX.md +4 -4
- package/knowledge/clients/walmart/features/customer-email-lifecycle.md +33 -66
- package/knowledge/clients/walmart/features/domain-migration.md +16 -13
- package/knowledge/clients/walmart/features/registration-route.md +23 -24
- package/knowledge/clients/walmart/profile.md +6 -11
- package/knowledge/clients/wje/INDEX.md +1 -1
- package/knowledge/clients/wje/profile.md +14 -19
- package/knowledge/standalone/apps/claude/INDEX.md +5 -5
- package/knowledge/standalone/apps/claude/features/review-enforcement-hooks.md +19 -44
- package/knowledge/standalone/apps/claude/workflows/harness-distribution.md +29 -40
- package/knowledge/standalone/apps/claude/workflows/knowledge-publish-pipeline.md +23 -43
- package/knowledge/standalone/apps/claude/workflows/mcp-tool-usage.md +68 -149
- package/knowledge/standalone/apps/claude/workflows/ticket-branch-creation-safety.md +32 -62
- package/knowledge/standalone/apps/forward/INDEX.md +3 -3
- package/knowledge/standalone/apps/forward/architecture.md +26 -71
- package/knowledge/standalone/apps/forward/features/encrypted-link-handler.md +19 -33
- package/knowledge/standalone/apps/forward/features/static-demo-hosting.md +33 -93
- package/knowledge/standalone/apps/togatech/INDEX.md +5 -5
- package/knowledge/standalone/apps/togatech/architecture.md +40 -71
- package/knowledge/standalone/apps/togatech/features/careers-paylocity-job-openings.md +31 -106
- package/knowledge/standalone/apps/togatech/features/seo-aeo-geo-prerender.md +11 -13
- package/knowledge/standalone/apps/togatech/workflows/creating-pull-requests.md +14 -13
- package/knowledge/standalone/apps/togatech/workflows/local-dev-and-headless-verification.md +15 -46
- package/knowledge/standalone/apps/websocket/INDEX.md +2 -2
- package/knowledge/standalone/apps/websocket/architecture.md +16 -22
- package/knowledge/standalone/apps/websocket/features/sqs-fanout.md +18 -50
- package/knowledge/standalone/standards/brand-naming-cases.md +21 -0
- package/knowledge/standalone/standards/brand-naming.md +7 -12
- package/knowledge/standalone/standards/communication-clarity.md +12 -42
- package/knowledge/standalone/standards/deploy-instruction-communication.md +7 -27
- package/knowledge/standalone/standards/session-priming.md +15 -57
- package/knowledge.js +5 -25
- package/package.json +1 -1
- 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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
**Follow the doc schema (CONVENTIONS → Required 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
|
|
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*
|
|
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`
|
|
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-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
38
|
-
> the target environment before writing anything.
|
|
34
|
+
## Steps
|
|
39
35
|
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
- **
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
-
|
|
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) | `
|
|
6
|
-
| [Address Validation Gateway (App_Api_OfficeDepot::validateAddress + USPS fallback)](features/address-validation-gateway.md) |
|
|
7
|
-
| [Where a new App_ class goes — the app/ folder IS a behavioral contract](features/app-class-placement-base-contracts.md) |
|
|
8
|
-
| [App_Sso — Reusable 1.0 SSO Initiation (SP-initiated SAML via saml.togahub.com)](features/app-sso-initiation.md) | `
|
|
9
|
-
| [Cron Execution Monitoring (App_Framework check-in/out → CronJobExecutions)](features/cron-execution-monitoring.md) | `App_Framework::cronInitialization()
|
|
10
|
-
| [Diagnostic Dialog — View Recommended Services Routing](features/diagnostic-dialog-view-recommended-services.md) |
|
|
11
|
-
| [Elite Freshservice Sync (library)](features/elite-freshservice-sync.md) |
|
|
12
|
-
| [App_Email Queued Sending & Attachments (Common.EmailsQueued)](features/email-queue-attachments.md) | `App_Email
|
|
13
|
-
| [Branded HTML Email Templates (App_Email_Template)](features/email-templates.md) | `App_Email_Template` (
|
|
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()`
|
|
15
|
-
| [Error Capture in 1.0 (App_Error_Capture → shared 2.0 Logs DB)](features/error-capture-1-0.md) |
|
|
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`
|
|
17
|
-
| [1.0 MVC Page Pattern & New-App Skeleton](features/mvc-page-pattern-and-app-skeleton.md) |
|
|
18
|
-
| [NetSuite File Cabinet Content Retrieval via RESTlet (fetchInvoiceFile)](features/netsuite-filecabinet-restlet.md) | How 1.0 pulls
|
|
19
|
-
| [assetType from NetSuite itemtype during Item Sync (opt-in per client)](features/netsuite-item-assettype-sync.md) | `
|
|
20
|
-
| [NetSuite classification → ItemClasses sync (opt-in per client)](features/netsuite-item-class-sync.md) |
|
|
21
|
-
| [isFulfillable from NetSuite during Item Sync (Phase 1)](features/netsuite-item-isfulfillable-sync.md) |
|
|
22
|
-
| [NetSuite SuiteQL/REST API Reference](features/netsuite-suiteql-api-reference.md) |
|
|
23
|
-
| [NetSuite SuiteQL/REST Shim — Field Semantics](features/netsuite-suiteql-rest-shim.md) | `App_Api_Netsuite_Rest`
|
|
24
|
-
| [NetSuite Sync Alert Monitor (App_SystemMonitor_NetSuiteIntegration)](features/netsuite-sync-alert-monitor.md) | `App_SystemMonitor_NetSuiteIntegration`
|
|
25
|
-
| [Startech PC Matic B2B Sync (library)](features/startech-pcmaticb2b-sync.md) |
|
|
26
|
-
| [App_Api_Toga2 — TOGa2 API Client & 1.0↔2.0 Sync Bridge](features/toga2-api-client-and-bridge.md) | `App_Api_Toga2`
|
|
27
|
-
| [Rendering a 1.0 App_Email Template to HTML Offline (no DB, no send)](workflows/render-1-0-email-templates-offline.md) |
|
|
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-
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
29
|
-
- **`resources/` repo** — purely front-end assets (JS/CSS).
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
79
|
+
## App_String cross-framework crypto (`encryptWithKey` / `decryptWithKey`)
|
|
98
80
|
|
|
99
|
-
- **
|
|
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
|
-
##
|
|
83
|
+
## Gotchas
|
|
108
84
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
`
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
45
|
-
- **
|
|
46
|
-
|
|
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
|
|
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
|
-
|
|
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.
|