Skip to content

auto-api-docs-writer: Opus 4.7 single-agent + branch-safety hardening, configurable base/dest#155

Merged
mattleibow merged 21 commits into
mainfrom
dev/p1b-direct-xml-writer
Jun 30, 2026
Merged

auto-api-docs-writer: Opus 4.7 single-agent + branch-safety hardening, configurable base/dest#155
mattleibow merged 21 commits into
mainfrom
dev/p1b-direct-xml-writer

Conversation

@mattleibow

@mattleibow mattleibow commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator

Hardens and simplifies the auto-api-docs-writer agentic (gh-aw) workflow. The workflow now carries only gh-aw wiring; how to write docs lives in the api-docs skill (companion PR mono/SkiaSharp#4242).

Single agent on Opus 4.7

The gh-aw sandbox does not honor per-sub-agent model routing (every call resolved to the run model regardless of the requested per-agent model, confirmed via the api-proxy token-usage.jsonl). The multi-agent fan-out added complexity — and caused a no-PR failure when a terminal "fixer" sub-agent was backgrounded and the turn ended — without any benefit.

  • engine.modelclaude-opus-4.7 (was claude-sonnet-4.6).
  • One agent does add + review + fix + validate + PR. No task sub-agents, no per-role models, no synthesizer.
  • Repointed skill references to the collapsed layout (references/adding.md, references/reviewing.md).
  • Slimmed the workflow body to a thin trigger and trimmed the now-moot anti-termination / no-terminal-background-agent rules.

Branch safety + clone hygiene

  • Host prepares a dedicated throwaway PR branch before the agent runs, so the agent never commits on (and recreate_ref never clobbers) the dispatch ref; the prompt commits on the host-prepared branch (no hardcoded head name).
  • Clones SkiaSharp with --no-recurse-submodules + rm -rf + a file-count assertion and echoes the resolved HEAD; eliminates the docs-tree symlink duplication (workspace == linked) so the lint scans each file once; quiets git in the agent run.

Configurable refs

  • skiasharp_branch (where the skill lives), docs_base_branch (default main), and docs_head_branch (default automation/write-api-docs) workflow_dispatch inputs.
  • The primary checkout and stub regeneration both pin to docs_base_branch (via FETCH_HEAD, so arbitrary/shallow branches work) and the PR targets it — keeping base, working tree, and stubs in agreement instead of reviewing the wrong base when dispatched on a feature branch.

Generated-file hygiene

  • The commit step unstages generated files (index.xml, ns-*.xml, _filter.xml, FrameworksIndex/) that stub regeneration rewrites, keeping them out of the PR.

Validated on CI: two consecutive runs produced clean PRs (#168, #169) — dedup held, host gate 0 errors, the agent ran format-first / source-first / three reviewers / no build, and MS Learn OpenPublishing reported Errors:0.

Rewrite the daily writer to match the upgraded api-docs skill, which edits the
mdoc XML directly instead of the extract→write→merge JSON round-trip.

Host steps:
- Drop the "Extract placeholders and manifest" and "Upload extracted JSON" steps
  from regenerate-stubs, the "Download pre-extracted JSON" / "Save original JSON"
  pre-agent steps, and the "Save final JSON" post-step. None are needed without
  the JSON layer.
- Add a non-fatal "Bootstrap SkiaSharp binding for snippet checks" pre-agent step
  (externals-download + dotnet build binding/SkiaSharp) so the example reviewer
  can compile-check snippets against a real SkiaSharp.dll.
- Keep the SkiaSharpAPI symlink (for the host docs-format-docs post-step) and the
  formatting post-step.

Agent prompt (runtime-imported body):
- Replace the JSON phases with the skill's direct-XML add pipeline:
  resolve-scope new -> writer edits XML -> lint + 3 reviewers + synthesizer ->
  fix CRITICAL -> structural validate -> commit + PR.
- Route each sub-agent through the task tool's per-role model (writer/factual/
  examples = opus, quality/synthesizer = sonnet), with an engine.model fallback
  if the sandbox does not honor per-sub-agent models.
- Export DOCS_GIT_ROOT/DOCS_DIR on docs-tool.ps1 calls so scope/validate use the
  docs repo (primary checkout) for git baselines while source lookups still use
  the SkiaSharp clone.

Recompiled the .lock.yml via `gh aw compile`.

Note: depends on the matching api-docs skill update in mono/SkiaSharp (the cloned
skiasharp_branch must carry the new skill + docs-tool.ps1 DOCS_GIT_ROOT support).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit b9ed9e6:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

The api-docs eval per-role bake-off picked gpt-5.5 for reviewer-factual (only
candidate that caught the seeded byte-order contradiction; best mean recall +
precision). Align the workflow's per-role routing note with the skill's updated
review.md table and reviewer-factual Model: header. Body-only change
(runtime-imported), so the compiled .lock.yml is unaffected.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 617b8a3:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

…put)

Sibling of auto-api-docs-writer that runs the api-docs skill's REVIEW
pipeline on a scope (default group:text) instead of filling placeholders.
Doubles as the first CI exercise of per-sub-agent model routing: the
orchestrator launches each reviewer/writer sub-agent via the task tool
with an explicit model (factual -> gpt-5.5 per the eval bake-off) and
prints a Routing report so the run is auditable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit d28641a:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-reviewer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-reviewer.md ✅Succeeded
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

…g report)

Make the daily writer the common path: after the add pass (fill
placeholders) it now also runs a REVIEW pass over a baked scope of
existing docs (review-scope.txt, default group:text) — lint + 3 reviewers
+ synthesizer + fix CRITICAL/obsolete via per-role task models — then one
validate + PR covers both passes.

Because the writer is already registered on the docs default branch, this
is dispatchable on a feature branch (skiasharp_branch input) WITHOUT
landing a new workflow on main; the review scope is baked (not a dispatch
input) so input validation against the default branch still passes.

Adds a mandatory Routing report so the run doubles as the first CI
exercise of per-sub-agent model routing. Removes the now-redundant
standalone auto-api-docs-reviewer workflow.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit e535c65:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

…tself

The first CI pilot run completed green but produced NO PR. Root cause: the
orchestrator delegated the terminal fix step to a background "fixer" sub-agent,
then ended its turn before that agent (and the PR) completed -- exactly the
session-killing pattern the older workflow had guardrails against. Separately,
per-sub-agent model routing turned out to be cosmetic in the gh-aw sandbox: the
api-proxy token-usage log showed every call was claude-sonnet-4.6 regardless of
the requested per-role model.

Fixes:
- Pin the run model: explicit engine.model claude-sonnet-4.6 (drops the
  GH_AW_MODEL_AGENT_COPILOT override; orchestrator + every sub-agent run on it).
- Drop cosmetic per-role routing and the routing-report requirement; document
  per-role routing as a local-only skill feature.
- Terminal fixes are now the orchestrator's own FOREGROUND work (A4/R4); the
  only sub-agents launched are the pass-A writer and the reviewers. No terminal
  background agent. Synthesis is the orchestrator's job (no synthesizer agent).
- Restore the tight escape hatch: once reviewers report, timebox fixing to
  ~10 min, then validate + open the PR.
- Add an explicit "No terminal background agent" Critical rule and simplify the
  completion gate (create_pull_request/noop is the orchestrator's own job).

Recompiled auto-api-docs-writer.lock.yml.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 3be9831:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

@github-actions github-actions Bot closed this Jun 25, 2026
@github-actions github-actions Bot deleted the dev/p1b-direct-xml-writer branch June 25, 2026 22:35
mattleibow and others added 3 commits June 26, 2026 00:42
Validation run 28203165066 produced a real PR (the orchestration fix worked),
but the agent rationalized out of step C: it saw it was already on the dispatch
ref (a feature branch ahead of main), decided to "commit here and create the PR
from this branch," and skipped `git checkout -b automation/write-api-docs`.
Because safe-outputs preserves the committed branch and force-resets it
(recreate_ref:true), this force-overwrote the workflow's own source branch.

Fix: make step C unconditional — `git checkout -B automation/write-api-docs`
before committing, even when already on a feature branch ahead of main, staging
only SkiaSharpAPI/. Add a matching Critical rule explaining that committing on
the dispatch ref destroys it under recreate_ref.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… runs

Root cause of the run-156 branch clobber: gh-aw's checkout step makes the
DISPATCH REF the agent's working branch (git checkout -B <dispatch-ref>). When
dispatched from a feature branch, the agent starts on that branch; it then
committed its doc work there instead of switching to automation/write-api-docs,
and safe-outputs (preserve_branch_name + recreate_ref) adopted that branch name
as the PR head and force-recreated it — erasing the workflow source commits.

Relying on the agent to switch branches is fragile (it rationalized staying put
because the branch was "already ahead by 1 commit"). Add a host pre-agent step
that renames the working branch to automation/write-api-docs before the agent
starts, so every commit and the PR head land on a throwaway branch regardless of
which ref triggered the run. The prompt rule remains as defense-in-depth.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Parameterize the docs PR base (docs_base_branch) and PR head (docs_head_branch)
as workflow_dispatch inputs so the writer can be tested against an older docs
state where many 'To be added.' placeholders still exist.

- base-branch -> ${{ inputs.docs_base_branch || 'main' }}; gh-aw propagates it
  to the safeoutputs config.json, the safe_outputs checkout ref, and the handler
  env (all interpolation-safe).
- regenerate-stubs aligns the docs submodule to docs_base_branch (was hardcoded main).
- host PR-branch step checks out docs_head_branch (was hardcoded automation/write-api-docs).
- prompt no longer hardcodes the PR branch name: commit on the host-prepared current
  branch, never the dispatch ref.

Backward compatible: schedule/push runs default base=main, head=automation/write-api-docs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mattleibow mattleibow reopened this Jun 26, 2026
@mattleibow mattleibow changed the title auto-api-docs-writer: direct-XML pipeline with per-role models auto-api-docs-writer: orchestration + branch-safety hardening, configurable base/dest Jun 26, 2026
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 3be9831:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit e30f07b:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

A shallow submodule clone has no origin/<branch> remote-tracking ref for an
arbitrary docs_base_branch, so 'git checkout -B stub-base origin/<branch>' fails
(it only worked for main, which is tracked). Use FETCH_HEAD, set by the preceding
fetch, which resolves for any branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit cdae111:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

- review_scope workflow_dispatch input (default group:text) drives the review
  pass scope, so other doc groups can be reviewed one at a time.
- Commit step now unstages generated files (index.xml, ns-*.xml, _filter.xml,
  FrameworksIndex/) that stub regeneration rewrites, keeping them out of the PR.
  Exposed by the add-at-scale run against an old base where the regenerated
  generated files diverged from the base.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The skill dropped the selector grammar (type:/ns:/match:); docs-tool.ps1 now
only lists all/new/changed/file:PATH and the model maps a plain-English theme
to files itself. Update Pass R to branch on inventory-mode-vs-theme, drop the
obsolete -Confirm:$false fuzzy flag, and refresh the input/comment wording.
Recompiled the lock.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 5fe96e2:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

State the procedure positively: a plain-English theme is resolved by listing
all and selecting the fitting files; edits touch only <Docs>. Recompiled lock.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

The skill deleted references/scope-resolution.md; remove the file-list bullet
and the Pass R parenthetical that pointed at it, plus one more 'no JSON step'
negative. Recompiled the lock.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit e164f7f:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 0ae2d3f:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

The deterministic docs gates (resolve-scope / lint / validate) moved out of the
skill's PowerShell script (docs-tool.ps1) into Cake targets in the SkiaSharp
clone: docs-resolve-scope, docs-lint, docs-validate. Update Pass A/R/V and the
scope-environment note to invoke `dotnet cake --target=docs-* --scope=...`.

The DOCS_GIT_ROOT/DOCS_DIR env overrides are unchanged — the Cake targets read
the same vars, so the inverted-checkout sandbox keeps working (docs as primary
checkout, SkiaSharp clone for binding/ source lookups). The compiled .lock.yml
is unchanged: the body is imported at runtime and no frontmatter changed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit e10f6fa:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

The api-docs cake tooling folded its three QA tasks
(docs-resolve-scope / docs-lint / docs-validate) into the existing
docs-format-docs target, which now formats every doc and runs the
deterministic checks in one pass (warnings for missing/quality issues,
build-failing errors for broken XML/CDATA). The DOCS_GIT_ROOT/DOCS_DIR
env overrides are gone too.

Update the agent prompt to match:
- Drop the "Scope environment" env-injection section; the docs are the
  primary checkout at the workspace root and skiasharp/docs/SkiaSharpAPI
  is symlinked to them, so the post-step docs-format-docs gate sees the
  edits with no override.
- Discover files with plain git/find instead of docs-resolve-scope
  (placeholders via `git status` + `grep 'To be added.'`; review scope
  via `git status`/`find`/theme selection).
- Replace the docs-lint step with an optional docs-format-docs run for
  the deterministic findings.
- Replace the docs-validate step (V): the post-step docs-format-docs is
  now the gate and fails the run on malformed-xml/broken-cdata, so the
  agent no longer runs a validate target.
- Refresh the Critical rules accordingly (post-step gate, no structural
  validator, signatures owned by mdoc).

Body-only change; the compiled .lock.yml imports the prompt at runtime
and its only cake call (the docs-format-docs post-step) is unchanged, so
no recompile is needed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 1c78080:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

docs-format-docs no longer emits a malformed-xml finding — a file that will not
parse now throws from XDocument.Load, and broken-cdata remains the only
build-failing lint class. Update the validation-gate prose to match.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 58511f5:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

…puts

The workflow restated the skill's whole procedure, ran a broken/hidden
SkiaSharp build that produced no DLL, and never self-gated. Make the skill
the single source of truth and carry only gh-aw-specific wiring here:

- Pin the agent-job checkout to docs_base_branch (was the dispatch ref) so the
  working tree, regenerated stubs, and PR base all agree; dispatching on a
  feature branch no longer reviews the wrong base.
- Remove the review_scope input and Record review scope step: the work set is
  self-selecting (format findings + new placeholders + files changed vs base).
- Remove the continue-on-error Bootstrap build (externals-download + dotnet
  build): docs are XML and need no build; it silently produced no DLL.
- Rewrite the body as a thin trigger that defers to the api-docs skill and
  encodes the loop: run docs-format-docs to collect the to-do list, do the work
  (fill placeholders + the three reviewers from references/reviewing.md), then
  run docs-format-docs again to validate before the PR.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 76b8543:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

Two model reviews (GPT-5.5, Opus 4.7) of run 28411250198 found the agent burned
~5-10 tool calls + 3 extra format passes diagnosing a duplicated docs tree, and
hit a stray interactive git pager. Both pre-emptable in the host wiring:

- Clone SkiaSharp with --no-recurse-submodules. The docs format/lint pass only
  reads in-tree files, so submodules are dead weight; worse, --recurse-submodules
  checked the docs submodule out as a real dir at skiasharp/docs/SkiaSharpAPI,
  which the ln -sfn could not replace, nesting a second copy. The format glob
  (skiasharp/docs/**/*.xml) then walked both and double-counted (~404 -> ~812).
- rm -rf the docs dir before symlinking, and assert the linked view has exactly
  the same XML count as the workspace (fail fast on duplication).
- Disable the git pager / detached-HEAD advice and echo the SkiaSharp HEAD SHA.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 2f8b342:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

The deterministic obsolete-in-example linter check was removed (obsolete usage is
now a reviewer judgement guided by obsolete-api-map.md). Update the run procedure so
it no longer lists obsolete-in-example as a collectable finding, and point the Fix
step at reviewer B instead.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

PoliCheck Scan Report

The following report lists PoliCheck issues in PR files. Before you merge the PR, you must fix all severity-1 and severity-2 issues. The AI Review Details column lists suggestions for either removing or replacing the terms. If you find a false positive result, mention it in a PR comment and include this text: #policheck-false-positive. This feedback helps reduce false positives in future scans.

✅ No issues found

More information about PoliCheck

Information: PoliCheck | Severity Guidance | Term
For any questions: Try searching the learn.microsoft.com contributor guides or post your question in the Learn support channel.

@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 13701a4:

✅ Validation status: passed

File Status Preview URL Details
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded
.github/workflows/auto-api-docs-writer.md ✅Succeeded

For more details, please refer to the build report.

mattleibow added a commit to mono/SkiaSharp that referenced this pull request Jun 30, 2026
…ing (#4242)

Rework the api-docs skill: router layout, direct-XML edits, Cake tooling (#4242)

Context: companion CI workflow is mono/SkiaSharp-API-docs#155

Restructures the `api-docs` skill into a single dual-purpose tool that both adds
docs for new APIs and reviews/corrects existing docs, and moves its tooling off a
standalone PowerShell script onto a Cake target so the same checks run locally and
in CI.

~~ Skill layout ~~
SKILL.md becomes a thin router (~410 lines removed) that points at focused
references/ files (adding.md, reviewing.md, validation.md, patterns.md,
skia-patterns.md, checklist.md, obsolete-api-map.md). The previous multi-agent
orchestration (writer + three reviewers + synthesizer, each with its own Model:
header) is folded into one single-pass procedure: the gh-aw CI sandbox does not
honor per-sub-agent model routing, so the fan-out was dead weight. The prompt and
methodology content is preserved, not dropped — it now lives in references/.

~~ Direct-XML editing ~~
Drops the old extract -> write -> merge JSON round-trip (scaffolding for a weaker
model). A capable model edits the mdoc XML in place; safety comes from the
post-edit formatter/validator rather than from regenerating files.

~~ One Cake pass instead of PowerShell ~~
Removes scripts/docs-tool.ps1 (-452 lines) and folds format + content checks into a
single `docs-format-docs` target in scripts/infra/docs/docs.cake (+213). It loads
each type XML once (XDocument), formats it, and runs deterministic checks in the
same pass: warnings for missing/placeholder/quality issues, build-failing errors
only for broken XML/CDATA. build.cake wires the target in.

~~ Obsolete handling ~~
Makes references/obsolete-api-map.md the unambiguous, overload-aware authority and
removes the name-only obsolete-in-example linter. Name matching could not tell an
obsolete overload from a modern one (DrawText/MeasureText exist on both the
deprecated SKPaint forms and the modern SKFont/SKCanvas(..,SKFont,..) forms), so it
produced false positives and a skill that contradicted its own reference. Obsolete
judgement is now the reviewer's, guided by the map (the deprecated overload is the
one without an SKFont parameter).

Validated by two CI runs of the companion workflow (PRs #168 and #169): consistent
across both — 8 placeholders filled source-first, 23 lint findings fixed, 0 final
findings, no obsolete usage introduced, no valid modern SKFont/SKCanvas overloads
deleted, and MS Learn OpenPublishing Errors:0.

Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mattleibow mattleibow merged commit 60e95d4 into main Jun 30, 2026
10 checks passed
mattleibow added a commit that referenced this pull request Jun 30, 2026
Go Live: publish latest API docs (#171)

Publish the accumulated SkiaSharp / HarfBuzzSharp API documentation from main
to the live (published) branch. This is the first Go Live since #66 and rolls up
a large batch of docs automation, a full regeneration, and content/cross-reference
cleanup.

Highlights in this batch:

- Docs automation: automated API docs writer (#92, hardened in #155), daily
  update workflow, go-live workflow (#65), and a Learn Build status-based
  auto-merge gate (#82, #83) backed by check-learn-build.py and a
  .github/known-warnings.csv baseline.
- Regeneration: frameworks docs switched to latest-only monikers (#141), baseline
  reset to the Windows-generated output (#142), and stub regeneration moved to
  Linux via Mono (#147). This drops older, no-longer-shipping member/type pages
  (e.g. pre-v1.68 view APIs, the removed Android ISKRenderer interface, and the
  SKPaint text properties that moved to SKFont).
- Content: filled API documentation placeholders (#150, #151, #172) and fixed
  broken cross-references (#152).
- Cross-reference cleanup (#173): removed/repointed 36 obsolete xref-not-found
  references left behind by the latest-only-moniker regeneration — dangling links
  in 2019-era remarks to members that were since removed or relocated. Without
  this the Go Live build reported 160 warnings and the auto-merge gate (correctly)
  blocked the publish.

Build health at publish: 0 errors, 124 warnings, 0 suggestions. All 124 remaining
warnings are expected xref-not-found references to external framework types
(OpenTK, Gdk/Cairo/Graphene, ElmSharp/Tizen.NUI, Windows.UI.Xaml, Microsoft.UI.Xaml,
SharpVk, Vortice) that Learn cannot resolve and which are tracked in the
known-warnings.csv baseline — 0 new warnings versus baseline, so the gate passes.

Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant