---
id: release/al-30.0
type: release
title: AL Language extension 30.0
summary: "AL Language extension 30.0 for Business Central 2027 release wave 1 (BC30): previewed 2026-10-01, no stable release yet; 10 changelog entries, 23 GitHub issues linked."
tier: official
language: en
system: development
tags:
  - parallel workspace compilation
  - markdown page fields
  - modify several fields in one modifyall call
  - inherent permissions validation in multi-root workspaces
  - github issues
  - altool code coverage export
  - bug fixes
  - altool changes
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:26:06.897Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: d91ac727b8a94926171755e484090c76801bfe6d2cb7bc8cc86b60f60f6fe135
evidence:
  - kind: marketplace
    url: https://marketplace.visualstudio.com/items/ms-dynamics-smb.al/changelog
    title: AL Language extension changelog, version 30.0
    date: "2026-10-01"
    commit: null
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
source_id: al-language-extension
extension: ms-dynamics-smb.al
version: "30.0"
wave: 2027 release wave 1
major: "30"
preview_at: "2026-10-01"
released_at: null
published_at: "2026-10-01"
prerelease: true
entry_count: 10
issues:
  - 7832
  - 7891
  - 8001
  - 8034
  - 8129
  - 8130
  - 8134
  - 8171
  - 8194
  - 8244
  - 8267
  - 8273
  - 8274
  - 8280
  - 8284
  - 8290
  - 8291
  - 8297
  - 8325
  - 8326
  - 8330
  - 8331
  - 8337
changes:
  - at: "2026-10-11"
    added:
      - parallel-workspace-compilation
      - modify-several-fields-in-one-modifyall-call
      - inherent-permissions-validation-in-multi-root-workspaces
      - altool-code-coverage-export
      - altool-changes
      - visual-studio-code-editor-changes
      - miscellaneous
    changed:
      - github-issues
      - bug-fixes
    removed:
      - snapshot-debugging-al-tests
---

# AL Language extension 30.0

> AL Language extension 30.0 for Business Central 2027 release wave 1 (BC30): previewed 2026-10-01, no stable release yet; 10 changelog entries, 23 GitHub issues linked.

[Changelog on the Visual Studio Marketplace](https://marketplace.visualstudio.com/items/ms-dynamics-smb.al/changelog) · Business Central 2027 release wave 1 · BC30

## What changed on this page

- 2026-10-11: added "Parallel workspace compilation"
- 2026-10-11: added "Modify several fields in one ModifyAll call"
- 2026-10-11: added "Inherent permissions validation in multi-root workspaces"
- 2026-10-11: added "ALTool code coverage export"
- 2026-10-11: added "ALTool changes"
- 2026-10-11: added "Visual Studio Code Editor changes"
- 2026-10-11: added "Miscellaneous"
- 2026-10-11: changed "GitHub issues"
- 2026-10-11: changed "Bug fixes"
- 2026-10-11: removed "snapshot-debugging-al-tests"

## Parallel workspace compilation

- Fixed package-cache lock conflicts being reported as invalid-package errors during parallel workspace compilation on Linux and macOS. They are now reported as the existing package-locked warning.

## Markdown page fields

- Added `ExtendedDatatype = Markdown` for page fields bound to a `Text` variable, `Text` table field, or `Text`-returning procedure, including bounded `Text`. Requires `MultiLine = true` and an only-child field in a root-level group in the Content area. The value remains raw Markdown; direct table-field declarations and `BigText`, `Code`, `Label`, `TextConst`, string literals, and concatenation sources are not supported.

## Modify several fields in one ModifyAll call

`ModifyAll` now accepts up to five field and value pairs on both `Record` and `RecordRef`, so a bulk update of
several fields no longer needs one call per field. `RunTrigger` stays optional and last:

```al
Customer.ModifyAll(Blocked, Blocked::All, "Payment Terms Code", 'CM', true);
RecRef.ModifyAll(AmountFieldNo, 0, DescriptionFieldNo, 'Cleared');
```

`RecordRef.ModifyAll` is new and requires runtime version 30.0 for every call, including a single pair.
`Record.ModifyAll` keeps its existing single-pair form unchanged; only its new multi-pair forms require runtime
version 30.0.

## Inherent permissions validation in multi-root workspaces

The compiler now reports AL0720 when an `InherentPermissions` attribute in one project references an object from another project in a multi-root workspace.

## GitHub issues

- [#8134](https://github.com/microsoft/AL/issues/8134) Fixed code actions blocking other language server messages, which could prevent saving AL files.
- [#8130](https://github.com/microsoft/AL/issues/8130) Fixed Copy & Open not opening the browser during device login when downloading symbols.
- [#8129](https://github.com/microsoft/AL/issues/8129) Fixed publishing an extension while an attach session is waiting, allowing breakpoints in install and upgrade codeunits to be hit again.
- [#8274](https://github.com/microsoft/AL/issues/8274) Added named launch configuration selection to the `al_publish` and `al_debug` agent tools so publishing and debugging can run without an interactive configuration prompt.
- [#8244](https://github.com/microsoft/AL/issues/8244) Added separate test profiles for debugging with or without publishing the app, allowing tests in apps deployed in global or per-tenant scope to be debugged.
- [#8280](https://github.com/microsoft/AL/issues/8280) Fixed `al_publish` hanging after successfully publishing a full dependency tree.
- [#8273](https://github.com/microsoft/AL/issues/8273) Fixed `al_downloadsymbols` ignoring `projectPath` in multi-project workspaces.
- [#8297](https://github.com/microsoft/AL/issues/8297) Fixed authentication becoming unrecoverable when Windows Hello or a Windows profile change invalidates the credentials cache.
- [#8291](https://github.com/microsoft/AL/issues/8291) Fixed `altool IsSymbolOnly` and `altool IsRuntimePackage` so successful `False` results return exit code 0 instead of a failure code.
- [#8325](https://github.com/microsoft/AL/issues/8325) Fixed `al_compile`, `al_build`, and `al_getdiagnostics` returning stale results after a loaded dependency project changed.
- [#8326](https://github.com/microsoft/AL/issues/8326) Fixed `al workspace compile` failing with `Could not locate alc compiler.` on macOS and Linux. The architecture-neutral tools package only contains the `alc` executable of the platform that built it, so no compiler executable exists on macOS and Linux. Each project is now compiled through the tool's own `compile` command, which hosts the same compiler, when no `alc` executable is present.
- [#8330](https://github.com/microsoft/AL/issues/8330) Fixed AL0192 being reported when `Cookie.Name(Text)` or `Cookie.Value(Text)` is used as a setter statement.
- [#8331](https://github.com/microsoft/AL/issues/8331) Fixed Go to Definition failing when no AL project is active.
- [#8171](https://github.com/microsoft/AL/issues/8171) Fixed breakpoints in report request page triggers such as `OnInit` and `OnOpenPage` not being hit.
- [#8337](https://github.com/microsoft/AL/issues/8337) Added the `doc` command to the `al` .NET tool and included the standalone AL Table Proxy Generator in the Windows development tools dependency package.
- [#8001](https://github.com/microsoft/AL/issues/8001) Fixed Excel report layouts changing on every project build. A dataitem name that Excel cannot use verbatim as a sheet name (longer than 31 characters or containing `@ : / \ * ? [ ]`) made each build add its data sheet again and rewrite the layout file, so the file kept showing up as modified in source control. Writing an updated multi-sheet layout also failed with AL0445 ("The file is opened in another application") even when no other application had the file open.
- [#8034](https://github.com/microsoft/AL/issues/8034) Fixed an invalid compile error in workspaces mixing source projects and package dependencies: when a project was opened as a live in-set project reference and another package depended on that same project, the package's own dependency on it failed to resolve, producing a spurious "cannot convert" diagnostic at any call site that passed a value of that project's type into the package's API.
- [#7891](https://github.com/microsoft/AL/issues/7891) Fixed the language server retaining stale contents for closed AL files changed outside Visual Studio Code, such as after switching branches. Watched-file change notifications now reload the file and refresh changed project configuration.
- [#7832](https://github.com/microsoft/AL/issues/7832) Fixed a compiler crash when a `case` statement evaluates a `FieldRef.Value` expression.
- [#8194](https://github.com/microsoft/AL/issues/8194) Fixed the server-backed symbol download flow only considering the active project in a multi-root workspace. Both **AL: Download symbols** and the automatic pre-build symbol check now account for referenced projects, downloading their external dependencies into their own package caches so **AL: Publish full dependency tree for active project** no longer fails with AL1022 for a package that was never downloaded.
- [#8267](https://github.com/microsoft/AL/issues/8267) Fixed `Specified part does not exist in the package` / `Part URI cannot contain a Fragment component` packaging error when a source, report, or Word layout file name contains `(`, `)`, `'`, `#`, or `?`.
- [#8284](https://github.com/microsoft/AL/issues/8284) Fixed test runs hanging after a compilation or publish failure. The test runner now completes both the test run and the pending language-server request when the run cannot start.
- [#8290](https://github.com/microsoft/AL/issues/8290) Fixed AL Explorer source views omitting object details such as codeunit procedures and table methods. Also fixed the "Source" preview crashing (and omitting the rest of the decompiled object) when a multi-language property such as `CaptionML` has a translation that contains a semicolon.

## ALTool code coverage export

`altool runtests` can now export code coverage in BC JSON and Cobertura XML formats. Coverage can include per-line hit data and per-test procedure lookup, with optional AL source enrichment for uncovered lines and procedures.

## Bug fixes

- Fixed AL0327 missing-file errors when compiling control add-ins with Windows-style resource paths on Linux or macOS. Script, stylesheet, and image paths now accept either directory separator during lookup and packaging.
- Fixed agentic AL LSP symbol searches returning an unexplained failure when requested while the workspace was still loading. The `al/symbolSearch` endpoint now waits briefly for initialization and otherwise returns guidance to retry after workspace loading completes.
- Fixed the BCal CLI `/reset` command remaining unavailable in remote MCP sessions after the server advertised workspace reset support.
- Word report layouts containing `INCLUDETEXT` or `INCLUDEPICTURE` field codes now produce a compiler warning.
- `al_symbolsearch` now finds top-level application objects by exact numeric object ID, including objects from dependency symbols.
- Fixed `al_symbolsearch` retaining fully materialized symbol descriptors for the active project and its dependencies after searches. Searches now traverse only the requested symbol scope and return additional results through continuation tokens.
- Fixed culture identification in extension translations, preserving distinct language variants and preventing duplicate-translation errors during publishing.
- Improved AL source formatting in Visual Studio Code and after BCal file writes and edits. Formatting now applies CodeCop-compatible operator, block, and control-keyword layout while keeping empty blocks and blocks with a single property compact. Set `al.legacyFormatting` to `true` to restore the previous formatting behavior in Visual Studio Code; BCal always uses the improved behavior.
- Fixed inconsistent event subscriber ordering when metadata-based event binding is enabled.
- Fixed AS0072, AS0073, AS0074, AS0075, and AS0076 being reported for unchanged obsolete members when a new extension object with a lower object ID targets the same object as an existing extension object.
- Fixed downloads of dependency symbols failing without retrying when another process temporarily locks the destination package. `altool listtests --force` still reports a locked cache-replacement failure instead of retrying.
- Fixed an issue where semantic token processing could crash when a preprocessor `#if` or `#elif` condition appeared inside a report data item, query data item, or XMLport table element.
- Fixed breakpoints in default interface method implementations not being hit when continuing execution with F5, including when interfaces share a name across namespaces.
- Improved diagnostics for private NuGet symbol feeds. A feed that returns HTTP 401 now reports "requires authentication", while HTTP 403 reports "requires authentication or additional permissions" at the failed request, and any credentials embedded in a feed URL are stripped before the URL is written to logs.
- Fixed RoleCenter bookmarks created by Designer disappearing when their action targeted an invalid position in the Sections area. The bookmark is now placed in the default navigation location.
- Fixed generated reference previews omitting the `Subtype` and `TestHandlers` properties from test codeunits.

## ALTool changes

- Added `altool downloadsymbols` to download the symbol packages required by an AL project from a Business Central server or global NuGet sources. Use `--project` to select the project (the current directory is used by default), `--packagecachepath` to select the destination cache, and `--force` to refresh cached packages. `--globalsourcesonly` downloads without a server and supports country/region, custom-feed, custom-feeds-only, and minor-version options. Server downloads use the same connection options as other `altool` commands. The command emits structured JSON by default for pipeline use; pass `--raw` for human-readable output.
- Added `altool listtests <appId>` to discover an app's test codeunits and procedures without running tests, loading a workspace, or requiring source access. It reuses the highest-version matching package in `.alpackages` and downloads only on a cache miss, preserving the downloaded package for later calls. Use `--project` for launch settings and the default cache location, `--packagecachepath` for another cache, or `--force` to download fresh symbols. `altool listtests --appfile <path>` inspects an existing `.app` file entirely offline. Successful stdout contains compact JSON with `appId`, `appName`, `appPublisher`, `appVersion`, and `codeunits` containing `id`, `name`, `namespace`, and `methods` (`name`, `isDataDriven`). Ordinary and data-driven procedures are included; runtime-generated cases are not enumerated. The version identifies the inspected package, not necessarily the installed server version. Logs and contextual metadata errors go to stderr; failures return nonzero instead of a partial or empty success result.

## Visual Studio Code Editor changes

### Miscellaneous

- Go to implementation on a codeunit override now includes the matching default interface method alongside explicit codeunit implementations.
- Go to definition while debugging now opens source for referenced platform and system interfaces.

Source: Visual Studio Marketplace, ms-dynamics-smb.al changelog, Microsoft's text unchanged. Dates from the gallery's upload records.
