Skip to content

chore(gitsync): drop the transitional Octokit reference, overload and pin - #7265

Merged
rbuergi merged 1 commit into
mainfrom
chore/drop-octokit
Oct 26, 2026
Merged

rbuergi merged 1 commit into
mainfrom
chore/drop-octokit

Conversation

@rbuergi

@rbuergi rbuergi commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

The platform no longer references Octokit.

This removes the transitional parts that kept Octokit.dll in the image for one cycle after the GitHub REST client was ported to a plain HttpClient:

  • the <PackageReference Include="Octokit" /> in MeshWeaver.GitSync;
  • the Octokit PackageVersion;
  • the internal overload OctokitGitHubRepoClient.IsMissingOrEmptyRepo(Octokit.ApiException).

Both removal conditions from Doc/Architecture/GitHubSync hold:

  1. MeshWeaver.Plugins#4206 merged at 2026-10-25 14:35Z. On Plugins main, every Octokit hit is a comment or core's OctokitGitHubRepoClient class name, which stays.
  2. Instances run the Observability builds published after it.
    • On the control instance, the only package-update holds for Observability were on pearl (1.8.95 held below 1.8.104) and build (1.8.99 held below 1.8.100).
    • Both were resolved when those instances rolled past the floor (Hosting/Triage/package-update-held/pearl-observability and .../build-observability).
    • An image without Octokit reaches an instance only through a platform roll, and that same roll lifts any floor hold.

Satellites. I searched every .cs, .csproj, .props and .json file in shallow clones of the default branches of Education, Reinsurance, SocialMedia, Manufacturing, Crm, FundReporting, Memex and MeshWeaver.Deploy. The only hit is Memex's own PackageVersion Include="Octokit", which nothing there references.

Verified locally, Release with -warnaserror:

  • MeshWeaver.GitSync, MeshWeaver.PluginCatalog, MeshWeaver.ComboAssembler, MeshWeaver.ComboVerifier and MeshWeaver.Hosting.Test build with 0 warnings and 0 errors.
  • GitHubRestTransportTest: 53 of 53 pass.

Doc. GitHubSync: "Removing the transitional Octokit reference" is now "The transitional Octokit reference, removed", with the evidence above.

Pairs-with: Systemorph/MeshWeaver.Plugins#4206 — merged; it ported Plugins off the Octokit types and off the removed internal overload.

Satellite-pins: Octokit — searched every satellite's default branch as above. No versionless consumer: Plugins references no Octokit package, and Memex pins its own unused version.

🤖 Generated with Claude Code

… pin

No core code has used Octokit since the GitHub REST client became a plain HttpClient. The bare
PackageReference, the PackageVersion and the internal IsMissingOrEmptyRepo(Octokit.ApiException)
overload stayed for one cycle so the image kept carrying Octokit.dll. Both removal conditions in
Doc/Architecture/GitHubSync now hold:

1. MeshWeaver.Plugins#4206 merged; nothing in Plugins names an Octokit type.
2. The Observability builds published after it are what instances run: the package-update holds on
   pearl and build were resolved when those instances rolled past the floor, and an image without
   Octokit reaches an instance only through such a roll.

No satellite names an Octokit type (Memex carries only its own unused PackageVersion).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 26, 2026 19:59
@rbuergi
rbuergi enabled auto-merge (squash) October 26, 2026 19:59
@systemorph
systemorph Bot disabled auto-merge October 26, 2026 20:00

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Safe removal of the runtime DLL depends on deployed Observability bundles adopting the replacement, which remains independently unverified.

No open issues 🎉

What changed in this PR

Completes the GitSync migration to the HTTP-based GitHub REST client by removing the temporary Octokit compatibility dependency.

Changes:

  • Removes the Octokit package reference and central version pin.
  • Deletes the transitional internal overload accepting Octokit.ApiException.
  • Updates the architecture documentation with the reported downstream migration and deployment evidence.
File Description
src/​MeshWeaver.GitSync/​OctokitGitHubRepoClient.cs Removes the Octokit exception overload.
src/​MeshWeaver.GitSync/​MeshWeaver.GitSync.csproj Removes the transitional package reference.
src/​MeshWeaver.Documentation/​Data/​Architecture/​GitHubSync.md Documents removal and its prerequisites.
Directory.Packages.props Removes the Octokit version pin.

Review effort: Balanced

@github-actions

Copy link
Copy Markdown
Contributor

Test Results

    25 files  ±0      25 suites  ±0   55m 42s ⏱️ +17s
11 761 tests ±0  11 759 ✅ ±0  2 💤 ±0  0 ❌ ±0 
11 787 runs  ±0  11 785 ✅ ±0  2 💤 ±0  0 ❌ ±0 

Results for commit 8273695. ± Comparison against base commit 09ed616.

This pull request removes 59 and adds 22 tests. Note that renamed tests count towards both.

   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---, expected: True)
   --- End of inner exception stack trace ---, kind: "Timeout", layer: null)
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
 ---> (Inner Exception #1) MeshWeaver.Messaging.HubDisposingException: Hub node/a is shutting down — cannot create "x". The address may reactivate (recycle / restart); retry to get the authoritative answer.
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
 ---> (Inner Exception #1) System.InvalidOperationException: boom<---
 ---> (Inner Exception #1) System.InvalidOperationException: source B is misconfigured<---
…
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's FIRST member", fault: System.AggregateException: One or more errors occurred. (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's SECOND member", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall nested in an aggregate inside a wrapper", fault: System.InvalidOperationException: outer
 ---> System.AggregateException: One or more errors occurred. (Value does not fall within the expected range.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.ArgumentException: Value does not fall within the expected range.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---

   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall wrapped as InnerException", fault: System.InvalidOperationException: outer
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "an aggregate of unrelated faults", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Value does not fall within the expected range.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
, expected: False)
MeshWeaver.Messaging.Hub.Test.FaultClassifierTest ‑ Classifies(shape: "a bare disposed object with no context — not prova"···, exception: System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'MemoryStream'., kind: "Fault", layer: null)
MeshWeaver.Messaging.Hub.Test.FaultClassifierTest ‑ Classifies(shape: "a cancellation whose timeout cause sits at aggrega"···, exception: System.OperationCanceledException: t
 ---> System.AggregateException: One or more errors occurred. (x) (The operation has timed out.)
 ---> System.InvalidOperationException: x
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.TimeoutException: The operation has timed out.<---

   --- End of inner exception stack trace ---, kind: "Timeout", layer: null)
MeshWeaver.Messaging.Hub.Test.FaultClassifierTest ‑ Classifies(shape: "a driver wrapping a connect timeout", exception: MeshWeaver.Messaging.Hub.Test.FaultClassifierTest+FakeDbException (0x80004005): Failed to connect
 ---> System.TimeoutException: The operation has timed out., kind: "Transient", layer: "Store")
MeshWeaver.Messaging.Hub.Test.FaultClassifierTest ‑ Classifies(shape: "a hub announcing its disposal", exception: MeshWeaver.Messaging.HubDisposingException: Hub node/a is shutting down — cannot create "stream". The address may reactivate (recycle / restart); retry to get the authoritative answer.
Object name: 'node/a'., kind: "HubTeardown", layer: null)
MeshWeaver.Messaging.Hub.Test.FaultClassifierTest ‑ Classifies(shape: "a mixed aggregate keeps the defect", exception: System.AggregateException: One or more errors occurred. (Success) (boom)
 ---> System.Net.Sockets.SocketException (0x80004005): Success
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.InvalidOperationException: boom<---
, kind: "Fault", layer: null)
…

@rbuergi
rbuergi merged commit 93d883d into main Oct 26, 2026
35 checks passed
rbuergi added a commit that referenced this pull request Oct 26, 2026
Resolves Directory.Packages.props: main dropped the transitional Octokit
pin (#7265) and this branch dropped NSubstitute; both lines go.

PackageFamiliesMoveTogetherGuard.TheScannerSeesEveryFamilyItPolices failed
on this branch (shard 7): it required more than 100 pins and at least two
Aspire.* entries, and core now pins 97 and no Aspire package. The Aspire
prefix leaves the core guard (its pins live in Plugins since Plugins#4297)
and the count becomes a floor of 50 that catches a misread regex without
moving each time a pin leaves for the repo that uses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rbuergi added a commit that referenced this pull request Oct 26, 2026
* chore(packages): core pins only what core restores (delete half)

Drops 48 PackageVersion entries that no core project restores at any depth, measured from every
project.assets.json of a full solution restore, plus MeshWeaver.Graph's Humanizer.Core reference,
which nothing in that project calls. MeshWeaver.Plugins now owns those pins as fill-in entries.

Kept on purpose: 12 transitive pins core's own graph carries (Azure.Core, System.ClientModel, …),
and the families core still partly pins (Orleans clustering/persistence, the ModelContextProtocol
trio, Microsoft.Agents.AI, Microsoft.Extensions.AI). Radzen.Blazor and the other shelf pins leave
with the module-library shelf; Octokit leaves on its own two conditions.

Doc: CarvingProjectsOutOfCore, "Package versions follow the projects".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Merge origin/main; the family guard follows core's remaining pins

Resolves Directory.Packages.props: main dropped the transitional Octokit
pin (#7265) and this branch dropped NSubstitute; both lines go.

PackageFamiliesMoveTogetherGuard.TheScannerSeesEveryFamilyItPolices failed
on this branch (shard 7): it required more than 100 pins and at least two
Aspire.* entries, and core now pins 97 and no Aspire package. The Aspire
prefix leaves the core guard (its pins live in Plugins since Plugins#4297)
and the count becomes a floor of 50 that catches a misread regex without
moving each time a pin leaves for the repo that uses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.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.

2 participants