Skip to content

Go Live: publish latest API docs#171

Merged
mattleibow merged 32 commits into
livefrom
main
Jun 30, 2026
Merged

Go Live: publish latest API docs#171
mattleibow merged 32 commits into
livefrom
main

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Merge main into live to publish the latest API documentation.

mattleibow and others added 28 commits February 27, 2026 11:58
Full workflow that checks out mono/SkiaSharp at a configurable branch,
installs GTK# 2 MSI, and runs Cake doc generation targets. Supports a
skiasharp-branch parameter to generate docs from any SkiaSharp branch.

Schedule: daily at 6 AM UTC, plus manual workflow_dispatch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Manual workflow_dispatch that creates a PR from main to live.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Stub regeneration is now handled by the auto-api-docs-writer agentic
workflow in mono/SkiaSharp, which runs on Windows and also fills in
'To be added.' placeholders with AI-generated documentation.

See: mono/SkiaSharp#3918

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add auto-merge workflow for docs PRs based on Learn Build statuses

Validates automation/write-api-docs PRs by checking GitHub commit
statuses (OpenPublishing.Build + PoliCheck Scan) and comparing build
warnings against a known baseline. Merges when clean, comments when
blocked.

Starts in dry-run mode (DRY_RUN: true) — flip to false to go live.

Security hardened: baseline read from main (not PR branch),
merge pinned to validated SHA, required statuses enforced,
fail-closed on schema changes, URL allowlist, no shell interpolation
of event data.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Filter status events to state=='success' in the job condition.
Eliminates runs for pending/error/failure states. The workflow
now only comments/merges once ALL required statuses are green.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add 20 new expected xref-not-found warnings introduced by the
documentation fill PR:
- GTKExtensions.xml: +6 Gdk.RGBA, +1 Gdk.Rectangle, +3 Graphene.Point,
  +3 Graphene.Point3D, +3 Graphene.Rect, +3 Graphene.Size
- SKPathBuilder.xml: +1 SkiaSharp.SKPathBuilder.Dispose (new file)

Baseline: 63 → 64 unique rows, 120 → 140 total.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Triggering on both OpenPublishing.Build and PoliCheck Scan causes
duplicate comments — both fire at roughly the same time and both
find all required statuses green.

Fix: trigger only on OpenPublishing.Build (which carries the build
report URL we need). PoliCheck is still verified as a required
status inside the script — it just doesn't trigger a separate run.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The failure comment now shows specific context:
- Validation failures: shows the check reason and warnings detail
- Merge failures: shows the gh error (e.g. 'not up to date')
- Both can appear together since they're not mutually exclusive

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Auto-merged after Learn Build validation passed (all checks green, no new warnings).
Auto-merged after Learn Build validation passed (all checks green, no new warnings).
The squash merge subject was hardcoded without the PR number,
making it hard to trace commits back to their source PR in
git log.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Auto-merged after Learn Build validation passed (all checks green, no new warnings).
Add automated API docs writer workflow (#92)

Context: mono/SkiaSharp#4024
Context: mono/SkiaSharp#4025

Introduces a gh-aw agentic workflow that fills "To be added."
placeholders in the XML API documentation. The workflow lives in this
repo (not SkiaSharp) so `create-pull-request` safe output works with
the default GITHUB_TOKEN — no custom PATs needed.

Pipeline:

  1. regenerate-stubs (Windows) — runs mdoc against latest CI NuGets
  2. pre-agent — extracts placeholder JSON + manifest via docs-tool.ps1
  3. agent — 1 writer fills ~800 fields, 3 reviewers validate in
     parallel (factual, quality, code-refs), orchestrator fixes issues
  4. post-step — formats XML with `dotnet cake --target=docs-format-docs`
  5. safe-outputs — opens PR against main

Architecture chosen after A/B testing 10 runs across 4 configurations.
The 1-writer + 3-reviewer setup matches 2-writer wall-clock time (~20
min) while using 40% fewer tokens (~9M ET vs ~12M ET). Reviewers
maintain 0 false positives and catch 3–11 real issues per batch.

The workflow accepts a `skiasharp_branch` input parameter on manual
dispatch for testing against feature branches before they merge.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
Prevents intermediate work files (e.g. output/docs-work/*.json) from
being accidentally committed by automation agents.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…on (#116)

[workflow] Move extraction to gen job and fix agent session termination (#116)

Context: #115
Companion: mono/SkiaSharp#4030

The automated docs writer workflow had two classes of failure:

1. Extraction ran inside the agent container, meaning it was
   non-deterministic and couldn't serve as an immutable baseline for
   auditing what the agent changed.

2. The orchestrator agent launched background sub-agents, printed
   "Waiting for them to complete" in text, and ended its turn with no
   active tool call. The Copilot CLI runtime interpreted this as
   "agent is done" and terminated the session — losing all work. This
   happened in 2 of 5 pre-fix runs (40% failure rate).

Workflow changes:
  * Move placeholder extraction into the `regenerate-stubs` job
    (Windows, mechanical, deterministic)
  * Upload `docs-extracted` artifact (7-day retention) as immutable
    baseline
  * Pre-agent step copies original JSON to
    `/tmp/gh-aw/agent/docs-work-original/`
  * Post-step copies final JSON to `/tmp/gh-aw/agent/docs-work-final/`
  * Both directories upload as part of the agent artifact for diffing

Prompt hardening (session termination fix):
  * Require `read_agent(wait=true)` in the SAME response as agent launch
  * Document multi-agent sequential pattern (read each agent in turn)
  * Explicitly forbid "launch → text → end turn" pattern
  * Add budget fallback: skip Phase 5 if past 10 minutes without merge
  * Add COMPLETION GATE: session cannot end without `create_pull_request`
    or `noop`

Post-fix validation: 3/3 runs succeeded (100%), all producing PRs.

Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Regenerated from the latest build output (SkiaSharp 4.150, HarfBuzzSharp 14.2)
using the cleaned-up docs-format-docs pipeline:

- Collapse from the old multi-version monikers (skiasharp-2.80 ... -4.147) to a
  single latest-only moniker per family (10 monikers total).
- Collapse <AssemblyVersion> history to latest-only.
- Drop docs for types/packages no longer built (Forms/UWP/watchOS views,
  GRBackendRenderTargetDesc, etc.), their ns-*.xml stubs, and stale index.xml
  <Assembly>/<Namespace> entries. Preserve the global ns-.xml stub.
- Manually remove the one stale lingering member mdoc left behind
  (SKMatrix44.MapScalars(float,float,float,float), demoted public->internal).

Net: 487 files, +9,496 / -93,247. Re-running the pipeline on this output is a
no-op (idempotent).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reset frameworks docs baseline to Windows-generated output (#142)

Context: previous baseline #141 (regenerated on macOS)
Depends-on: mono/SkiaSharp#4197
Generated-by: Auto API Docs Writer run 27798680653 (windows-latest)

The prior baseline (#141) was regenerated on macOS, which corrupted the
frameworks docs in two ways and made every later Windows run churn past the
writer's 100-file PR cap:

- A moniker filename collision in docs.cake let the GL-less MacCatalyst
  SkiaSharp.Views.iOS.dll clobber the richer net-iOS build, so mdoc --delete
  removed the real iOS GL types (SKGLView, SKGLLayer,
  SKPaintGLSurfaceEventArgs). Fixed upstream in mono/SkiaSharp#4197.
- The macOS mono mdoc omitted [Nullable]/[NullableContext]/[IsReadOnly]
  attributes that the Windows mdoc.exe emits, and it stripped member
  structure. Each subsequent Windows regen re-added all of it, overflowing
  the create-pull-request file cap and blocking the docs pipeline.

mdoc.exe is .NET Framework, so Windows is the only supported generation
environment. This resets the baseline to the windows-latest CI output
(aligned to current main, built with the #4197 fix) so future
auto-api-docs-writer runs produce small, reviewable diffs.

Changes (93 files):

- Restore the iOS GL API docs dropped by the collision.
- Normalize [Nullable]/[NullableContext]/[IsReadOnly] attributes to the
  Windows output.
- Restore member structure stripped by the macOS regen (e.g. SKPaint grew
  from 1063 to 4388 lines).
- Remove stale SkiaSharp.Views.Blazor.Internal ActionHelper and
  FloatFloatActionHelper docs; both types are guarded by
  #if !NET7_0_OR_GREATER and no longer exist in the shipped net7+ packages.

No authored prose is lost: of 3140 written summary/remarks strings on main,
the only 4 removed belong to the two deleted internal helper types.

HarfBuzzSharp/HBColor.xml and SkiaSharp/SKWebpEncoderOptions.xml are
deliberately left at their main content so the next generation run visibly
re-processes them — proving the writer fills "To be added." placeholders
(HBColor) and that structural regen re-adds attributes while preserving
existing prose (SKWebpEncoderOptions).

Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[CI] Run API-docs stub regeneration on Linux via Mono (#147)

Two related changes to the auto-api-docs-writer workflow: flip the
regenerate-stubs job to Linux, and stop the writer from running on pull
requests.

~~ Move regenerate-stubs from Windows to Linux ~~

This job was the last non-Linux job across the SkiaSharp + SkiaSharp-API-docs
doc pipeline; with it flipped, the entire two-repo pipeline runs on Linux,
matching the local Docker image and the SkiaSharp-side CI.

The job only used Windows because mdoc.exe is a .NET Framework tool, but that
requirement no longer holds:

  * mdoc.exe runs fine under Mono, and SkiaSharp's docs.cake already invokes it
    via `mono`.
  * The managed GTK# reference assemblies mdoc needs come from NuGet via the
    cake comparer (passed as --lib paths), so no system GTK# install is
    required — the Windows GTK# 2 MSI download/install was redundant.

So Mono (mono-complete via apt) is the only added dependency. The job now calls
the shared scripts/infra/docs/generate-api-docs.sh entry point instead of
`dotnet cake --target=update-docs`, uses global.json for the SDK and Linux-style
nuget cache paths, and drops the now-redundant `dotnet tool restore` and
docs-download-output steps.

Proven locally end-to-end on Linux (Docker, dotnet10 + mono-complete) against
this repo's stub tree: it correctly pruned the orphaned net6-only type files
(ActionHelper, FloatFloatActionHelper) and added the newer [Nullable]
attributes, and two consecutive runs produced byte-identical output
(hash ec15190a) — so the job is both correct and idempotent on Linux.

Prerequisite: the companion mono/SkiaSharp#4200, which adds
scripts/infra/docs/generate-api-docs.sh, has merged to main, so the checked-out
SkiaSharp tree now has the script.

~~ Drop the pull_request trigger ~~

The writer is a full agentic workflow: it regenerates stubs, fills placeholders
with AI, and opens a PR via gh-aw safe-outputs. When a PR edits this workflow,
the writer fires on that PR and then fails, because safe-outputs refuses to
create a PR that touches protected workflow files
(protect_top_level_dot_folders: true) — surfacing as a red safe_outputs check on
this very PR. Removing the pull_request trigger stops the writer running on PRs;
push:[main] still validates workflow edits after they land, and
workflow_dispatch + schedule are unaffected.

Recompiled .lock.yml via `gh aw compile` for both commits.

Supersedes #144, which gh-aw's recreate_ref:true auto-closed when a run was
dispatched on its branch; moved to the dedicated ci/linux-mdoc-regenerate-stubs
branch so the agentic placeholder-fill PRs reusing dev/linux-mdoc-regenerate-stubs
(e.g. #145) can't collide with it.

Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: fill placeholder documentation for SkiaSharp and HarfBuzzSharp APIs

Fill all 'To be added.' placeholder fields across 33 XML documentation files
covering 1021 fields.

Types documented:
- HarfBuzzSharp: Face (variation/palette/color APIs), Font (variation coords),
  HBColor (BGRA struct, operators, conversions)
- SkiaSharp: GRContext (Flush overloads), GRVkYcbcrComponents,
  GRVkYcbcrConversionInfo, GrVkYcbcrConversionInfo (deprecated),
  SKCanvas (DrawBitmap/DrawSurface/DrawText overloads), SKColorType (new values),
  SKColorspace{Primaries,TransferFn}Cicp (CICP enums), SKDocument (CreateXps),
  SKDocumentXpsOptions, SKFontArguments (ref struct), SKFontPaletteOverride,
  SKFontVariationAxis, SKFontVariationPositionCoordinate, SKFourByteTag,
  SKMaskFilter (CreateShader), SKPaint (GetFillPath builder overloads),
  SKPath (Handle), SKPathBuilder (full API, 51 members), SKPathMeasure,
  SKStream (GetData), SKSurface (Draw), SKTypeface (Clone/variation APIs),
  SKWebpEncoder (Encode/EncodeAnimated), SKWebpEncoderFrame
- SkiaSharp.HarfBuzz: ColorExtensions (color conversion methods)
- SkiaSharp.Views.*: SKGLControl constructors, GTKExtensions, SKDrawingArea,
  _Imports, SKGLSurfaceViewRenderer

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

* Format and clean up documentation XML files

Remove obsolete API members and apply formatting cleanup
to documentation XML files.

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

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* [docs] Fix broken API doc cross-references

Correct 16 dangling <see>/<value> cross-references that the AED
documentation-fill PRs (#150, #151) left pointing at removed, renamed, or
mistyped SkiaSharp members. Removes the resulting docfx xref-not-found
warnings. ECMA-XML prose only; no mdoc regeneration.

- SKColorTable.MaxLength -> SKColorFilter.TableMaxLength (type removed)
- SKCodec.Origin -> SKCodec.EncodedOrigin (renamed)
- SKSurfaceProps -> SKSurfaceProperties (renamed)
- GrVkYcbcrConversionInfo -> GRVkYcbcrConversionInfo (casing)
- SKPathVerb.Close: E: -> F: (enum field, wrong prefix)
- SKFontStyleWeight/Width: F: -> T: (type, wrong prefix)
- *.Empty (SKMatrix, SKPoint, SKColorSpaceXyz, SKColorSpaceTransferFn): P: -> F:
- SKMatrix44 Create* remarks: drop references to removed Set* instance methods

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

* [docs] Repoint removed 3-arg SKPath.Iterator.Next cref to 1-arg overload

Learn build validation on the docs flagged
M:SkiaSharp.SKPath.Iterator.Next(SkiaSharp.SKPoint[],System.Boolean,System.Boolean)
as xref-not-found. The 3-arg overload was removed upstream; SKPath.Iterator now
exposes only Next(SKPoint[]) and Next(Span<SKPoint>) (verified against
binding/SkiaSharp/SKPath.cs and the SKPath+Iterator.xml member list).

Repoint all 10 occurrences (3 in SKPath+Iterator.xml, 7 in SKPathVerb.xml) to
M:SkiaSharp.SKPath.Iterator.Next(SkiaSharp.SKPoint[]). Sibling
RawIterator.Next(SKPoint[]) crefs are valid and left unchanged.

This was missed initially because the xref scan matched on type+method name and
ignored the overload signature; the scan now requires exact full-DocId matches,
and a strict whole-repo re-audit confirms zero remaining internal dangling crefs.

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

* [docs] Fix hidden broken GRVkFilter cref masked by case-insensitive FS

The ChromaFilter property doc in the legacy GrVkYcbcrConversionInfo struct
referenced a type that does not exist — `<see cref="T:SkiaSharp.GRVkFilter"/>`.
ChromaFilter is a plain `uint` holding a raw Vulkan `VkFilter` value; there is
no GRVkFilter type in the docs corpus or the SkiaSharp API, so docfx emits an
xref-not-found warning. The modern GRVkYcbcrConversionInfo struct already
documents the same field correctly as a raw `<c>VkFilter</c>` value; mirror it.

This dangling cref was missed by the prior xref sweep because the repo contains
a case-collision pair — GRVkYcbcrConversionInfo.xml (modern) and
GrVkYcbcrConversionInfo.xml (legacy) differ only by case. On a case-insensitive
filesystem only one of the two physically checks out, so a working-tree glob
silently drops the shadowed legacy file. Staged via git plumbing so the fix
lands on the legacy blob without materializing both colliding paths on disk.

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

* [docs] Drop obsolete GrVkYcbcrConversionInfo page to fix case-collision

The legacy [Obsolete("Use GRVkYcbcrConversionInfo instead.")] forwarder struct
GrVkYcbcrConversionInfo (lowercase-r) and the modern GRVkYcbcrConversionInfo
(uppercase-R) differ only by one letter's case. mdoc documents both
soft-obsolete types, producing two ECMA-XML files whose names collide on a
case-insensitive filesystem (the Learn / OpenPublishing build). One file
shadows the other, so crefs to the shadowed type fail with
"Cross reference not found: 'SkiaSharp.GRVkYcbcrConversionInfo'".

PR #152 repointed GRVkImageInfo.xml from the wrong lowercase casing to the real
uppercase type; that correct fix exposed this latent collision (the GR page is
the one shadowed). Rather than revert the casing, remove the collision at its
source: stop publishing the obsolete forwarder's page. The legacy type only
forwards to the modern one via two implicit conversion operators.

- Delete SkiaSharpAPI/SkiaSharp/GrVkYcbcrConversionInfo.xml
  (T:SkiaSharp.GrVkYcbcrConversionInfo) via the index, leaving the modern
  GRVkYcbcrConversionInfo.xml blob untouched.
- Remove its <Type> block from SkiaSharpAPI/FrameworksIndex/skiasharp.xml.
- Remove its entry from SkiaSharpAPI/index.xml.

No surviving file references T:SkiaSharp.GrVkYcbcrConversionInfo; the modern
GRVkYcbcrConversionInfo page is kept and now resolves cleanly. A companion
generator-side exclusion is being added in mono/SkiaSharp
scripts/infra/docs/docs.cake so mdoc won't regenerate the page.

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

* Re-trigger OpenPublishing build

The previous build failed on a transient infrastructure error
(restore-template-repository-failed: could not clone
Microsoft/templates.docs.msft#main); all changed files validated
Succeeded with zero cross-reference errors. Empty commit to re-run.

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

---------

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 290d0ae:

❌ Validation status: errors

Please follow instructions here which may help to resolve issue.

File Status Preview URL Details
❌Error Details

  • [Error: CannotMergeCommit] Cannot merge commit 290d0ae1d062f0d987b5d6b49d794f0b7bfbbbca in branch main of repository https://github.com/mono/SkiaSharp-API-docs into branch live (commit cde9303afb22d8e3a4b6a41b295096bc77da3f6b). Please follow this documentation: https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/ to use git.exe to resolve you content conflicts locally and then push to remote.

For more details, please refer to the build report.

Note: Your PR may contain errors or warnings or suggestions unrelated to the files you changed. This happens when external dependencies like GitHub alias, Microsoft alias, cross repo links are updated. Please use these instructions to resolve them.

…, thin trigger (#155)

Harden auto-api-docs-writer: single Opus 4.7 agent, branch-safe clone, thin trigger (#155)

Context: runs the api-docs skill from mono/SkiaSharp#4242 (skill is the source of truth)

Hardens and simplifies the `auto-api-docs-writer` agentic (gh-aw) workflow so it
reliably formats, fills, reviews, and opens a PR for API docs without clobbering
branches or duplicating the docs tree. The workflow now carries only gh-aw wiring;
the how-to-write-docs procedure lives in the skill.

~~ Single agent on Opus 4.7 ~~
engine.model -> claude-opus-4.7, and one agent does add + review + fix + validate +
PR. The gh-aw sandbox does not honor per-sub-agent model routing (the task tool's
model param is not plumbed to the API call — verified via the api-proxy
token-usage log), so the multi-agent fan-out only added complexity and a no-PR
failure mode when a terminal "fixer" sub-agent was backgrounded at end of turn.

~~ Branch safety and clone hygiene ~~
The 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
SkiaSharp clone uses --no-recurse-submodules + rm -rf + a file-count assertion and
echoes the resolved HEAD, and the docs-tree symlink duplication is eliminated
(workspace == linked) so the lint scans each file once. Git is quieted in the
agent run.

~~ Configurable refs ~~
Adds workflow_dispatch inputs skiasharp_branch (where the skill lives),
docs_base_branch (default main), and docs_head_branch (default
automation/write-api-docs). 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.

~~ Cleanup ~~
Slims the workflow to a thin trigger, removes the stale review_scope input and the
obsolete-in-example prompt line that the skill no longer collects, points skill
references at the collapsed layout, and unstages generated files (index.xml,
ns-*.xml, _filter.xml, FrameworksIndex/) that stub regeneration rewrites so they
stay out of the PR.

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

Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
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 60e95d4:

❌ Validation status: errors

Please follow instructions here which may help to resolve issue.

File Status Preview URL Details
❌Error Details

  • [Error: CannotMergeCommit] Cannot merge commit 60e95d470179d435867d786bef4d5118c6b75c05 in branch main of repository https://github.com/mono/SkiaSharp-API-docs into branch live (commit cde9303afb22d8e3a4b6a41b295096bc77da3f6b). Please follow this documentation: https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/ to use git.exe to resolve you content conflicts locally and then push to remote.

For more details, please refer to the build report.

Note: Your PR may contain errors or warnings or suggestions unrelated to the files you changed. This happens when external dependencies like GitHub alias, Microsoft alias, cross repo links are updated. Please use these instructions to resolve them.

The previous Go Live PR (#66) was squash-merged into `live`, which broke
the shared history between `main` and `live` and caused 188 conflicting
files in PR #171.

This merge commit reconnects the two histories. It merges `live` into
`main` while keeping `main`'s tree verbatim (main is the source of truth
for the generated API docs). No file contents on `main` change; this only
restores the common ancestry so PR #171 (main -> live) becomes a clean
fast-forward and future Go Live merges stop conflicting.

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 5af8ede:

⚠️ Validation status: warnings

File Status Preview URL Details
SkiaSharpAPI/SkiaSharp.Views.Android/SKGLSurfaceView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Android/SKGLTextureView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Desktop/SKGLControl.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Gtk/GTKExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Gtk/SKDrawingArea.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.iOS/SKCanvasLayer.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.iOS/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.iOS/SKGLLayer.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.iOS/SKGLView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Mac/SKCanvasLayer.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Mac/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Mac/SKGLLayer.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Mac/SKGLView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/CustomRenderingView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/SKGLSurfaceView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/CustomRenderingView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/SKGLSurfaceView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/TizenExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.tvOS/SKCanvasLayer.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.tvOS/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.tvOS/SKGLLayer.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.tvOS/SKGLView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/AngleSwapChainPanel.xml ⚠️Warning Details

This comment lists only the first 25 files in the pull request.

SkiaSharpAPI/SkiaSharp.Views.Android/SKGLSurfaceView.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLSurfaceView.ISKRenderer'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLSurfaceView.SetRenderer(SkiaSharp.Views.Android.SKGLSurfaceView.ISKRenderer)'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLSurfaceView.ISKRenderer'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLSurfaceView.SetRenderer(SkiaSharp.Views.Android.SKGLSurfaceView.ISKRenderer)'.

SkiaSharpAPI/SkiaSharp.Views.Android/SKGLTextureView.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLTextureView.ISKRenderer'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLTextureView.SetRenderer(SkiaSharp.Views.Android.SKGLTextureView.ISKRenderer)'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLTextureView.ISKRenderer'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'SkiaSharp.Views.Android.SKGLTextureView.SetRenderer(SkiaSharp.Views.Android.SKGLTextureView.ISKRenderer)'.

SkiaSharpAPI/SkiaSharp.Views.Desktop/SKGLControl.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'OpenTK.GLControl'.

SkiaSharpAPI/SkiaSharp.Views.Gtk/GTKExtensions.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Color'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Color'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.RGBA'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.RGBA'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.RGBA'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point3D'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point3D'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point3D'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Color'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Color'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Size'.

This comment lists only the first 25 errors (including error/warning/suggestion) in the pull request.
For more details, please refer to the build report.

Note: Your PR may contain errors or warnings or suggestions unrelated to the files you changed. This happens when external dependencies like GitHub alias, Microsoft alias, cross repo links are updated. Please use these instructions to resolve them.

…, SKPaint text props) (#173)

Resolve 36 xref-not-found build warnings caused by dangling <xref:> links in
2019-era hand-written remarks that point at members removed/relocated by the
latest-only-monikers regeneration (#141).

- Group 1 (24): remove obsolete pre-v1.68 DrawInSurface [!NOTE] blocks from the
  Apple Mac/iOS/tvOS SKCanvasLayer/SKCanvasView/SKGLLayer/SKGLView views.
- Group 2 (4): drop obsolete ISKRenderer/SetRenderer [!NOTE] blocks from the
  Android SKGLSurfaceView/SKGLTextureView; surrounding prose already documents
  the modern OnPaintSurface/PaintSurface pattern.
- Group 3 (4): repoint SKTypeface remarks from removed SKPaint text properties
  (TextSize/TextSkewX/TextScaleX/FakeBoldText) to their SKFont equivalents
  (Size/SkewX/ScaleX/Embolden) and fix the surrounding sentence.

Unblocks Go Live PR #171.

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

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit 392f495:

⚠️ Validation status: warnings

File Status Preview URL Details
SkiaSharpAPI/SkiaSharp.Views.Desktop/SKGLControl.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Gtk/GTKExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Gtk/SKDrawingArea.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/CustomRenderingView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/SKGLSurfaceView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/CustomRenderingView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/SKGLSurfaceView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/TizenExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/AngleSwapChainPanel.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/SKSwapChainPanel.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/SKXamlCanvas.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/WindowsExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.WPF/SKGLElement.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRSharpVkBackendContext.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRSharpVkGetProcedureAddressDelegate.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRVkExtensionsSharpVkExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRVorticeD3DBackendContext.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRVorticeD3DTextureResourceInfo.xml ⚠️Warning Details
.gitattributes ✅Succeeded
.github/aw/actions-lock.json ✅Succeeded
.github/known-warnings.csv ✅Succeeded
.github/scripts/check-learn-build.py ✅Succeeded
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded

This comment lists only the first 25 files in the pull request.

SkiaSharpAPI/SkiaSharp.Views.Desktop/SKGLControl.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'OpenTK.GLControl'.

SkiaSharpAPI/SkiaSharp.Views.Gtk/GTKExtensions.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Rectangle'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Rectangle'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Color'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Color'.

This comment lists only the first 25 errors (including error/warning/suggestion) in the pull request.
For more details, please refer to the build report.

Note: Your PR may contain errors or warnings or suggestions unrelated to the files you changed. This happens when external dependencies like GitHub alias, Microsoft alias, cross repo links are updated. Please use these instructions to resolve them.

@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.

Filled "To be added." placeholders for 8 new members across SKColorFilter,
SKImageFilter, SKPaint, and SKSurface. Fixed 23 deterministic lint findings:
17 accessor-verb mismatches, 4 repeated-word defects, 1 spelling, and 1
invalid <see cref> missing the T: prefix.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
@learn-build-service-prod

Copy link
Copy Markdown
Contributor

Learn Build status updates of commit b64a026:

⚠️ Validation status: warnings

File Status Preview URL Details
SkiaSharpAPI/SkiaSharp.Views.Desktop/SKGLControl.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Gtk/GTKExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Gtk/SKDrawingArea.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/CustomRenderingView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen.NUI/SKGLSurfaceView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/CustomRenderingView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/SKCanvasView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/SKGLSurfaceView.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Tizen/TizenExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/AngleSwapChainPanel.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/SKSwapChainPanel.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/SKXamlCanvas.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.Windows/WindowsExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp.Views.WPF/SKGLElement.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRSharpVkBackendContext.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRSharpVkGetProcedureAddressDelegate.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRVkExtensionsSharpVkExtensions.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRVorticeD3DBackendContext.xml ⚠️Warning Details
SkiaSharpAPI/SkiaSharp/GRVorticeD3DTextureResourceInfo.xml ⚠️Warning Details
.gitattributes ✅Succeeded
.github/aw/actions-lock.json ✅Succeeded
.github/known-warnings.csv ✅Succeeded
.github/scripts/check-learn-build.py ✅Succeeded
.github/workflows/auto-api-docs-writer.lock.yml ✅Succeeded

This comment lists only the first 25 files in the pull request.

SkiaSharpAPI/SkiaSharp.Views.Desktop/SKGLControl.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'OpenTK.GLControl'.

SkiaSharpAPI/SkiaSharp.Views.Gtk/GTKExtensions.xml

  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Pixbuf'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.RGBA'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.RGBA'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Gdk.Size'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point'.
  • Line 0, Column 0: [Warning: xref-not-found - See documentation] Cross reference not found: 'Graphene.Point'.

This comment lists only the first 25 errors (including error/warning/suggestion) in the pull request.
For more details, please refer to the build report.

Note: Your PR may contain errors or warnings or suggestions unrelated to the files you changed. This happens when external dependencies like GitHub alias, Microsoft alias, cross repo links are updated. Please use these instructions to resolve them.

@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.

@mattleibow mattleibow merged commit ab5003a into live Jun 30, 2026
3 checks passed
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