---
id: change/bcquality/156
type: change
title: "#156 18 AL/BC patterns: style, data-modeling, web-services, appsource, breaking-changes, performance, testing"
summary: Adds 17 AL/BC knowledge articles with good and bad samples across style, data modeling, web services, AppSource, breaking changes, performance and testing, and updates the matching review skills. The description lists a FlowFields web-services article that is not among the changed files.
tier: official
language: en
tags:
  - feature
  - main
system: development
review:
  state: reviewed
  by: opus
  at: "2026-10-08T02:03:57.446Z"
  flags: []
generated:
  at: "2026-10-08T01:26:53.141Z"
  pipeline: 0.2.0
  prompts:
    extract-change: 1
  input_hash: 0a8c9a85560204e2fe75a1180767330bcfb62581
evidence:
  - kind: code
    url: https://github.com/microsoft/BCQuality/pull/156
    title: "microsoft/BCQuality#156: 18 AL/BC patterns: style, data-modeling, web-services, appsource, breaking-changes, performance, testing"
    date: "2026-09-29"
    commit: 0a8c9a85560204e2fe75a1180767330bcfb62581
    t: null
    quote: 18 knowledge articles generalized from patterns observed across real AppSource/PTE Business Central development
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
  changes: []
number: 156
repo: microsoft/BCQuality
source_id: bcquality-prs
url: https://github.com/microsoft/BCQuality/pull/156
kind: pr
base_branch: main
major: null
merged_at: "2026-09-29T10:48:18Z"
author: MichaelDieringer
author_type: User
community_contribution: false
labels: []
change_class: code
change_kind: feature
behavior_change: false
breaking: false
files:
  count: 56
  additions: 1144
  deletions: 3
  al: 56
apps: []
objects_touched: []
objects_unjoined:
  - path: microsoft/knowledge/appsource/file-datatype-saas.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/appsource/file-datatype-saas.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/appsource/file-datatype-saas.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/breaking-changes/prefer-email-module.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/breaking-changes/prefer-email-module.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/breaking-changes/prefer-email-module.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/check-post-line-batch-pattern.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/check-post-line-batch-pattern.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/check-post-line-batch-pattern.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/dimension-management-wiring.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/dimension-management-wiring.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/dimension-management-wiring.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/do-not-change-primary-key.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/do-not-change-primary-key.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/do-not-change-primary-key.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/testfield-required-setup-field.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/testfield-required-setup-field.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/data-modeling/testfield-required-setup-field.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/performance/document-report-word-layout.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/performance/document-report-word-layout.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/performance/document-report-word-layout.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/al-build-output-must-not-pollute-project-root.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/al-identifiers-english.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/al-identifiers-english.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/al-identifiers-english.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/binary-choice-must-be-boolean.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/binary-choice-must-be-boolean.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/binary-choice-must-be-boolean.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/fixed-choice-set-must-use-enum-not-integer.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/fixed-choice-set-must-use-enum-not-integer.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/fixed-choice-set-must-use-enum-not-integer.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/intrinsic-al-functions-must-use-modern-casing.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/intrinsic-al-functions-must-use-modern-casing.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/intrinsic-al-functions-must-use-modern-casing.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/namespace-must-be-verified-from-source.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/namespace-must-be-verified-from-source.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/namespace-must-be-verified-from-source.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/var-parameters-require-an-addressable-variable.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/var-parameters-require-an-addressable-variable.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/style/var-parameters-require-an-addressable-variable.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/testing/test-data-must-be-random-and-complete.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/testing/test-data-must-be-random-and-complete.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/testing/test-data-must-be-random-and-complete.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/web-services/api-page-key-fields-must-be-editable-on-insert.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/web-services/api-page-key-fields-must-be-editable-on-insert.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/web-services/api-page-key-fields-must-be-editable-on-insert.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/web-services/stored-derived-fields-must-not-be-exposed-directly.bad.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/web-services/stored-derived-fields-must-not-be-exposed-directly.good.al
    status: added
    reason: not-in-snapshot
  - path: microsoft/knowledge/web-services/stored-derived-fields-must-not-be-exposed-directly.md
    status: added
    reason: not-in-snapshot
  - path: microsoft/skills/review/al-appsource-review.md
    status: modified
    reason: not-in-snapshot
  - path: microsoft/skills/review/al-breaking-changes-review.md
    status: modified
    reason: not-in-snapshot
  - path: microsoft/skills/review/al-data-modeling-review.md
    status: modified
    reason: not-in-snapshot
  - path: microsoft/skills/review/al-performance-review.md
    status: modified
    reason: not-in-snapshot
  - path: microsoft/skills/review/al-style-review.md
    status: modified
    reason: not-in-snapshot
  - path: microsoft/skills/review/al-testing-review.md
    status: modified
    reason: not-in-snapshot
  - path: microsoft/skills/review/al-web-services-review.md
    status: modified
    reason: not-in-snapshot
obsoletions: []
backports: []
fixes_issues: []
work_items: []
systems:
  - development
quote: 18 knowledge articles generalized from patterns observed across real AppSource/PTE Business Central development
joined_against:
  major: null
  commit: null
---

# #156 18 AL/BC patterns: style, data-modeling, web-services, appsource, breaking-changes, performance, testing

> Adds 17 AL/BC knowledge articles with good and bad samples across style, data modeling, web services, AppSource, breaking changes, performance and testing, and updates the matching review skills. The description lists a FlowFields web-services article that is not among the changed files.

[Pull request](https://github.com/microsoft/BCQuality/pull/156) · merged into `main` on 2026-09-29 by MichaelDieringer · 56 files (+1144 -3), 56 AL · feature · tier official · reviewed (checked by Opus)

## What changed

- 7 style articles: Boolean for binary choices, Enum over Integer, modern casing, addressable var parameters, namespace verification, English identifiers, build output location
- 4 data modeling articles: DimensionManagement wiring, Check/Post Line/Post Batch split, primary key immutability, TestField on required setup fields
- 2 web-services articles: keep consumer-provided key fields editable on insert, recalculate stored derived fields before exposing them via API
- Single articles for AppSource (File data type is OnPrem-only), breaking changes (prefer the Email module), performance (Word layout) and testing (randomized complete data)
- Review skills for each domain are updated to route to the new articles

## AL objects touched

- `microsoft/knowledge/appsource/file-datatype-saas.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/appsource/file-datatype-saas.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/appsource/file-datatype-saas.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/breaking-changes/prefer-email-module.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/breaking-changes/prefer-email-module.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/breaking-changes/prefer-email-module.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/check-post-line-batch-pattern.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/check-post-line-batch-pattern.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/check-post-line-batch-pattern.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/dimension-management-wiring.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/dimension-management-wiring.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/dimension-management-wiring.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/do-not-change-primary-key.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/do-not-change-primary-key.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/do-not-change-primary-key.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/testfield-required-setup-field.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/testfield-required-setup-field.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/data-modeling/testfield-required-setup-field.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/performance/document-report-word-layout.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/performance/document-report-word-layout.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/performance/document-report-word-layout.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/al-build-output-must-not-pollute-project-root.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/al-identifiers-english.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/al-identifiers-english.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/al-identifiers-english.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/binary-choice-must-be-boolean.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/binary-choice-must-be-boolean.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/binary-choice-must-be-boolean.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/fixed-choice-set-must-use-enum-not-integer.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/fixed-choice-set-must-use-enum-not-integer.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/fixed-choice-set-must-use-enum-not-integer.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/intrinsic-al-functions-must-use-modern-casing.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/intrinsic-al-functions-must-use-modern-casing.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/intrinsic-al-functions-must-use-modern-casing.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/namespace-must-be-verified-from-source.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/namespace-must-be-verified-from-source.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/namespace-must-be-verified-from-source.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/var-parameters-require-an-addressable-variable.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/var-parameters-require-an-addressable-variable.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/style/var-parameters-require-an-addressable-variable.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/testing/test-data-must-be-random-and-complete.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/testing/test-data-must-be-random-and-complete.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/testing/test-data-must-be-random-and-complete.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/web-services/api-page-key-fields-must-be-editable-on-insert.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/web-services/api-page-key-fields-must-be-editable-on-insert.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/web-services/api-page-key-fields-must-be-editable-on-insert.md`: added, not in the BC? snapshot yet
- `microsoft/knowledge/web-services/stored-derived-fields-must-not-be-exposed-directly.bad.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/web-services/stored-derived-fields-must-not-be-exposed-directly.good.al`: added, not in the BC? snapshot yet
- `microsoft/knowledge/web-services/stored-derived-fields-must-not-be-exposed-directly.md`: added, not in the BC? snapshot yet
- `microsoft/skills/review/al-appsource-review.md`: modified, not in the BC? snapshot
- `microsoft/skills/review/al-breaking-changes-review.md`: modified, not in the BC? snapshot
- `microsoft/skills/review/al-data-modeling-review.md`: modified, not in the BC? snapshot
- `microsoft/skills/review/al-performance-review.md`: modified, not in the BC? snapshot
- `microsoft/skills/review/al-style-review.md`: modified, not in the BC? snapshot
- `microsoft/skills/review/al-testing-review.md`: modified, not in the BC? snapshot
- `microsoft/skills/review/al-web-services-review.md`: modified, not in the BC? snapshot

## Context

- Systems: development
- From the description: "18 knowledge articles generalized from patterns observed across real AppSource/PTE Business Central development"

Source: metadata of a merged pull request in microsoft/BCQuality (bcquality): title, labels, changed paths and counts, with a summary in our words. No source text and no description beyond one short quote (D10, D61).
