mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-10-05 14:46:55 +01:00
Add AL implementation guidance skill
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
parent
d608d89cf0
commit
1cb2b32afe
16 changed files with 1120 additions and 31 deletions
|
|
@ -168,3 +168,41 @@ article-read traces, resulting diffs, compile/test outcomes, and independent
|
|||
review evidence, including failures, no-knowledge, partial, and unresolved
|
||||
results. No compile/run or authoring-quality claim follows from the
|
||||
credential-free checks above.
|
||||
|
||||
## Read-only implementation guidance
|
||||
|
||||
`implementation-guidance-fixtures.json` covers a distinct just-in-time
|
||||
consultation contract. Its production-shaped synthetic AL contexts exercise a
|
||||
new privacy constraint after the implementation surface expands beyond the
|
||||
plan, exact consumed-guidance omission, an honest no-additional-guidance
|
||||
control, missing current diff/decision context, and a public-interface
|
||||
checkpoint. They are neutral fixtures, not copies of knowledge samples or
|
||||
evidence of a production integration.
|
||||
|
||||
Validate and prepare the implementation manifest with the shared scorer:
|
||||
|
||||
```powershell
|
||||
$run = Join-Path ([IO.Path]::GetTempPath()) 'bcquality-implementation-guidance-run'
|
||||
pwsh ./tools/Test-DevelopmentGuidanceFixtures.ps1 -Root . `
|
||||
-ManifestPath ./evaluation/implementation-guidance-fixtures.json `
|
||||
-PrepareDirectory $run
|
||||
pwsh ./tools/Test-ImplementationGuidanceEvaluator.ps1
|
||||
```
|
||||
|
||||
The same runner-owned baseline and workspace-map flow used for plan guidance
|
||||
proves that evaluated target repositories remain byte-for-byte and
|
||||
Git-identity stable across scoring. The implementation regression adds strict
|
||||
phase/decision/pin preservation and exact path + decision key + evidence
|
||||
fingerprint deduplication checks. This remains before/after evidence, not an OS
|
||||
sandbox; it cannot detect a transient reverted write.
|
||||
|
||||
BCQuality does not keep consumed state or run checkpoints automatically. The
|
||||
consumer chooses explicit checkpoints, persists consumed triples, recomputes
|
||||
evidence fingerprints, owns edits/build/tests/retries/delivery, and runs an
|
||||
independent final review. `no-knowledge` is only an additive retrieval outcome,
|
||||
never a functional-correctness or release-readiness claim.
|
||||
|
||||
A future experiment should compare four matched arms: baseline, plan-only,
|
||||
implementation-only, and combined. Hold task, starting code, model, tools,
|
||||
runtime, checkpoints, and gates constant. This is a recommended evaluation
|
||||
design, not a claimed result.
|
||||
|
|
|
|||
208
evaluation/implementation-guidance-fixtures.json
Normal file
208
evaluation/implementation-guidance-fixtures.json
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
{
|
||||
"version": 1,
|
||||
"skill": "microsoft/skills/development/al-implementation-guidance.md",
|
||||
"minimumKnowledgeRecall": 1.0,
|
||||
"minimumKnowledgePrecision": 0.67,
|
||||
"cases": [
|
||||
{
|
||||
"id": "expanded-surface-adds-pii-field",
|
||||
"title": "Current implementation expands beyond the plan into a privacy-sensitive schema surface",
|
||||
"evidenceType": "production-shaped-synthetic",
|
||||
"expectedOutcome": "completed",
|
||||
"development-plan": {
|
||||
"request": "Add an opt-in notification channel selected by an internal setup routine.",
|
||||
"affected-files": ["src/Notifications/NotificationSetup.Codeunit.al"],
|
||||
"test-strategy": "Verify the selected channel is persisted and used.",
|
||||
"acceptance-criteria": ["A tenant can select and use the notification channel."]
|
||||
},
|
||||
"implementation-diff": "diff --git a/src/Notifications/NotificationSetup.TableExt.al b/src/Notifications/NotificationSetup.TableExt.al\nnew file mode 100644\n--- /dev/null\n+++ b/src/Notifications/NotificationSetup.TableExt.al\n@@\n+tableextension 71000 \"Notification Setup Ext.\" extends \"Notification Setup\"\n+{\n+ fields\n+ {\n+ field(71000; \"Recipient E-Mail\"; Text[250])\n+ {\n+ DataClassification = ToBeClassified;\n+ }\n+ }\n+}",
|
||||
"decision-context": {
|
||||
"phase": "implement-schema",
|
||||
"decision": "Finalize the newly introduced recipient field before adding persistence tests.",
|
||||
"decision-key": "notification-recipient-schema",
|
||||
"evidence-fingerprint": "sha256:expanded-surface-v1",
|
||||
"affected-files": ["src/Notifications/NotificationSetup.TableExt.al"],
|
||||
"affected-symbols": ["tableextension 71000 Notification Setup Ext.", "field 71000 Recipient E-Mail"],
|
||||
"changed-tokens": ["tableextension", "field", "DataClassification", "ToBeClassified"],
|
||||
"tests": ["Persist and retrieve a recipient email in the setup extension."],
|
||||
"acceptance-criteria": ["The new recipient field is suitable for release."],
|
||||
"development-plan-pin": "plan:notification-channel:v1",
|
||||
"implementation-evidence-pin": "diff:expanded-surface-v1"
|
||||
},
|
||||
"consumed-guidance": [
|
||||
{
|
||||
"path": "microsoft/knowledge/privacy/data-classification-required-on-pii-fields.md",
|
||||
"decision-key": "notification-recipient-schema",
|
||||
"evidence-fingerprint": "sha256:plan-only-v0",
|
||||
"prior-decision": "No recipient field existed in the implementation surface."
|
||||
}
|
||||
],
|
||||
"context": {
|
||||
"bc-version": "28",
|
||||
"technologies": ["al"],
|
||||
"countries": ["w1"],
|
||||
"application-area": ["all"],
|
||||
"unknown": []
|
||||
},
|
||||
"requiredKnowledge": [
|
||||
"microsoft/knowledge/privacy/data-classification-required-on-pii-fields.md"
|
||||
],
|
||||
"optionalKnowledge": [
|
||||
"microsoft/knowledge/privacy/resolve-tobeclassified-before-release.md"
|
||||
],
|
||||
"expectedOmitted": [],
|
||||
"requiresUnresolved": false
|
||||
},
|
||||
{
|
||||
"id": "exact-consumed-guidance-is-omitted",
|
||||
"title": "Exact previously consumed guidance is not reissued",
|
||||
"evidenceType": "production-shaped-synthetic",
|
||||
"expectedOutcome": "no-knowledge",
|
||||
"development-plan": {
|
||||
"request": "Add a recipient email field to notification setup.",
|
||||
"affected-files": ["src/Notifications/NotificationSetup.TableExt.al"],
|
||||
"test-strategy": "Persist and retrieve the recipient.",
|
||||
"acceptance-criteria": ["The recipient is stored with the intended schema."]
|
||||
},
|
||||
"implementation-diff": "diff --git a/src/Notifications/NotificationSetup.TableExt.al b/src/Notifications/NotificationSetup.TableExt.al\n@@\n+ field(71000; \"Recipient E-Mail\"; Text[250])\n+ {\n+ DataClassification = ToBeClassified;\n+ }",
|
||||
"decision-context": {
|
||||
"phase": "implement-schema",
|
||||
"decision": "Finalize the recipient field classification.",
|
||||
"decision-key": "notification-recipient-schema",
|
||||
"evidence-fingerprint": "sha256:recipient-schema-v1",
|
||||
"affected-files": ["src/Notifications/NotificationSetup.TableExt.al"],
|
||||
"affected-symbols": ["field 71000 Recipient E-Mail"],
|
||||
"changed-tokens": ["DataClassification", "ToBeClassified"],
|
||||
"tests": ["Persist and retrieve a recipient email."],
|
||||
"acceptance-criteria": ["The field classification is finalized."],
|
||||
"development-plan-pin": "plan:notification-recipient:v1",
|
||||
"implementation-evidence-pin": "diff:recipient-schema-v1"
|
||||
},
|
||||
"consumed-guidance": [
|
||||
{
|
||||
"path": "microsoft/knowledge/privacy/data-classification-required-on-pii-fields.md",
|
||||
"decision-key": "notification-recipient-schema",
|
||||
"evidence-fingerprint": "sha256:recipient-schema-v1",
|
||||
"prior-decision": "Classify the recipient field according to the data it stores."
|
||||
}
|
||||
],
|
||||
"context": {
|
||||
"bc-version": "28",
|
||||
"technologies": ["al"],
|
||||
"countries": ["w1"],
|
||||
"application-area": ["all"],
|
||||
"unknown": []
|
||||
},
|
||||
"requiredKnowledge": [],
|
||||
"optionalKnowledge": [],
|
||||
"expectedOmitted": [
|
||||
"microsoft/knowledge/privacy/data-classification-required-on-pii-fields.md"
|
||||
],
|
||||
"requiresUnresolved": false
|
||||
},
|
||||
{
|
||||
"id": "no-additional-guidance-control",
|
||||
"title": "Comment-only implementation checkpoint has no additional guidance",
|
||||
"evidenceType": "production-shaped-synthetic",
|
||||
"expectedOutcome": "no-knowledge",
|
||||
"development-plan": {
|
||||
"request": "Correct a spelling error in an internal implementation comment without changing behavior.",
|
||||
"affected-files": ["src/Notifications/NotificationDispatcher.Codeunit.al"],
|
||||
"test-strategy": "Inspect the diff for comment-only changes.",
|
||||
"acceptance-criteria": ["Executable AL is unchanged."]
|
||||
},
|
||||
"implementation-diff": "diff --git a/src/Notifications/NotificationDispatcher.Codeunit.al b/src/Notifications/NotificationDispatcher.Codeunit.al\n@@\n- // Retreive the configured channel.\n+ // Retrieve the configured channel.",
|
||||
"decision-context": {
|
||||
"phase": "verify-diff",
|
||||
"decision": "Confirm that the change remains comment-only.",
|
||||
"decision-key": "notification-comment-spelling",
|
||||
"evidence-fingerprint": "sha256:comment-only-v1",
|
||||
"affected-files": ["src/Notifications/NotificationDispatcher.Codeunit.al"],
|
||||
"affected-symbols": ["procedure DispatchNotification"],
|
||||
"changed-tokens": ["comment"],
|
||||
"tests": ["Inspect the patch for executable changes."],
|
||||
"acceptance-criteria": ["Only comment text changes."],
|
||||
"development-plan-pin": "plan:comment-spelling:v1",
|
||||
"implementation-evidence-pin": "diff:comment-only-v1"
|
||||
},
|
||||
"consumed-guidance": [],
|
||||
"context": {
|
||||
"bc-version": "28",
|
||||
"technologies": ["al"],
|
||||
"countries": ["w1"],
|
||||
"application-area": ["all"],
|
||||
"unknown": []
|
||||
},
|
||||
"requiredKnowledge": [],
|
||||
"optionalKnowledge": [],
|
||||
"expectedOmitted": [],
|
||||
"requiresUnresolved": false
|
||||
},
|
||||
{
|
||||
"id": "missing-current-decision-and-diff",
|
||||
"title": "Plan-only input is not an implementation consultation",
|
||||
"evidenceType": "production-shaped-synthetic",
|
||||
"expectedOutcome": "not-applicable",
|
||||
"development-plan": {
|
||||
"request": "Add notification delivery.",
|
||||
"affected-files": ["src/Notifications/NotificationDispatcher.Codeunit.al"],
|
||||
"test-strategy": "Verify delivery.",
|
||||
"acceptance-criteria": ["Notifications are delivered."]
|
||||
},
|
||||
"implementation-diff": "",
|
||||
"decision-context": {},
|
||||
"consumed-guidance": [],
|
||||
"context": {
|
||||
"bc-version": "28",
|
||||
"technologies": ["al"],
|
||||
"countries": ["w1"],
|
||||
"application-area": ["all"],
|
||||
"unknown": []
|
||||
},
|
||||
"requiredKnowledge": [],
|
||||
"optionalKnowledge": [],
|
||||
"expectedOmitted": [],
|
||||
"requiresUnresolved": false
|
||||
},
|
||||
{
|
||||
"id": "read-only-public-interface-checkpoint",
|
||||
"title": "Public interface checkpoint returns constraints without repository mutation",
|
||||
"evidenceType": "production-shaped-synthetic",
|
||||
"expectedOutcome": "completed",
|
||||
"development-plan": {
|
||||
"request": "Expose delivery status through the existing notification provider contract.",
|
||||
"affected-files": ["src/Notifications/INotificationProvider.Interface.al"],
|
||||
"test-strategy": "Compile existing and new provider implementations.",
|
||||
"acceptance-criteria": ["Existing dependent provider implementations remain compatible."]
|
||||
},
|
||||
"implementation-diff": "diff --git a/src/Notifications/INotificationProvider.Interface.al b/src/Notifications/INotificationProvider.Interface.al\n@@\n interface \"Notification Provider\"\n {\n procedure Send(NotificationId: Guid);\n+ procedure GetDeliveryStatus(NotificationId: Guid): Enum \"Delivery Status\";\n }",
|
||||
"decision-context": {
|
||||
"phase": "public-contract-checkpoint",
|
||||
"decision": "Choose a compatible shape for the new delivery-status capability.",
|
||||
"decision-key": "notification-provider-status-contract",
|
||||
"evidence-fingerprint": "sha256:provider-interface-v2",
|
||||
"affected-files": ["src/Notifications/INotificationProvider.Interface.al"],
|
||||
"affected-symbols": ["interface Notification Provider", "procedure GetDeliveryStatus"],
|
||||
"changed-tokens": ["interface", "procedure", "Enum"],
|
||||
"tests": ["Compile unchanged dependent provider implementations.", "Compile a provider opting into delivery status."],
|
||||
"acceptance-criteria": ["Existing implementations remain compatible."],
|
||||
"development-plan-pin": "plan:delivery-status:v1",
|
||||
"implementation-evidence-pin": "diff:provider-interface-v2"
|
||||
},
|
||||
"consumed-guidance": [],
|
||||
"context": {
|
||||
"bc-version": "28",
|
||||
"technologies": ["al"],
|
||||
"countries": ["w1"],
|
||||
"application-area": ["all"],
|
||||
"unknown": []
|
||||
},
|
||||
"requiredKnowledge": [
|
||||
"microsoft/knowledge/interfaces/extend-published-interfaces-dont-edit-them.md"
|
||||
],
|
||||
"optionalKnowledge": [],
|
||||
"expectedOmitted": [],
|
||||
"requiresUnresolved": false
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue