mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-08-06 17:36:53 +01:00
* Add precision guards for systematic agent false-positive patterns Encodes reviewer-confirmed FP guards from the online eval: tooltip-inherited, page-trigger default return, drill-down filter not visible in diff, dual-trigger CalcFields (do.md); and a released-baseline precondition for breaking-change/upgrade findings on never-shipped symbols. * Scope suggested-code and location to exactly the changed lines Addresses reviewer-reported misplaced suggestions from the eval: insert-only-property emitting the whole field, single-statement rewrites anchored on the procedure name, and reductive multi-line collapses. The skill now emits a location range that matches precisely the rewritten lines. * Correct suggested-code scoping guidance to match one-click anchor mechanics A lone inserted line matches no existing file line and cannot be anchored; bracket the new line with one adjacent unchanged line instead. Reductive collapses omit suggested-code and fall back to a manual snippet. * Move BC-specific FP guards out of do.md into leaf skills do.md is the stable action-skill template and must stay domain-agnostic (JesperSchulz review). Relocate the four known false-positive patterns to their domain leaves: ToolTip-inheritance to al-ui-review; drill-down/lookup filtering and CalcFields lifecycle to al-performance-review; page-trigger exit(true) semantics to al-error-handling-review. * Move suggested-code line-scoping guidance out of do.md into al-code-review do.md must not carry instructions for how the review skill behaves (JesperSchulz review). Relocate the location/suggested-code precise-span rules to al-code-review's existing Suggested-code guidance section. do.md is now unchanged vs main. * Move false-positive guards from skills into knowledge files Keep review skills slim (finders/appliers). The FP guards and released-baseline preconditions previously embedded in leaf skills become negative-clarification knowledge articles in their domains, and the agent-findings policy edits to al-ui/al-privacy are reverted to main. Adds 6 knowledge files: error-handling (page-boolean-triggers-default-to-true), ui (bound-page-field-inherits-source-field-tooltip), performance (calcfields-in-both-getrecord-triggers-is-not-redundant, page-effective-filter-may-live-outside-the-diff), breaking-changes (unreleased-symbol-change-is-not-a-breaking-change), upgrade (unreleased-schema-change-needs-no-upgrade-path). * Revert branch's suggested-code scoping addition in al-code-review The three location-span shapes added to al-code-review are output-format mechanics, not domain knowledge: one-click span correctness is the engine's job (Resolve-SuggestionPlacement) and do.md already owns the suggested-code/location contract. The AL concerns the examples illustrate are already covered by existing knowledge (use-isempty-for-existence-check, data-classification-required-on-pii-fields, no-space-before-method-parenthesis). Restores al-code-review to main; the branch now adds only the 6 knowledge files. * Restore al-ui/al-privacy review skills to base (zero diff in PR) These two leaf skills carried an accidental net change against the PR merge-base because an earlier revert used the current origin/main (post-#110) instead of the branch base (pre-#110). Restoring them to the merge-base version removes them from the PR diff entirely. Three-way merge still preserves main's #110 suppression. --------- Co-authored-by: wenjiefan <wenjiefan@microsoft.com> |
||
|---|---|---|
| .. | ||
| addloadfields-in-report-onpredataitem.bad.al | ||
| addloadfields-in-report-onpredataitem.good.al | ||
| addloadfields-in-report-onpredataitem.md | ||
| admin-and-migration-pages-tolerate-lower-perf.md | ||
| apply-filters-before-iterating.bad.al | ||
| apply-filters-before-iterating.good.al | ||
| apply-filters-before-iterating.md | ||
| apply-guards-before-get.bad.al | ||
| apply-guards-before-get.good.al | ||
| apply-guards-before-get.md | ||
| avoid-cloning-records-before-modify-delete-in-loops.bad.al | ||
| avoid-cloning-records-before-modify-delete-in-loops.good.al | ||
| avoid-cloning-records-before-modify-delete-in-loops.md | ||
| avoid-commit-inside-loops.bad.al | ||
| avoid-commit-inside-loops.good.al | ||
| avoid-commit-inside-loops.md | ||
| avoid-get-inside-loop-on-large-table.bad.al | ||
| avoid-get-inside-loop-on-large-table.good.al | ||
| avoid-get-inside-loop-on-large-table.md | ||
| avoid-growing-globals-in-singleinstance-subscribers.bad.al | ||
| avoid-growing-globals-in-singleinstance-subscribers.good.al | ||
| avoid-growing-globals-in-singleinstance-subscribers.md | ||
| avoid-recordref-in-hot-loop.bad.al | ||
| avoid-recordref-in-hot-loop.good.al | ||
| avoid-recordref-in-hot-loop.md | ||
| avoid-redundant-get-when-record-already-loaded.bad.al | ||
| avoid-redundant-get-when-record-already-loaded.good.al | ||
| avoid-redundant-get-when-record-already-loaded.md | ||
| avoid-user-prompts-inside-transactions.bad.al | ||
| avoid-user-prompts-inside-transactions.good.al | ||
| avoid-user-prompts-inside-transactions.md | ||
| calcfields-in-both-getrecord-triggers-is-not-redundant.md | ||
| calcsums-instead-of-calcfields-in-loop.bad.al | ||
| calcsums-instead-of-calcfields-in-loop.good.al | ||
| calcsums-instead-of-calcfields-in-loop.md | ||
| choose-maintainsiftindex-by-read-write-ratio.good.al | ||
| choose-maintainsiftindex-by-read-write-ratio.md | ||
| codeunit-run-as-atomic-sub-operation.bad.al | ||
| codeunit-run-as-atomic-sub-operation.good.al | ||
| codeunit-run-as-atomic-sub-operation.md | ||
| codeunit-run-requires-prior-commit-inside-transaction.bad.al | ||
| codeunit-run-requires-prior-commit-inside-transaction.good.al | ||
| codeunit-run-requires-prior-commit-inside-transaction.md | ||
| do-not-locktable-in-read-only-procedure.bad.al | ||
| do-not-locktable-in-read-only-procedure.good.al | ||
| do-not-locktable-in-read-only-procedure.md | ||
| do-not-modify-in-onaftergetrecord.bad.al | ||
| do-not-modify-in-onaftergetrecord.good.al | ||
| do-not-modify-in-onaftergetrecord.md | ||
| do-not-remove-sourcetabletemporary-from-api-page.bad.al | ||
| do-not-remove-sourcetabletemporary-from-api-page.good.al | ||
| do-not-remove-sourcetabletemporary-from-api-page.md | ||
| findset-true-applies-updlock-on-read.bad.al | ||
| findset-true-applies-updlock-on-read.good.al | ||
| findset-true-applies-updlock-on-read.md | ||
| flowfield-source-key-needs-sumindexfields.bad.al | ||
| flowfield-source-key-needs-sumindexfields.good.al | ||
| flowfield-source-key-needs-sumindexfields.md | ||
| guard-event-subscribers-before-db-call.bad.al | ||
| guard-event-subscribers-before-db-call.good.al | ||
| guard-event-subscribers-before-db-call.md | ||
| hidden-flowfields-still-calculate-before-bc26-opt-in.bad.al | ||
| hidden-flowfields-still-calculate-before-bc26-opt-in.good.al | ||
| hidden-flowfields-still-calculate-before-bc26-opt-in.md | ||
| load-common-fields-before-branching-on-case.bad.al | ||
| load-common-fields-before-branching-on-case.good.al | ||
| load-common-fields-before-branching-on-case.md | ||
| load-only-primary-key-fields-for-reference-work.bad.al | ||
| load-only-primary-key-fields-for-reference-work.good.al | ||
| load-only-primary-key-fields-for-reference-work.md | ||
| maintainsqlindex-false-breaks-flowfield-sift.bad.al | ||
| maintainsqlindex-false-breaks-flowfield-sift.md | ||
| order-case-branches-by-frequency.bad.al | ||
| order-case-branches-by-frequency.good.al | ||
| order-case-branches-by-frequency.md | ||
| page-effective-filter-may-live-outside-the-diff.md | ||
| pair-findset-with-next-loop.bad.al | ||
| pair-findset-with-next-loop.good.al | ||
| pair-findset-with-next-loop.md | ||
| pass-false-to-insert-when-trigger-not-needed.good.al | ||
| pass-false-to-insert-when-trigger-not-needed.md | ||
| prefer-dictionary-over-temporary-table-for-lookups.md | ||
| prefer-modifyall-over-per-row-modify.bad.al | ||
| prefer-modifyall-over-per-row-modify.good.al | ||
| prefer-modifyall-over-per-row-modify.md | ||
| prefer-readisolation-over-locktable-for-reads.bad.al | ||
| prefer-readisolation-over-locktable-for-reads.good.al | ||
| prefer-readisolation-over-locktable-for-reads.md | ||
| setcurrentkey-aligns-key-with-filters.good.al | ||
| setcurrentkey-aligns-key-with-filters.md | ||
| singleton-setup-tables-need-no-access-optimization.md | ||
| temporary-tables-have-no-database-cost.md | ||
| triggers-and-media-field-regress-modifyall.md | ||
| understand-implicit-transaction-boundary.md | ||
| use-deleteall-for-filtered-bulk-deletion.bad.al | ||
| use-deleteall-for-filtered-bulk-deletion.good.al | ||
| use-deleteall-for-filtered-bulk-deletion.md | ||
| use-get-instead-of-findfirst-on-full-primary-key.bad.al | ||
| use-get-instead-of-findfirst-on-full-primary-key.good.al | ||
| use-get-instead-of-findfirst-on-full-primary-key.md | ||
| use-isempty-for-existence-check.bad.al | ||
| use-isempty-for-existence-check.good.al | ||
| use-isempty-for-existence-check.md | ||
| use-setautocalcfields-for-per-row-flowfields.bad.al | ||
| use-setautocalcfields-for-per-row-flowfields.good.al | ||
| use-setautocalcfields-for-per-row-flowfields.md | ||
| use-setloadfields-for-partial-records.bad.al | ||
| use-setloadfields-for-partial-records.good.al | ||
| use-setloadfields-for-partial-records.md | ||
| use-textbuilder-for-string-concatenation-in-loops.md | ||
| use-tryfunction-for-error-catching-not-rollback.bad.al | ||
| use-tryfunction-for-error-catching-not-rollback.good.al | ||
| use-tryfunction-for-error-catching-not-rollback.md | ||