CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

fsharp-csharp-interop

Rules for F# code that C# calls, and C# code that calls F#, in morphir-dotnet. Covers parsed domain types, nullness metadata, TryParse/Create members, Match members for unions, collections, option and null, equality, ToString and AOT safety, and the .fsproj settings. Use when you add or change a public F# type, member or module that a C# project uses; when C# code calls F# types (unions, records, Result, option, list); when you create an F# project that C# references; or when you review a diff that crosses the F#/C# boundary. Triggers include "F# interop", "C# interop", "call F# from C#", "F# union in C#", "MaybeNullWhen", "NotNullWhen", "CompiledName", "F# nullness", "Nullable enable fsproj", "oblivious", "TryParse", "parse don't validate".

Quality

97%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Passed

No findings from the security scan

The canonical home for this skill is fsharp-csharp-interop in finos/morphir-dotnet

SKILL.md
Quality
Evals
Security

Quality

Content

93%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

A lean, highly actionable rulebook for the F#/C# boundary: exact settings, signatures, and attributes, with executable examples correctly split into a one-level-deep reference file. The only gap is the absence of an explicit verification step (build/test run) in the code-writing workflow; the review workflow is fully specified with a checklist and output format.

DimensionReasoningScore

Conciseness

Bullet-form rules with terse, load-bearing rationales for non-obvious facts ("C# cannot use `with` on an F# record", "F# does not write the nullness of a byref element into the metadata") and no tutorial padding or explanation of concepts Claude already knows. The few explanatory sentences (e.g. why `<Nullable>enable</Nullable>` matters, why `%A` is not AOT-safe) carry project-specific information that cannot be assumed, so this fits anchor 5 rather than 4.

5 / 5

Actionability

Gives copy-paste-ready guidance: the exact .fsproj property block, exact member signatures ("static member TryParse(text, out result, out failure) : bool"), exact attributes ("[<Out; MaybeNullWhen(false)>]"), concrete surface types (IReadOnlyList<T>, ImmutableArray<T>), and an exact review command with output format ("Report each finding as `path:line: rule N: problem. fix.`"). Nothing is pseudocode and the common cases are covered, matching anchor 5; bulk executable examples are appropriately delegated to the verified references/patterns.md.

5 / 5

Workflow Clarity

"Before you start" gives a clear 3-step sequence, and the Review checklist plus Review mode (exact `git diff` command, most-severe-first ordering, defined output format) validate the review path; however the write path has no explicit build/test verification step — validation is only implicit ("A unit test calls `Create` for each literal"). This fits anchor 4 (clear sequence, minor validation gaps) rather than 5, which requires an explicit verify-and-fix loop.

4 / 5

Progressive Disclosure

The body states the rules and delegates all code to references/patterns.md, which exists in the bundle, is exactly one level deep, and is well signaled twice ("Read that file before you write new boundary code" and in Related). No bulk content is inlined that belongs in the reference, and the Related section navigates onward to repo docs — matching anchor 5.

5 / 5

Total

19

/

20

Passed

Description

100%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

The description is a model example: it states exactly what the skill governs, exhaustively lists the covered areas, gives four explicit use-when clauses, and closes with a broad set of natural and compiler-derived trigger terms. It is long but every clause is informative, so the length reflects density rather than padding.

DimensionReasoningScore

Specificity

It enumerates concrete coverage — "parsed domain types, nullness metadata, TryParse/Create members, Match members for unions, collections, option and null, equality, ToString and AOT safety, and the .fsproj settings" — with no vague or fluffy language. The coverage list is comprehensive for the skill's declared scope, matching anchor 5 rather than 4 (which would require gaps in coverage).

5 / 5

Completeness

The what is explicit ("Rules for F# code that C# calls, and C# code that calls F#, in morphir-dotnet" with the covered topics) and the when is fully explicit with four concrete "Use when..." clauses plus a "Triggers include..." list. This matches anchor 5 (both what and when with concrete trigger phrases), not 4 where the when is only loosely specified.

5 / 5

Trigger Term Quality

Twelve explicit triggers include natural phrases users would say ("F# interop", "call F# from C#", "F# union in C#"), terms a user would paste from compiler output ("MaybeNullWhen", "oblivious"), and synonyms across both language directions plus file-oriented terms ("Nullable enable fsproj"). Coverage including synonyms is essentially complete, matching anchor 5 rather than 4.

5 / 5

Distinctiveness Conflict Risk

It claims a clear niche (the F#/C# boundary, scoped "in morphir-dotnet") with highly specific triggers ("CompiledName", "F# nullness", "parse don't validate") that no generic or neighboring skill would plausibly match. Minimal conflict risk matches anchor 5 rather than 4.

5 / 5

Total

20

/

20

Passed

Validation

100%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 16 / 16 Passed

Validation for skill structure

No warnings or errors.

Repository

finos/morphir-dotnet

Path

.claude/skills/fsharp-csharp-interop/SKILL.md

Reviewed

Table of Contents

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.