Close AL development contract gaps

Bound post-implementation review rounds, expose output kinds in Entry
dispatch, enforce capability coverage, map BCFIX-HANDOFF v1, clarify
no-knowledge behavior, and reject repository-escaping skill paths.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 638b66d2-9f06-4f60-8781-808709e1485c
This commit is contained in:
Jesper Schulz-Wedde 2026-09-04 13:36:49 +02:00
parent 56b80e6dcf
commit f6fca1d56d
15 changed files with 356 additions and 52 deletions

View file

@ -83,7 +83,8 @@ pwsh ./tools/Test-DevelopmentFixtures.ps1 -Root . -ResultsDirectory ./.developme
The initial fixtures cover setup-backed master data, document header/line
workflows, versioned API integrations, and surgical diagnosis and repair of a
batch-processing bug. The broader capability roadmap lives in
batch-processing bug, plus a rerunnable data upgrade. The capability manifest
enforces a minimum fixture-backed coverage ratio; the broader roadmap lives in
`coverage/development-capabilities.json`.
### Read-only plan guidance

View file

@ -1,6 +1,7 @@
{
"version": 1,
"skill": "microsoft/skills/development/al-development.md",
"maximumReviewRounds": 3,
"minimumKnowledgeRecall": 1.0,
"minimumKnowledgePrecision": 0.5,
"cases": [
@ -183,6 +184,54 @@
"tests",
"review"
]
},
{
"id": "versioned-data-upgrade",
"title": "Implement a rerunnable data upgrade",
"capabilities": [
"install-and-upgrade"
],
"expectedKind": "upgrade",
"development-request": {
"kind": "upgrade",
"description": "Upgrade an existing app from a text-based Customer Tier field to a new enum-backed Tier field. Preserve existing customer data, support tenants that skip intermediate app versions, keep fresh installation separate from migration, and add upgrade tests.",
"acceptance-criteria": [
"Existing tier values are migrated without running field validation triggers.",
"The migration is guarded by an upgrade tag and is safe when the upgrade runs again.",
"Check and validation triggers do not write data.",
"Fresh installation does not run version-upgrade migration.",
"Tests cover more than one historical source data version."
]
},
"context": {
"technologies": [
"al"
],
"countries": [
"w1"
],
"application-area": [
"all"
]
},
"requiredKnowledge": [
"microsoft/knowledge/upgrade/appversion-meaning-depends-on-execution-context.md",
"microsoft/knowledge/upgrade/install-and-upgrade-codeunits-have-no-order.md",
"microsoft/knowledge/upgrade/use-upgrade-tags-not-version-checks.md",
"microsoft/knowledge/upgrade/check-only-triggers-do-not-migrate-data.md",
"microsoft/knowledge/upgrade/install-code-does-not-run-on-version-upgrade.md"
],
"optionalKnowledge": [
"microsoft/knowledge/upgrade/datatransfer-skips-triggers-and-subscribers.md",
"microsoft/knowledge/upgrade/datatransfer-for-bulk-init.md",
"microsoft/knowledge/upgrade/register-upgrade-tags-with-subscribers.md",
"microsoft/knowledge/testing/transactionmodel-attribute-governs-test-transactions.md"
],
"requiredChecks": [
"compile",
"tests",
"review"
]
}
]
}

View file

@ -2,29 +2,37 @@
"version": 1,
"skill": "microsoft/skills/development/al-development-plan.md",
"minimumKnowledgeRecall": 1.0,
"minimumKnowledgePrecision": 0.5,
"minimumKnowledgePrecision": 0.67,
"cases": [
{
"id": "bcapps-filtered-batch-bug-plan",
"title": "Select guidance for a filtered batch bug fix",
"title": "Select guidance from a BCFIX-HANDOFF v1 payload",
"expectedKind": "bug",
"development-plan": {
"kind": "bug",
"request": "Fix a filtered batch routine that updates only the first matching record.",
"root-cause": "The routine calls FindFirst and updates the current record without entering an enumerator loop.",
"affected-files": [
"src/Batch/UpdateSelectedEntries.Codeunit.al",
"format": "BCFIX-HANDOFF",
"version": 1,
"issue": 4312,
"phase": "implement",
"status": "paused",
"baton": 2,
"rootCause": "The routine calls FindFirst and updates the current record without entering an enumerator loop, so only the first record in the supplied filtered set is modified.",
"harnessMap": {
"testCodeunit": "Update Selected Entries Tests",
"libraries": [
"Library - Random"
],
"pages": [],
"handlers": []
},
"iterationsUsed": 1,
"filesCommitted": [
"test/Batch/UpdateSelectedEntries.Codeunit.al"
],
"proposed-changes": [
"Iterate the supplied filtered record set and update every selected entry.",
"Add a regression test with multiple selected entries."
"lastTestResult": "1 failing, 4 passing; the red test shows only the first of three selected records is updated.",
"deadEnds": [
"Changing the page selection did not help because the codeunit discarded the supplied enumerator."
],
"test-strategy": "Establish a red test where only one of several selected records is updated, then require all selected records to be updated after the fix.",
"acceptance-criteria": [
"The supplied filters are preserved.",
"Every selected record is updated.",
"The regression test demonstrates red-to-green behavior."
]
"nextStep": "Replace the single-record read with an update-safe FindSet/Next loop that preserves the supplied filters, then rerun the red test."
},
"context": {
"technologies": [
@ -45,6 +53,50 @@
"optionalKnowledge": [
"microsoft/knowledge/performance/pass-var-record-to-preserve-partial-load-enumerator.md"
]
},
{
"id": "versioned-upgrade-plan-guidance",
"title": "Select guidance for a versioned data upgrade",
"expectedKind": "upgrade",
"development-plan": {
"kind": "upgrade",
"request": "Migrate existing customer tier text values to a new enum field in an app upgrade.",
"root-cause": "The new schema needs an explicit, rerunnable migration for existing tenant data.",
"affected-files": [
"src/Upgrade/CustomerTierUpgrade.Codeunit.al",
"test/Upgrade/CustomerTierUpgradeTests.Codeunit.al"
],
"proposed-changes": [
"Add a tagged upgrade step that copies existing values without validation triggers.",
"Add upgrade tests from multiple historical data versions."
],
"test-strategy": "Run upgrade tests from two prior data versions and verify a second invocation makes no further changes.",
"acceptance-criteria": [
"Existing values are preserved.",
"The migration is rerunnable.",
"Fresh installation does not execute upgrade migration."
]
},
"context": {
"technologies": [
"al"
],
"countries": [
"w1"
],
"application-area": [
"all"
]
},
"requiredKnowledge": [
"microsoft/knowledge/upgrade/use-upgrade-tags-not-version-checks.md",
"microsoft/knowledge/upgrade/check-only-triggers-do-not-migrate-data.md",
"microsoft/knowledge/upgrade/install-code-does-not-run-on-version-upgrade.md"
],
"optionalKnowledge": [
"microsoft/knowledge/upgrade/datatransfer-skips-triggers-and-subscribers.md",
"microsoft/knowledge/upgrade/appversion-meaning-depends-on-execution-context.md"
]
}
]
}