Annotate two gold answers with existing BCQuality articles - #847
Merged
Conversation
Adds the missing BCQuality article annotations to the two unannotated code-review entries whose findings a published article faithfully covers: - synthetic__sec-internal-not-boundary-01 -> security/internal-access-is-not-a-security-boundary - synthetic__upgrade-obsolete-caption-01 -> upgrade/obsoletion-requires-reason-and-tag Per-article coverage goes from 80/251 to 82/251. Both slugs already exist on BCQuality main, so the e2e slug-existence check stays green. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7a9dff24-8942-4810-8359-18904eaa4da4
Sun Haoran (haoranpb)
approved these changes
Sep 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this does
Adds
articlesannotations to two code-review gold answers, raising per-article BCQuality coverage from 80/251 (31.9%) to 82/251 (32.7%).synthetic__upgrade-obsolete-caption-01upgrade/obsoletion-requires-reason-and-tagsynthetic__sec-internal-not-boundary-01security/internal-access-is-not-a-security-boundaryWhy only two. I set out to annotate all 30 unannotated entries. After reading every candidate article end to end, only these two have an article that faithfully covers the finding. Per the project convention, an entry with no faithful article is left unannotated rather than mis-credited.
Entry 110 —
upgrade-obsolete-caption-01The gold answer requires flagging an action whose caption was changed to
'... (Obsolete)'without any of the obsoletion properties being set.upgrade/obsoletion-requires-reason-and-tagstates that an obsoleted element must carryObsoleteState,ObsoleteReasonandObsoleteTag. Direct match.Entry 120 —
sec-internal-not-boundary-01The gold answer requires flagging code that relies on
internalvisibility to protect a sensitive value.security/internal-access-is-not-a-security-boundarystates exactly thatinternalis a compile-time visibility modifier and not a security boundary. Direct match.Finding 1 — a gold answer contradicts a BCQuality article
synthetic__style-this-keyword-01is a false-positive guard (expected_comments: []). Its patch is aSubtype = Testcodeunit that calls its ownInitialize()andCreateRequest()procedures as bare identifiers, and the entry expects no finding. Its owndescriptionfield states the rationale:BCQuality
style/this-keyword-in-codeunits.mdstates the opposite:this."ValidateCustomer(Customer)) when other readings are possible"bc-version: [25..], and the entry'senvironment_setup_versionis27.0, so the article applies.Both sides claim to represent BCApps convention, and they cannot both be right. An agent that follows the article necessarily fails this gold answer; an agent that passes it is necessarily ignoring the article. This needs a human decision — either narrow the article to exempt test codeunits, or retire the guard. No change is made here; this PR only records the conflict.
Finding 2 — 12 human-approved findings have no article behind them
Twelve unannotated entries are not synthetic inventions. Their descriptions identify them as findings the agent produced on real BCApps pull requests that a human reviewer accepted (THUMBS_UP). None of them has a BCQuality article:
upgrade-transferfields-field-collision-01r3690213000TransferFieldsacross tables where field 100 has incompatible typesdata-modeling-excluded-from-calculation-01r3691079460data-modeling-blocked-validation-skip-01r3704042966Validate()fails for accounts blocked for all transactionserror-handling-silent-skip-01r3703883994upgrade-broken-hook-copyrows-01r3704047134DataTransfer.CopyRows()called outside upgrade/install contextdata-modeling-tablerelation-restriction-mismatch-01r3669143568style-field-repurpose-indent-01r3535265290Indentfield repurposed to carry an unrelated keyerror-handling-drilldown-position-01r3604298340style-tooltip-mismatch-01error-handling-fieldno-swap-01FieldNoerror-handling-guiallowed-01GuiAllowed()gating skips integrity checkserror-handling-assistedit-cancel-01SaveRecord()after a cancellable AssistEditThese are the strongest candidates for new BCQuality articles: the value has already been demonstrated on production pull requests, and the corpus cannot currently reproduce it.
Finding 3 — recurring false positives with no suppressing article
Six false-positive guards have no article that would suppress them. Two carry explicit occurrence counts in their descriptions:
privacy-004— "PII in error messages (8 false positives)". GUIDs, SystemIds and document IDs in error messages are not personally identifiable, but no article says so.style-001— "caption_false_positive (790 false positives)".style-showmandatory-flowfield-01— a non-editable FlowField does not needShowMandatory.error-testfield-enabled-01— an action'sEnabledproperty already guarantees the field is non-blank, so a demandedTestFieldis redundant.error-handling-case-unreachable-else-01— acasethat is exhaustive over a non-extensible enum does not require anelse.testing-tolerance-clean-01— a documented +/-1 day timezone tolerance is not an unbounded assertion.Each of these is a precision cost with no corpus-side defence.
Finding 4 — four entries have stale descriptions
style-001,style-003,style-008andsecurity-007carry descriptions that call them clean or false-positive examples, but all four haveexpect_findings: trueand a real positiveexpected_comment(indentation, Hungarian prefix, non-PascalCase procedure name, HTTP instead of HTTPS). The descriptions appear to be left over from an earlier generation pass. Scoring is unaffected because the loader ignoresdescription, but the field is misleading to anyone reading the dataset. Not changed here.Articles checked and ruled out
Read in full and rejected, with the reason:
security/inherent-permissions-minimal-grantInherentPermissions = RIXsecurity/permission-set-avoid-wildcard-grants*grantssecurity/do-not-grant-rights-beyond-a-users-entitlementsecurity/validate-user-configurable-urlsstyle/tooltip-required-on-page-fieldsstyle/this-keyword-in-codeunitsdata-modeling/check-blocked-in-referencing-code-not-in-masterTestField(Blocked, false)in consumers; the entry is the opposite casedata-modeling/table-relation-extensions-are-additive-and-top-downupgrade/hybrid-migration-codeunits-not-standard-upgradeupgrade/datatransfer-skips-triggers-and-subscribersCopyRows()context restrictionsprivacy/session-logmessage-requires-dataclassificationprivacy-clean-02supplies the classification, but its stated subject is message content, already covered byno-pii-in-telemetry-message-stringtesting/ui-handlers-in-testsRunModalbusiness assertionsSearched across all 251 articles with no hit:
GuiAllowed,SaveRecord,ShowMandatory,UserSecurityId,tolerance,Extensible = false,CopyRows,repurpos,Excluded from calculation.testing-ui-handler-assert-after-run-01is deliberately left unannotated pending BCQuality #132, which introduces the article that would cover it.Coverage gap by domain
172 of 251 articles remain unexercised. The largest gaps are
ui(26),events(17),performance(16) anderror-handling(15). Four domains are at zero coverage and are small enough to close quickly:query(2),appsource(4),interfaces(5).Validation
uv run ruff format- 366 files unchangeduv run ruff check- cleanuv run pytest -q- 871 passed, 2 skipped (matches baseline)declared_articles()resolves on both edited entriesunknown_articles: []Both slugs were taken from BCQuality
origin/main(2439d5c), so the live-slug e2e gate passes.