mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-08-07 18:06:53 +01:00
Authoring-assist: suppressor signals, prose mining, applicability + keyword checks
Expand Suggest-ArticleSignals.ps1 from signals-only to the full routing-relevant head-matter: - Suppressor detection: 'not-a-violation' articles (by title/prose, excluding prohibitions) propose effect: suppress mapping-form signals. - Prose mining: extract AL constructs from inline code + fenced al blocks so the ~17% of sample-less articles are covered (marked proseOnly); -NoProse opts out. - Applicability cross-check: flag JS/control-add-in use when technologies omits javascript. - Keyword suggestions: strong proposed tokens missing from keywords. Generated suppress blocks pass validate_frontmatter R24. Suggest-only, offline. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
parent
498055577e
commit
ac653891e2
2 changed files with 181 additions and 36 deletions
|
|
@ -20,17 +20,37 @@ critical work we don't want to guess at. This tool lowers that authoring cost.
|
|||
## What it does
|
||||
|
||||
For each article it reads the article's own co-located `good`/`bad` `.al` samples
|
||||
plus its front-matter, extracts candidate AL constructs, and emits:
|
||||
**and its prose** (inline `` `code` `` spans + fenced ```` ```al ```` blocks), plus
|
||||
its front-matter, extracts candidate AL constructs, and emits:
|
||||
|
||||
1. **Proposed `signals:` block** — the highest-value constructs that are *not*
|
||||
already routed to the article's domain by `routing-seed.json`. Constructs are
|
||||
ranked by: keyword-backed (+3), appears in the `.bad.al` anti-pattern sample
|
||||
(+2), frequency. Sample-local scaffolding (procedure/object names) and
|
||||
structural AL vocabulary (types, control-flow, object kinds) are filtered out.
|
||||
2. **Domain-mismatch flag** — when ≥2 of an article's sample constructs are known
|
||||
(+2), seen in an actual sample (+1), frequency. Sample-local scaffolding
|
||||
(procedure/object names) and structural AL vocabulary (types, control-flow,
|
||||
object kinds) are filtered out.
|
||||
2. **Suppressor (`effect: suppress`) proposals** — when an article exists to say a
|
||||
construct is **not** a violation of its domain (detected from the title/basename
|
||||
and prose, e.g. `page-display-is-not-a-privacy-concern`), its constructs are
|
||||
proposed as `effect: suppress` (mapping form) instead of raise. A suppress hit
|
||||
*dampens* the domain score in the orchestrator rather than raising it, directly
|
||||
attacking the over-firing (precision) problem. Prohibitions (`do-not-…`,
|
||||
`avoid-…`) are explicitly **excluded** — those describe a real violation.
|
||||
3. **Domain-mismatch flag** — when ≥2 of an article's sample constructs are known
|
||||
to the seed and they route to a *different* domain than the article declares
|
||||
(e.g. an `events/` article whose sample is all `TryFunction`/`Error`). A soft
|
||||
advisory prompting the author to confirm the domain or add a cross-domain signal.
|
||||
Skipped for suppressor articles, which deliberately reference other domains.
|
||||
4. **Applicability note** — flags samples/prose that use a JavaScript control add-in
|
||||
when `technologies` omits `javascript`. Small but concrete; kept minimal because
|
||||
the technologies vocabulary is tiny (`al`/`javascript`).
|
||||
5. **Keyword suggestions** — strong proposed constructs not already present in the
|
||||
article's `keywords` list, surfaced as an advisory "consider adding".
|
||||
|
||||
**Prose mining** matters for the ~17% of articles that ship no `.al` samples at all
|
||||
(including most suppressor articles): their constructs are recovered from the prose
|
||||
and marked `proseOnly` so a reviewer knows the weaker provenance. Use `-NoProse` to
|
||||
restrict the source to samples only.
|
||||
|
||||
It is **deterministic, offline, and open**: no feedback/telemetry data, so the
|
||||
community can run it against `community/` and `custom/` layers too.
|
||||
|
|
@ -45,15 +65,18 @@ tools/Suggest-ArticleSignals.ps1
|
|||
tools/Suggest-ArticleSignals.ps1 -Path knowledge/style
|
||||
tools/Suggest-ArticleSignals.ps1 -Path avoid-commit-inside-loops
|
||||
|
||||
# Only the high-value cases (zero-signal domains + mismatch flags)
|
||||
# Only the high-value cases (zero-signal domains, suppressors, mismatch/applicability)
|
||||
tools/Suggest-ArticleSignals.ps1 -OnlyGaps
|
||||
|
||||
# Samples-only (ignore article prose)
|
||||
tools/Suggest-ArticleSignals.ps1 -NoProse
|
||||
|
||||
# Machine-readable (for a future automated PR advisory to consume)
|
||||
tools/Suggest-ArticleSignals.ps1 -AsJson
|
||||
```
|
||||
|
||||
Key parameters: `-Top <n>` (max signals per article, default 3), `-BCQualityRoot`,
|
||||
`-SeedPath`.
|
||||
Key parameters: `-Top <n>` (max signals per article, default 3), `-NoProse`,
|
||||
`-BCQualityRoot`, `-SeedPath`.
|
||||
|
||||
## Guardrails (why it only suggests)
|
||||
|
||||
|
|
@ -61,7 +84,8 @@ Key parameters: `-Top <n>` (max signals per article, default 3), `-BCQualityRoot
|
|||
would inject the same noise we're trying to remove and would bypass CODEOWNERS
|
||||
review. So the tool emits a proposal an author eyeballs and adds via a normal PR;
|
||||
[`validate_frontmatter.py` R24](../.github/scripts/validate_frontmatter.py) + CI +
|
||||
human review remain the gate. Proposed bare-token blocks satisfy R24 as-is.
|
||||
human review remain the gate. Both proposed bare-token (raise) and mapping-form
|
||||
(`effect: suppress`) blocks satisfy R24 as-is.
|
||||
|
||||
## Relationship to the feedback-driven engine (later, Tier-2)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue