mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-10-05 06:36:55 +01:00
Two ui articles with compiled good/bad samples: - notification-recall-needs-known-id: a notification that the code also recalls needs a fixed Id (single instance; recall before re-send) or per-record tracking through codeunit "Notification Lifecycle Mgt." (SendNotification[WithAdditionalContext] / RecallNotificationsForRecord, HandleDelayedInsert semantics). Never-recalled notifications are exempt. - list-page-document-routing-uses-page-management: open documents from a mixed-type list with PageManagement.PageRun(Rec) instead of a hand-written case "Document Type" / Page.Run; register new tables through OnConditionalCardPageIDNotFound. Single-type opens and tables Page Management does not route are exempt. Wired into al-ui-review (entry gate now covers notification send/recall outside pages, tokens, high-signal mappings) and registered both pairs in the ui review-fixtures override. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
192 lines
7.6 KiB
JSON
192 lines
7.6 KiB
JSON
{
|
|
"version": 2,
|
|
"selection": "first-paired-al-article",
|
|
"minimumExpectedRecall": 1.0,
|
|
"minimumCleanRate": 1.0,
|
|
"coverageWaivers": [],
|
|
"overrides": {
|
|
"agents": {
|
|
"article": "wire-all-three-agent-interfaces"
|
|
},
|
|
"breaking-changes": {
|
|
"article": "do-not-expose-sensitive-data-through-public-api"
|
|
},
|
|
"data-modeling": {
|
|
"articles": [
|
|
"activate-new-price-calculation-handler-via-onfindsupportedsetup",
|
|
"check-blocked-in-referencing-code-not-in-master",
|
|
"code-must-not-change-workdate",
|
|
"custom-document-dispatch-must-not-bypass-report-selections",
|
|
"document-line-prices-follow-prices-including-vat",
|
|
"document-print-and-email-actions-call-report-selections-directly",
|
|
"extend-find-entries-navigate-for-new-document-types",
|
|
"extend-price-source-type-must-sync-document-subset-enum",
|
|
"extend-report-selection-usage-for-new-document-types",
|
|
"new-price-source-must-add-candidate-and-trigger-recalculation",
|
|
"pictures-must-use-media-not-blob",
|
|
"report-barcodes-must-use-barcode-module-and-production-font-name",
|
|
"table-design-must-match-bc-table-type-conventions",
|
|
"transferfields-mirrored-fields-must-match-type-and-length"
|
|
]
|
|
},
|
|
"error-handling": {
|
|
"articles": [
|
|
"collect-validation-errors-with-errorbehavior",
|
|
"defensive-vs-offensive-code-must-match-blast-radius",
|
|
"log-writes-must-survive-rollback"
|
|
]
|
|
},
|
|
"events": {
|
|
"articles": [
|
|
"reset-ishandled-only-when-the-value-can-carry-over",
|
|
"changecompany-runs-triggers-in-the-calling-company"
|
|
]
|
|
},
|
|
"finance": {
|
|
"articles": [
|
|
"apply-ledger-entries-through-application-codeunits",
|
|
"change-ledger-due-dates-through-entry-edit",
|
|
"do-not-edit-shared-dimension-sets",
|
|
"do-not-modify-or-delete-posted-ledger-entries",
|
|
"normal-vat-journal-amount-includes-vat",
|
|
"post-ledger-entries-through-posting-codeunits",
|
|
"preserve-journal-batch-document-balance",
|
|
"reverse-transactions-by-transaction-number",
|
|
"write-dimensions-as-dimension-set-entries"
|
|
],
|
|
"context": "Target Business Central 28, worldwide standard application (w1). Review each file as an independent source input."
|
|
},
|
|
"interfaces": {
|
|
"article": "set-defaultimplementation-on-enum"
|
|
},
|
|
"performance": {
|
|
"articles": [
|
|
"use-isempty-for-existence-check",
|
|
"use-get-instead-of-findfirst-on-full-primary-key",
|
|
"job-queue-category-code-serializes-conflicting-jobs",
|
|
"job-queue-external-effects-must-be-idempotent",
|
|
"job-queue-handlers-must-not-require-ui",
|
|
"job-queue-handlers-must-propagate-failures",
|
|
"job-queue-on-hold-does-not-stop-running-work",
|
|
"store-scheduled-task-id-to-avoid-duplicate-tasks",
|
|
"design-covering-keys-from-read-pattern",
|
|
"review-overlapping-keys-before-adding-an-index",
|
|
"setcurrentkey-sets-sort-order-not-index-hint",
|
|
"preserve-buffered-inserts-by-separating-target-reads",
|
|
"aggregate-before-persisting-intermediate-results",
|
|
"cache-repeated-filtered-results-with-explicit-scope",
|
|
"avoid-repeating-unchanged-validation",
|
|
"avoid-get-inside-loop-on-large-table",
|
|
"isempty-before-findset-is-extra-round-trip",
|
|
"query-results-bypass-primary-key-cache",
|
|
"calcsums-instead-of-calcfields-in-loop",
|
|
"use-setautocalcfields-for-per-row-flowfields",
|
|
"temporary-tables-have-no-database-cost",
|
|
"use-setloadfields-for-partial-records",
|
|
"prefer-modifyall-over-per-row-modify",
|
|
"al-methods-limited-during-write-transactions",
|
|
"avoid-user-prompts-inside-transactions"
|
|
]
|
|
},
|
|
"privacy": {
|
|
"article": "no-pii-in-telemetry-message-string"
|
|
},
|
|
"query": {
|
|
"articles": [
|
|
"dataitemtablefilter-cannot-be-overwritten-at-runtime",
|
|
"reopening-query-resets-cursor-but-keeps-filters",
|
|
"set-query-filters-before-open",
|
|
"setfilter-overwrites-query-columnfilter"
|
|
]
|
|
},
|
|
"reporting": {
|
|
"articles": [
|
|
"clear-report-variable-before-independent-runmodal",
|
|
"currreport-break-ends-the-current-trigger",
|
|
"currreport-quit-rolls-back-and-skips-onpostreport",
|
|
"currreport-skip-does-not-stop-trigger-code",
|
|
"report-output-in-a-loop-needs-one-client-download",
|
|
"reportextension-dataitem-trigger-order-is-explicit",
|
|
"reportextension-report-triggers-run-after-base-triggers",
|
|
"settableview-cannot-broaden-dataitemtableview",
|
|
"stop-when-runrequestpage-returns-empty-parameters"
|
|
]
|
|
},
|
|
"scm": {
|
|
"articles": [
|
|
"post-item-ledger-changes-through-item-journals",
|
|
"post-revaluation-through-the-item-journal-batch",
|
|
"change-item-applications-through-posting-routines",
|
|
"cancel-reservations-through-reservation-management",
|
|
"transfer-item-tracking-through-source-reservation-codeunits",
|
|
"reconcile-warehouse-adjustments-with-the-item-ledger",
|
|
"post-transfers-through-shipment-and-receipt-codeunits",
|
|
"use-date-aware-availability-for-promising",
|
|
"carry-out-requisition-actions-through-the-standard-workflow",
|
|
"derive-base-quantities-through-the-line-unit-of-measure"
|
|
]
|
|
},
|
|
"security": {
|
|
"articles": [
|
|
"al-has-no-built-in-htmlencode",
|
|
"do-not-concatenate-external-text-into-setfilter",
|
|
"exposed-objects-must-be-in-a-permission-set"
|
|
]
|
|
},
|
|
"style": {
|
|
"articles": [
|
|
"label-comment-explains-placeholders",
|
|
"dateformula-evaluate-needs-language-independent-literals",
|
|
"al-comments-must-not-restate-what-code-already-shows",
|
|
"pages-must-not-contain-business-logic"
|
|
]
|
|
},
|
|
"telemetry": {
|
|
"article": "telemetry-event-id-stable-unique"
|
|
},
|
|
"testing": {
|
|
"articles": [
|
|
"ui-handlers-in-tests",
|
|
"reset-per-test-state-before-the-isinitialized-guard",
|
|
"asserterror-needs-expectederror-and-code",
|
|
"bcpt-scenarios-must-be-app-specific",
|
|
"commit-shared-test-fixture-inside-lazy-initialize",
|
|
"given-blocks-must-cover-full-precondition-chain",
|
|
"table-relation-test-exclude-known-invalid-relations-via-event",
|
|
"test-feature-scenario-tags",
|
|
"test-one-when-per-test",
|
|
"transactionmodel-attribute-governs-test-transactions",
|
|
"ui-test-codeunit-naming",
|
|
"use-assert-isfalse-not-asserterror-for-boolean-checks"
|
|
]
|
|
},
|
|
"ui": {
|
|
"articles": [
|
|
"default-descending-sort-on-historical-pages",
|
|
"page-design-must-match-bc-page-type-conventions",
|
|
"page-client-expression-must-not-use-in-list",
|
|
"rolecenter-permission-gating-must-use-accessbypermission",
|
|
"notification-recall-needs-known-id",
|
|
"list-page-document-routing-uses-page-management"
|
|
]
|
|
},
|
|
"upgrade": {
|
|
"articles": [
|
|
"initvalue-does-not-update-existing-rows",
|
|
"upgrade-tag-logic-must-not-nest-deeply",
|
|
"no-changecompany-in-upgrade"
|
|
],
|
|
"context": "The extended table existed in the previous app version and already contains rows."
|
|
},
|
|
"web-services": {
|
|
"articles": [
|
|
"expose-systemid-as-the-api-key",
|
|
"handle-httpclient-platform-failure-before-response-access",
|
|
"check-http-status-before-consuming-response-body",
|
|
"check-json-null-before-converting-values",
|
|
"format-exchanged-values-with-standard-format-9",
|
|
"api-page-least-privilege-write-access"
|
|
]
|
|
}
|
|
}
|
|
}
|