Skip to content

v2.11.0

Latest

Choose a tag to compare

@github-actions github-actions released this 08 Sep 09:04
· 23 commits to main since this release
25d5be2

[2.11.0] - 2026-09-08

Added

  • tools: answer the corpus pin from the tree, not the shared submodule checkout
  • ms-buckets: let a workflow ask for the prepared company, so the comparison can be measured
  • test-data: opt-in company normalization, blanking the restored Additional Reporting Currency
  • installed-apps: seed NAV App Installed App from the loaded-app closure
  • ci: run the whole Microsoft surface (40,530 tests) from one manual dispatch
  • corpus: measure how far the pin can advance, on a schedule, and report it
  • expectations: report an expectations entry that matched no test instead of ignoring it
  • preflight: check that the code-navigation tools answer, not that they exist
  • testpage: perform an action's RunObject instead of refusing it as out-of-scope
  • permissions: transcribe permission masks so BC can compose real permission sets
  • tools: pr-body.py, a guarded PR-body editor
  • tools: preflight.py — the autonomous-cycle preflight as an executable check with a real exit code
  • artifacts: relocate the BC artifacts root with AL_RUNNER_ARTIFACTS_ROOT
  • agents: an autonomous-cycle skill for running AL Runner development unattended
  • cli: a hung codeunit no longer takes the whole run down
  • cli: --jobs N runs bundles across worker processes
  • server: iterationTracking on execute pairs loop iterations with values, messages and lines
  • report: resolve request-page controls against the report globals they bind to
  • report: run the request page from Report.Run and write the dataset it asks for
  • record: implement the Date system virtual table (2000000007)
  • record: serve the Metadata Permission Set virtual table (2000000250)
  • all-profile: populate the All Profile system virtual table (2000000178)

Fixed

  • release: tag the tested commit first, so a branch that moved cannot discard a green release
  • date-vt: refuse a half-open Period Start range whose closed end is outside the window, per range
  • tests: cap the suite's heaviest collection at its modal timeout, and stop the message lying about it
  • emit-exclusion: decide per dropped object whether the module can still run
  • testpage: render a Decimal control with its own format, not a hardcoded two decimals
  • integer-vt: decide the half-open refusal per range, so a multi-range filter cannot drop a range silently
  • transactions: end the write transaction at the test-method boundary BC ends it at
  • integer-virtual-table: materialise rows per request so an ordinary row outside the window is readable
  • commit: refuse an explicit Commit() inside an AutoRollback test, the way BC does
  • permissions: answer the effective-permission question instead of dereferencing a null cache
  • testpage: do not write a row whose values did not move
  • testpage: ask the page for its rows when it declares OnFindRecord/OnNextRecord
  • testpage: name a fault in BC's value evaluator instead of reporting BC's date refusal
  • testpage: name a RunObject target in its own object kind's id space, not the page's
  • recursion: enforce BC's own MaxStackDepth instead of a hardcoded 500
  • testpage: render a blank Date, Time or DateTime control as '', the way BC does
  • testpage: classify the refused-close refusal as the gap it is, so a TryFunction cannot swallow it
  • ms-surface: coerce the per-test timeout, so GitHub will create the run at all
  • commit: honor the CommitBehavior attribute instead of always committing
  • page-events: register page trigger-event subscribers where BC looks for them
  • ms-buckets: give the Microsoft bucket workflows a per-test timeout above the hosted runner's speed
  • testpage: evaluate a Date, DateTime or Time control write instead of validating it as text
  • prepass: keep the provisioning-gap report when a source pre-pass wraps the failure
  • integer-virtual-table: implement the window guard the file promised, on all four request paths
  • testpage: realise CurrPage.Update's refresh, so the host's OnAfterGetCurrRecord runs
  • diagnostics: report paired counters from one snapshot, not two loads
  • agents: give each agent a private scratchpad path, and refuse a shared one
  • recordlink: back the AL link surface with the Record Link table instead of a second store
  • permissions: serve the Permission Set system table from permission-set metadata
  • tests: fence NclShadowPublishDiagnosisTests in the console-serial collection
  • rad: stop the incremental fast path shipping a caller bound to a moved object id
  • testpage: announce the navigation-mock demotion where the run log will show it
  • cli: create an output path's parent before the run, and never lose a run to a failed write
  • junit: mark a collateral failure and name a lost suite in the XML report
  • provisioning: stop an unanswered CDN probe from demoting a provisioning tier
  • shadow: name the rename's real failure, and refuse to hand back a directory that cannot be exec'd
  • report-metadata: carry a precompiled dependency dataitem's MaxIteration
  • tools: refuse when nothing vouches for the running copy, and make --timeout 0 a real single pass
  • tablerelation: refuse an unrepresentable relation shape instead of dropping it silently
  • record: report AreFieldsLoaded from the load set BC keeps, not the always-full buffer
  • shadow: retry the shadow-dir publish when the source is locked, instead of crashing
  • testfilter: apply the key and the direction TestFilter is given, and name the key's fields
  • preflight: verify the corpus baseline against its own numbers, not the exit code
  • permissions: store the effective-permission set instead of NREing on a null permission cache
  • pbt: stop refusing a page background task worker's write to a temporary record
  • encryption: give the tenant encryption key a real ledger, so CREATEKEY/DELETEKEY/EXPORTKEY/IMPORTKEY stop raising a bare ArgumentException
  • testpage: refuse a part BC does not render, and an id outside GetField's id space
  • testpart: resolve a part's page id from its client, and resume a control-field search from the cursor
  • cecil: give the zero-parameter no-op its own shim, and refuse an arity mismatch
  • tablerelation: refuse a relation the runner could not resolve, instead of dropping it
  • tools: count a corpus run's per-leg passes correctly, and write down the five false zeros
  • calcformula: resolve SystemRowVersion, which BC puts at field id 0
  • testpage: give the PAGE its own validation-error ledger, so AL stops reading a hardcoded 0
  • testpage: land Last() on the new-row line when it finds nothing, as First() does
  • testpage: match a service tier on the dialog page types' built-in OK/Cancel and on the unattended close
  • published-app: answer NAV App Extra, so the other two FlowFields stop reading false
  • ci-wait: fall through to the API when a failing-log fetch comes back empty
  • calcformula: resolve a tableextension or system field in every CalcFormula and TableRelation lookup, and refuse instead of dropping an arm
  • page-metadata: answer the nine SourceObject columns from BC's own parsed metadata
  • install: let install triggers run to completion — observe their ValueTask, and remove the three gaps that hid behind it
  • jmphook: apply the disabled and Cecil-owned guards to InstallIndirect
  • permissions: back the session user's SUPER status with a real Access Control row, and bump the corpus pin
  • ci-wait: reach a verdict on a concluded run, refuse when freshness is unknown
  • symbols: read TableRelation for a field a precompiled tableextension contributes
  • pages: show an error from OnQueryClosePage the way BC's client does
  • ci: read the collection-weight gate against the leg's own clock, and fail only above 2.5x
  • record: the legacy Object (2000000001) registry holds no rows, because a real tier holds none
  • session: give the Session virtual table (2000000009) the reading session's row
  • user-table: run BC's SystemTableTriggers arms for the User system table
  • record: merge a tableextension's declared keys into the extended table's key list
  • testpage: open a RunObject action's target unattended when no handler is bound
  • reload: clear the query-symbol source list, and keep a bundle's own registration alive across the RAD fast path
  • symbolcache: strip AL directives from a SourceTableView's sorting() clause too
  • testpage: make TestPage.View() and TestPage.Edit() open the CardPageId card
  • symbolcache: count a RunPageLink's entries with the splitter that parses them, and carry what it could not read
  • execute: pick the OnRun codeunit by object id, and make the #2801 ordering rule provable without the AL compiler
  • cache: refuse an AL-output cache identity when the key's inputs are unknown
  • bc-shape: name the member at 73 BC-internals lookups guarded only by !
  • symbols: refuse when a dependency .app's symbols cannot be read, instead of reporting that it declares nothing
  • pagemeta: pass the unreadable-entry out parameter at the RunObject call site
  • flowfield: keep a FlowField's CalcFormula through a tableextension symbol and a late .app registration
  • pagemeta: refuse a page whose SourceTableView or SubPageLink could not be read, and read the ones AL directives guard
  • preflight: retry a dropped packet, refuse a stale copy, and report what the token can merge
  • testpage: apply a RunObject action's RunPageLink instead of refusing it
  • ci-wait: complete the built-in required-context fallback, and stop the test fixtures freezing the ruleset size
  • metadata: answer Page Metadata's PageType from BC's own runtime enum, and CodeUnit Metadata's SubType from the compiler's
  • record: refuse Object Metadata's nine payload columns by name instead of reading blank
  • testpage: resolve a control whose binding the AL compiler registered under another control
  • dotnet-interop: name the surface when a .NET type refuses this OS, and stop the page-open path swallowing refusals
  • reload: clear four built-metadata caches that outlived the bundle they were built from
  • tests: skip a subdirectory deleted while the project walk runs
  • test-exec: order a codeunit's test methods by a key that does not depend on reflection order
  • metadata: clear the object-reference const memo on a bundle reload, and cover the resolver's bare-name and call-site halves
  • seeding: refuse a system-table column the seeder cannot find, instead of skipping it
  • testpage: name the AL error "The TestPage is not open." was reported in place of
  • testpage: a plain Cancel needs dialog chrome, and bump the corpus pin to 6e198a97
  • metadata: resolve a Database::/Report:: const in a where() clause to the object id
  • expectations: audit the run, not the final attempt's own discovery set
  • tools: refuse a verdict from a copy of the tool that origin/main has moved on
  • bundle: collect a multi-app bundle's manifests from the suites, at any depth
  • page-metadata: revalidate EnsureRealPageMetadata's negative answers when the .app set grows
  • permissions: answer IsPermissionSetAssigned from Access Control instead of NREing on a null permission cache
  • test-data: take the --test-data summary as one snapshot
  • reflection: resolve eleven BC method lookups by enumeration, and ratchet the rest
  • pkgdedup: apply the stage-name rule to claim files, floor the age threshold, and bound the rollout window with a measurement
  • agents: derive an agent's worktree path from identity AND issue, so two loops on one slot cannot share a checkout
  • ci-wait: never print a genuine failure under "Superseded ... Harmless"
  • allobj: refuse loudly when the owner index cannot read an assembly, instead of silently unowning every object it declares
  • log: stop the [Component] filter eating every "Loud, never silent" diagnosis
  • permissions: refuse an unreadable permission-set symbol read instead of answering blank
  • cache: one error contract for every startup cache-root writer, and a guard for the al-out root
  • tests: make a bc-engine-serial skip say which collection, why, and what would fix it
  • guards: decide the Base App floor from the manifest, not from prose that quotes it
  • pages: carry the five SourceObject properties a dependency page's symbol file states
  • test-exec: run test codeunits in ascending object ID instead of Assembly.GetTypes() order
  • permissions: delete two dead permission-metadata helpers and guard the shape that hid them
  • ci: see a colon between a closing keyword and its issue reference
  • allobj: an app owns the objects its assembly declares, even when its bundle-root .app is stale
  • testpage: close a self-closing page once, not once per closing mechanism
  • cache: root a relative --cache once, and refuse an unrooted cache root loudly
  • events: observe a precompiled table-event subscriber's ValueTask so its error reaches AL
  • record: refuse a CalcFields field that is not a FlowField or a BLOB, the way BC does
  • published-app: match BC's package ids and Installed, and drop the two known-gaps for it
  • deps: give every R2R chunk of an app its module identity, not just the first
  • table-metadata: resolve an undeclared option column's default by name, not ordinal 0
  • permission-metadata: name the BC-layout change instead of throwing a type asserterror swallows
  • record: decide Object's --test-data precedence from what the backup loaded, not from what the store holds
  • testpage: discard a New() row that nothing wrote to when the page closes
  • testpage: raise OnQueryClosePage on a page the platform closes for a handler
  • deps: ask same-SourcePath before identity, so a version bump is not a self-collision
  • field-triggers: refuse the two silent skips left on the install path
  • testpage: start the row before validating a write to a part's draft line
  • cache: key the content-hash memo on the file, not the path, so hard-linked packages are read once
  • permission-metadata: refuse loudly when a BC member behind a null-forgiving read has moved
  • bcapp: key .app-derived caches on a registration epoch, and drop the negative table cache with them
  • field-triggers: refuse loudly when BC's handler backing field cannot be read
  • cache: identify the layered workspace dir and the table-extension cache by content
  • permissions: say a BC-internals read that failed is a shape gap, not an out-of-scope refusal
  • cache: identify the persisted app-manifests index by package content, not a stat
  • testpage: use the tier's measured refusal text and out-of-range behavior
  • published-application: list the loaded apps, so System App ownership checks stop declining
  • pkgdedup: bound the shared al-runner-pkgdedup staging root
  • date: answer Record Date.IsEmpty() over the widened window, and stop its nine refusals claiming permanent scope
  • refusals: say sixteen TestPage refusals are gaps, not scope boundaries
  • record: answer the Field virtual table on Count, IsEmpty and keyed Get, not only on find
  • test-data: make TestDataProvisioner's --test-data tallies Interlocked
  • tests: guards that scan nothing now fail, and none of them exempts by bare file name
  • compile,patches: name the malformed AL, and stop erasing the frames that say where a failure came from
  • cache: identify the persisted r2r-chunks cache by package content, not a stat
  • temp,output: validate a shared pkgdedup stage before reuse, and stop printing a locale-dependent elapsed time
  • testpage: record a refused control write so ValidationErrorCount can read it
  • refusals: say twenty-seven scope.md citations outside the virtual tables are gaps
  • ci-wait: refuse a verdict resolved from a run that is not the head's live run
  • table-metadata: read TableType, DataClassification and ExternalName off the table declaration
  • install-baseline: serialise baseline appends and the walks that race them
  • flowfields: run BC's own CheckFlowFieldProperties before aggregating
  • phaselog: read VmHWM and VmRSS from one /proc/self/status sample so the peak-RSS invariant cannot race
  • skeleton: put the runner's session user in the User table, so a relation to it resolves
  • flowfields: aggregate Min/Max in CalcNumeric instead of answering a never-written sum accumulator
  • server: drop the dependency page/report metadata memos when the registered .app set changes
  • refusals: say when the runner could not read BC's internals
  • record: fill the Object (2000000001) system table, and make its four OemText columns readable
  • pages: apply a page's SourceTableView on open, precompiled pages included
  • provisioning: report what the network actually did instead of blaming the CDN
  • table-relation: read a namespace-qualified target instead of refusing the relation
  • virtual-tables: say the 55 refusals are gaps, not scope boundaries
  • task-scheduler: refuse TaskExists/CancelTask by name instead of NRE-ing out of BC's scheduler data layer
  • object-metadata: say these twelve refusals are gaps, not scope boundaries
  • test-data: load a table first materialised inside another table's hydration
  • query: give a query FlowField column the query's own flow filters
  • watch,cli: one module per AL identity under --watch, and brace the TEST-TIMEOUT-ABORT guard
  • table-relation: carry a where(... = field(...)) link instead of dropping the whole relation
  • ci-wait: drive the verdict from the ruleset and the newest workflow run
  • server: clear the registered symbol .apps on bundle reload, not just their derived indexes
  • preflight: strip mise's stdout banner, which made a healthy box read as unable to push
  • reporter: tell a collateral failure from a real one when a bundle loses a suite
  • build: make the runner content hash a function of source, not of the build path
  • record: order the hand-out of a table's storage against its --test-data hydration
  • summary: name the bundles that built and then failed to run
  • test-data: hand only symbol-bearing packages to the backup reader
  • two failures that reported as clean results — a PARTIAL pe_signing scan, and a silent corrupt sidecar DLL
  • expectations: give the count baseline one line per app group
  • rad: stop the incremental fast path shipping a caller bound to a moved ordinal or field id
  • date: widen the Date window for a keyed Get, not only for a find
  • cache: identify AL-output cache dependencies by content hash, not mtime+size
  • object-metadata: refuse a moved primaryTree layout instead of reading it as "no rows"
  • permissions: fall back to the Role ID, not the object name, for a Caption-less Name
  • testpage: opening a TestPage is not a commit point
  • report: refuse a request page's rendered-output request instead of writing a dataset
  • cache: key the install-baseline on what was PARSED, not just the .app bytes
  • compile: sort AL source discovery, so test execution order stops depending on readdir
  • resume: hand the carry directory to the child, so a killed parent stops costing the run
  • testpage: load-trigger a handler page opened on a caller-positioned row
  • testpage: run OnValidate on the fields New() stamps from a SubPageLink
  • bc-symbols: key the cache on the payload's SHAPE, not just a number someone has to remember
  • skeleton: seed the tenant's profile page-metadata cache BC reads for control captions
  • expectations: drop the Boolean-spelling known-gap entry #2809 made stale
  • expectations: drop the StartSession known-gap entry that #2825 had already fixed
  • testpage: render a Boolean control as Yes/No, the way real BC does
  • summary: name the bundles that did not compile, in the block that gets read
  • session: refuse StartSession inside a test codeunit, as BC does
  • http: let AL's HttpClient mocking run, and refuse real egress at the egress boundary
  • resume: refuse to report a run whose carried attempt files went missing
  • watch: execute bundles in dependency order, the defect #2614 fixed for --server
  • recordref: scope-check RecordRef.Open against the app's compilation target at runtime
  • reports: run BC's whole pre-report step, not just the OnPreReport trigger
  • resume: carry full results so --output-json, --out and --count-baseline describe the run
  • virtual-tables: stop the find-time populates writing into a temporary record's store
  • server: run a request's bundles in dependency order, not sourcePaths order
  • jobs: scale the per-test watchdog by shard count, after measuring whether it needed it
  • ci: scan commit messages, not just the PR body, for closing and skip directives
  • record: answer the Object Metadata (2000000071) application-database system table
  • reporter: name the suites a bundle lost instead of printing a clean summary
  • session: run a precompiled worker's OnRun body under StartSession
  • dep-metadata: read a precompiled table's TableRelation from SymbolReference.json
  • ci: stop a same-commit cancellation blocking the merge with everything green
  • report: an execution failure must not be reported as a compile failure
  • test-boundary: roll back a failed test's uncommitted writes, as BC's own catch does
  • testpage: fall back to the source table field's OnLookup trigger
  • capture-values: unwrap ByRef so a var parameter renders its value
  • watch: stop serving a dependent bundle the previous compile of its dependency
  • ci: pe_signing verify must fail on a scan that classified no PE files
  • shutdown: make BC's ExecutionScheduler thread background so a one-shot run exits; bound --jobs worker wait
  • testpage: run precompiled pages' lifecycle triggers in the flavour BC emitted them in
  • cache: key the install-baseline on the BC symbol state it was derived from
  • deps: count the Tier-1 sidecar DLL as an implementation, so the provisioning-gap notice stops firing on healthy runs
  • table-connections: run BC's own TableConnectionManager and CRM '@@test@@' test connection on the skeleton session
  • temp: give every runner-written scratch dir an owner, and sweep dead owners' leftovers at startup
  • testpage: apply const()/filter() SubPageLinks on subpage parts instead of refusing them
  • testpage: resolve mangled member names on precompiled pages from SymbolReference.json
  • report: run precompiled reports' OnPre/OnPostReport in the flavour BC emitted them in
  • jobs: write a resumed run's carried cases into its JUnit so the --jobs aggregate is the whole run
  • jobs: scale the AL emit timeout by worker count so --jobs stops losing bundles
  • symbols: a table-extension parse that fails part-way is fatal, never a cached partial
  • enum: keep compiled-deps enum sidecar base/extension entries separate
  • testpage: stamp CurrFieldNo for a TestPage SetValue's validate
  • testpage: fire an eagerly-adopted subpage part's OnOpenPage on first reification
  • events: purge injected-subscriber guard on tableextension eviction
  • resume: continue where the run stopped instead of re-running it from the start
  • record: raise BC's read-only-field error on Feature Key Modify
  • record: a snapshot replay is not an AL Insert — don't refuse its SystemIds
  • deps: extract a dependency's AL source per process, not into a shared dir
  • diagnostics: unwrap TargetInvocationException so EXEC-FAIL names the real cause
  • deps: let a source-built package supersede a packaged copy of the same app
  • testpage: format Decimal-typed TestPage controls with decimal places
  • testpage: tear a TestPage down after an unhandled record-positioning trigger error
  • testpage: reset a page's own globals when a TestPage is reopened
  • testpage: a subpage part linked via SubPageLink never fired OnAfterGetRecord
  • cli: report 0.0.0-main from a source build instead of a stale 2.0.0-preview.1
  • patches: stop a passing run dumping 618 bare stack-frame lines on stderr
  • record: refuse a duplicate SystemId on Insert, preserve it across Modify
  • cache: --no-cache now disables every on-disk cache, not just al-out
  • provision: verify the test toolkit really landed instead of trusting a glob or an exit code
  • provision: remove empty // dirs left by failed AutoProvision
  • watch: clear page/xmlport metadata registries on reload without regressing #1957
  • media: let a structurally valid PNG import into a Media field
  • provision: stop --force/--resolve-version from silently doing less than they say
  • tests: stop bounding the FULL REBUILD search at the cycle-2 marker
  • testpage: run page background tasks inline instead of refusing loudly
  • install: arm event-subscriber injection before the first Install trigger
  • server: select at PROCEDURE granularity for affectedOnly, not whole-object
  • expectations: drop two Feature Key known-gap entries that main already passes
  • streams: implement ALCompiler.DotNetToNavInStream (.NET Stream -> AL InStream)
  • query: apply the ReverseSign column property instead of ignoring it
  • scripts: parse VSTest timestamps on Python 3.9, hold the FIFO portably, and run the script tests
  • testpage: TestPage. adopts the host's own subpage instance
  • diagnostics: name the app group in an EXEC-FAIL, not the bundle marker
  • server: stop a consuming bundle replaying stale C# after a sibling re-emits
  • layered: decide prebuilt-shadow staleness on content, not mtime
  • option: strip AL identifier quoting from Option field member names
  • dep-metadata: carry the SourceObject flags the symbol file states
  • cli: print the build's own version, and stop overselling --print-cache-key
  • phaselog: report a real peak RSS on macOS instead of a silent zero
  • rad: make a namespace clone field-complete instead of naming three properties
  • virtual-tables: stop the first virtual table to populate from latching the other two
  • testpage: page background tasks refuse loudly instead of crashing (partial progress on #2514)
  • rad: stop the incremental fast path shipping a caller bound to the old overload
  • server: make affectedOnly coverage attribution request-wide, not per-module
  • metadata: carry a table's declared Caption onto its NCLMetaTable
  • deps: read a sibling app's manifest from its app root, not just its source folders
  • testpage: GoToRecord not-found restore refreshes non-key fields
  • testpage: GoToRecord no longer resolves position by field caption
  • testpage: TestPage over a temporary SourceTable = Integer opens empty, not the virtual table
  • rad: stop losing a namespace-nested sibling's array on a RAD self-loader clone
  • startup: make ncl-shadow publish/prune safe under concurrent al-runner startups
  • codeunit: trap and roll back a failed guarded Codeunit.Run for both call spellings
  • rad: make the RAD baseline namespace-aware, fixing the empty ModuleDefinition
  • Aggregate Permission Set redrives its union on every Get()/Find() request
  • testpage: enforce field MinValue/MaxValue on TestPage SetValue
  • server: stop affectedOnly from silently narrowing a sibling bundle when a dependency's incremental cycle can't be attributed
  • record: keep field-trigger wiring alive across a tableextension-forced NCLMetaTable rebuild
  • Aggregate Permission Set redrives its union on every touch
  • testpage: resolve TestPage controls bound to tableextension fields
  • runtime: seed NavSession.DocumentStorageService so it never NREs
  • local Codeunit-var manual bindings and TransactionModel::AutoRollback
  • page-metadata: resolve a bundle page's SourceTable against a dependency's precompiled table
  • server: warm-server-reload cluster — precompiled tableextensions, install-baseline restore, affectedOnly env key
  • query: apply static ColumnFilter and FlowField+Sum group-by on the JOIN path
  • record: populate the Aggregate Permission Set virtual table
  • events: clear manually-bound event subscriptions at the codeunit/test boundary
  • page-metadata: reconstruct subpage parts for a precompiled dependency page
  • page-metadata: emit SourceObject and Expressions for a dependency page with no source table
  • testpage: inject lazy trigger/validate subscribers at TestPageFactory's record construction site
  • testpage: render an Option/Enum ordinal as the control's text in ValueToString
  • test-exec: make an unreachable null-instance branch throw, not break
  • report: read ProcessingOnly from dependency symbols, not only parsed AL source
  • query: apply a query column's static ColumnFilter property
  • query: compute a JOIN's FlowField column instead of throwing OOS
  • rollback: a plain nested BC transaction is not a commit point
  • record: asserterror rollback no longer materializes a phantom failed-Insert row or discards an earlier landed write on the same table
  • permissions: a Caption-less permission set's Name falls back to its Role ID
  • hooks: nudge on shell READS of C# too, not just searches
  • query: normalize a module-qualified RelatedTable on Query dataitems
  • testpage: position a page on its first row (or new-row line) the moment it opens
  • rollback: scope asserterror rollback refresh to landed writes
  • query: compute single-dataitem FlowField query columns instead of NRE-ing or corrupting the value
  • test-exec: make a watchdog-timeout suite abort loud, not silent
  • query: retarget wildcard filters on query columns to the source field
  • events: bind IncludeSender to the sender parameter at any position
  • events: lazily inject table-trigger subscribers at metatable-build time
  • agents: allowlist the bc-decompiler MCP tools the agent definitions already document
  • testpage: await the AL page trigger's ValueTask so a control's OnValidate error is not silently discarded
  • page: dispatch non-modal Page.Run instead of NREing on a null ServiceConnection
  • session: give the skeleton NavDatabase a tenant so BC can answer the execution context
  • testpage: resolve a dependency-declared page's SourceTable in GetMetaTable
  • codeunit: a guarded Codeunit.Run must end its own transaction
  • record: create the User Property companion row BC's User insert trigger creates
  • flowfield: negate -exist(...) logically, not through NegateValue
  • company: put the runner's own company in the Company table
  • numbersequence: raise BC's trappable NavALException, not BCL exceptions
  • alsid: answer Sid(name) with BC's not-mapped empty string on a host with no Windows identity store

Documentation

  • skill: say what Microsoft's data recipe is, that it cannot be replicated, and how to capture a difference
  • limitations: audit every claim against a run, and correct sixteen stale ones
  • count-baseline: correct a history entry that recorded three false claims
  • testpage: drop a merge-order note whose two pull requests have both landed
  • countpair: the halves share one word, so a carry lands in Total rather than wrapping
  • scope: audit the §4 gap table row by row; drop seven rows the runner has since closed
  • prose: bound the audit justification's form, and pilot a comment reduction on three files
  • six documentation corrections, each verified against the thing it describes
  • rules: read a CI verdict, never block on one
  • count-baseline: correct two figures that went stale in the pin-catch-up entry
  • agents: ask where a comment's reader is, and stop reviews asking for more prose
  • impl-agent: stop gating comments the posting rule says are ungated
  • weights: correct why AlOutputCacheDoNotCacheTests is recorded at 64s
  • ci: state the BC matrix and required checks this repo actually has, and guard the numbers
  • corpus: record that the action-opens-a-page blind spot is closed, and what is left
  • rules: scan the open-issue queue and fold in siblings that land in the same file
  • ci: narrow the cancelled-run re-run exemption to commits with no failure log
  • skills: say that --auto merges a green PR instead of refusing to arm it
  • skills: size the reviewer pool from measured throughput, arm on approve, and make a conflicted PR visible
  • oos: stop claiming RunnerOutOfScopeException is untrappable from AL, and pin what it does
  • reviewer: post the review on the PR, and stop contradicting the posting rule
  • agents: a rule that an issue's open PRs, not its assignee, decide ownership
  • agents: the loop can measure its own budget, and the assignee is not the lock
  • agents: widen the corpus-test rule, and say the runner fix never waits on it
  • scope: document-service providers are out of scope, and guard the decision
  • pr: put the closing-reference escape hatch where the body is written
  • skill: record that --test-data gives a restored CRONUS, not a prepared one
  • limitations: correct the task-scheduler section — nothing runs, inline or otherwise
  • rules: resolve the never-rerun vs flake-evidence contradiction in ci-verdicts.md
  • rules: the corpus default branch is master, not main
  • patches: correct a transaction-snapshot comment that still says two fixed tests fail
  • agents: record the coordinator's standing authority and the traps found running one
  • agents: opening a corpus PR needs no approval

Changed

  • test-matrix: skip the BC matrix on a docs-only pull request, keep the required context reporting
  • docs: gate doc-pointer checks from tools/test_doc_pointers.py so docs-only PRs still run them
  • corpus: advance the pin to e6a0a0c, where the SingleInstance fixtures stop sharing
  • isolation: fence every console swapper, not just the Log.Install() ones
  • corpus: advance the pin to 9ee6bbc, where the count goes down by one
  • corpus: advance the pin to 0bbe376, the newest prefix that is green
  • corpus: advance the pin seven commits, as far as it goes green
  • runner-extras: pin the source-parsed reader for a tableextension's TableRelation
  • runner-extras: pin precompiled-dependency subscriber dispatch on the User system table
  • cache: drive the server-mode do-not-cache gate, which no arm entered
  • refuse a pull request that moves the corpus pin backward
  • expectations: flag a PR that closes a gap issue while its known-gap entry survives
  • fixtures: discharge the last three Base Application floor entries
  • enforce a corpus-linkage declaration, and reconcile the pin-bump rule with practice
  • run 3 BC legs on a pull request, and rename the required check to match
  • move the guards that must block into a workflow that can gate
  • guards: stop the _BCVersion drift gate walking into every agent's worktree
  • testpage: pin a refusal raised in a table subscriber below a page-global control write
  • main: put a floor under how long main can sit without a verdict
  • guard: fail when two runner-extras app groups claim overlapping idRanges
  • recordref: measure 2000000001's target gate directly, and retire the stale "no tier can see Object"
  • date: stop materialising the 86,885-row window behind a guard that already narrowed the request
  • events: cover the ValueTask reflection arm at both async-unwrap seams
  • preflight: build both halves of the stray-graph FAIL, and name a stray with no graphify
  • guards: scan the runtime shape-gap guards repo-wide, not over five hard-coded filenames
  • oos: stop a throw site from doubling the scope.md pointer, and read IL to do it
  • deps: fold the dependency cache key's package hash into the shared content-hash memo
  • field-triggers: pin all 17 install-path refusals, the proportionality claim and the bundle-load abort
  • provision: stop scanning patch directories whose packages a kept one already covers
  • date: materialise Date rows per request, not a whole window per record variable
  • corpus: enumerate the corpus's test apps instead of naming one path
  • record-patches: keep parsed AL trees across a warm reload, keyed on content
  • guards: scan AlRunner.Tests sources at any depth, not just the top level
  • own every scratch directory in AlRunner.Tests, and enforce it
  • compiler: stop a layered dependency republish re-warming the package reference loader
  • compile: pin the DotNet/compilation-target matrix end to end
  • a nightly Microsoft-bucket run on the newest BC, red for a named reason
  • watch: cover the app-with-table plus test-app arrangement, which had none
  • fixtures: add a way to build a REGISTRABLE .app in-process, and prove it registers
  • startsession: verify the isolation guard stays inert outside a [Test]
  • ms-bucket: move the reader pin to v0.1.2 and name the repository that exists
  • startsession: restore AL coverage of the dispatch path behind the isolation guard
  • suite-abort: make the watchdog flake say what happened instead of nothing
  • corpus: catch up the al-language pin to a307df8 and classify what newly fails
  • #2819: capture a core dump when the runner is killed by a signal
  • cache-gate: stop resolving dep ids into a dead variable, and gate both whole-tree probes
  • systemid: index the duplicate-SystemId check instead of scanning every row
  • add a single-leg diagnostic re-run, so the flake-evidence recipe works in this repo too
  • manual-dispatch workflow to run one Microsoft BaseApp bucket with --test-data
  • jobs: tune each worker for footprint — half the peak memory for 6-7% wall
  • ci: run the C# unit suite on 2 BC legs instead of 8
  • compiler: route source-dependency symbol synthesis through the RAD incremental path
  • program: split static helper functions out of Program.cs
  • cecil: split NclCecilRewrite into partial files by area
  • Key the TestPage field cache by control id, not by table field number
  • perf: give ServerAffectedSelectionTests its measured weight
  • Populate the Windows Language (2000000045) virtual table
  • tests: drop the unused Base Application floor from the most-spawned test fixture
  • stop the changelog sync losing a race it cannot win
  • Route Feature Key (2000000211) to BC's own FeatureKeyDataProvider
  • reporter: pin ProvisionGapLog's discovery order, the one property #2597 left uncovered
  • stop superseded runs from holding job slots
  • compile: run CallSiteArgWrap only when the real emit needs it
  • guard: the silent-skip guard could not see the multi-line shape
  • Evaluate the TestPage control property expression instead of looking it up as a name
  • packages: answer both .app metadata questions from one read, and cache both
  • Populate the Time Zone (2000000164) virtual table from the host
  • Name this bundle's provisioning gaps again in the run summary
  • Give each runner process its own sibling-symbols directory
  • roslyn: parse in parallel and share metadata references across compiles
  • gc: run the runner under Server GC
  • Populate the CodeUnit Metadata (2000000137) virtual table
  • scheduling: record BcVersionDefaultDocumentationTests' measured weight
  • subprocess: drain the async output readers before reading captured stdout
  • perf: gate plain-run instrumentation cost on behaviour, not time
  • Fix page-variable TestPage option enumeration
  • Fix --server single-bundle dependency resolution parity for sibling source apps
  • Server mode: add affected-only runTests selection with conservative forced-full fallback
  • tests: stop loading the Base Application closure in fixtures that never read it
  • orchestrating-a-session: capture the coordinator contract so it stops being re-explained
  • agents: make code navigation the path agents are actually told about
  • tests: route the three worst spawn-heavy test classes through the warm --server fixture
  • corpus: bump the pin to the TestPage-over-a-platform-page suite
  • test-data: read backup tables over serve mode, and stop paying per-call costs on the hottest hooks
  • corpus: bump the pin to the four backfilled BC-behavior tests
  • normalise a Time field's InitValue to the format BC evaluates it with
  • capture DefaultImplementation and UnknownValueImplementation
  • match option text the way BC does, not ordinal-exact
  • drop an unmappable column, not the whole table
  • re-quote a filter() identifier for BC's filter grammar