Agent skill

Corvus Ctj Handler Implementation

by corvus-dotnet in corvus-dotnet/Corvus.JsonSchema

Implement OpenAPI server handlers using Corvus.Text.Json generated types.

Apache-2.0Auto-check passedDevelopment

Install Corvus Ctj Handler Implementation

skills CLI
$ npx skills add corvus-dotnet/Corvus.JsonSchema --skill corvus-ctj-handler-implementation -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install corvus-dotnet/Corvus.JsonSchema corvus-ctj-handler-implementation --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/corvus-dotnet/Corvus.JsonSchema.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/corvus-ctj-handler-implementation .claude/skills/corvus-ctj-handler-implementation && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
corvus-ctj-handler-implementation
GitHub stars
199
Token cost
~4.4k tokens
SKILL.md length
1,407 words
Files
1
Skills in repo
25
Repo updated
First seen
Licence
Apache-2.0

At a glance

Implement OpenAPI server handlers using Corvus.Text.Json generated types.

  • Works in 3 steps: Is the response type congruent with the… → Must the response hide stored fields?… → Build the list/object closure-free.…
  • : implementing handler methods for generated IApiHandler interfaces
  • SKILL.md covers The Golden Rule, Document Lifetime, Store Pattern: Read vs… and Building Response Bodies, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Corvus Ctj Handler Implementation is an agent skill from corvus-dotnet/Corvus.JsonSchema. Implement OpenAPI server handlers using Corvus.Text.Json generated types. Covers the workspace-owned lifetime model, the Read/ReadMutable store pattern, builder pattern for responses, From<T() for zero-copy cross-namespace values, TryX out-parameter pattern for lookups, EnumerateArray() iteration, and the two-hop cast requirement for Mutable→Source. USE FOR: implementing handler methods for generated IApiHandler interfaces, reading/writing blob stores with correct document lifetime, building response bodies…

Its SKILL.md is about 4.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Performance optimization, Project scaffolding and OpenAPI specifications. It works with OpenAPI. The repository describes itself as: Support for Json Schema validation and entity generation. The licence is Apache-2.0.

When your agent uses it

  • : implementing handler methods for generated IApiHandler interfaces
  • Reading/writing blob stores with correct document lifetime
  • Building response bodies
  • Avoiding memory leaks and use-after-free

Example prompts

  • “/corvus-ctj-handler-implementation”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Is the response type congruent with the stored type? (Same fields, same required set, nothing the response must hide.) If yes →…
  2. Must the response hide stored fields? (e.g. a summary that drops an internal scopes/expiresAt/usageTags.) Only then field-select — and…
  3. Build the list/object closure-free. Thread the context (Build), don't capture in a lambda — see corvus-builder-context-threading. The list…

What it can do on your machine

Read from SKILL.md and the folder at commit 51cc725. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are csharp and bash).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Corvus Ctj Handler Implementation loads about 4.4k tokens when it runs. Until then it costs about 198 tokens; SKILL.md has 1,407 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~198
When it runs · the whole SKILL.md, loaded when a task matches
~4.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from corvus-dotnet/Corvus.JsonSchema at commit 51cc725, republished under its Apache-2.0 licence (© corvus-dotnet). 1,407 words, ~4,359 tokens.

Download SKILL.mdSave it as .claude/skills/corvus-ctj-handler-implementation/SKILL.md (or your agent's skills folder).
name
corvus-ctj-handler-implementation
description
Implement OpenAPI server handlers using Corvus.Text.Json generated types. Covers the workspace-owned lifetime model, the Read/ReadMutable store pattern, builder pattern for responses, From<T>() for zero-copy cross-namespace values, TryX out-parameter pattern for lookups, EnumerateArray() iteration, and the two-hop cast requirement for Mutable→Source. USE FOR: implementing handler methods for generated IApi*Handler interfaces, reading/writing blob stores with correct document lifetime, building response bodies, avoiding memory leaks and use-after-free. DO NOT USE FOR: code generation itself (use corvus-codegen), mutable document manipulation details (use corvus-mutable-documents), parsing standalone documents (use corvus-parsed-documents-and-memory).

CTJ Handler Implementation

The Golden Rule

Any data that reaches a response body must be owned by the workspace.

The result factory (e.g., ListTodosResult.Ok(body, workspace)) calls CreateBuilder(workspace, body) which wraps the Source's backing memory — it does NOT deep-copy. If the backing memory is freed before serialization, the response is corrupted.

Document Lifetime

Workspace-Owned (correct for handlers)
csharp
var (builder, etag) = await store.ReadMutableAsync(sasToken, workspace, ct);
TodoList.Mutable list = builder.RootElement;
// builder is owned by workspace — lives until request ends
return ListTodosResult.Ok(body: (TodoList)list, workspace: workspace);
Caller-Owned (only for inspect-and-discard)
csharp
using var doc = await store.ReadAsync(sasToken, ct);
bool exists = doc is not null;
// Safe: nothing from doc reaches the response
return exists ? OkResult(...) : NotFoundResult(...);
NEVER use ParseValue

ParseValue() is being marked [Obsolete]. It creates a self-owned copy with no deterministic disposal. Always use ParsedJsonDocument<T>.Parse*() or JsonDocumentBuilder<T>.Parse(workspace, ...).

Store Pattern: Read vs ReadMutable

Provide two overloads on your store type:

csharp
public sealed class MyStore
{
    /// Read-only — caller owns and must dispose. For inspect-and-discard only.
    public async Task<ParsedJsonDocument<T>?> ReadAsync(
        JsonString sasToken, CancellationToken ct) { ... }

    /// Mutable — workspace owns lifetime. For any path where data reaches response.
    public async Task<(JsonDocumentBuilder<T.Mutable> Builder, ETag ETag)?> ReadMutableAsync(
        JsonString sasToken, JsonWorkspace workspace, CancellationToken ct) { ... }
}

When to use which:

ScenarioMethod
Data reaches response body (list, get, create, update)ReadMutableAsync
Pure existence check, no data in responseReadAsync with using
Mutation needed (add/remove/update items)ReadMutableAsync

Building Response Bodies

From literals/new data (Build pattern)
csharp
return CreateTodoResult.Created(
    body: TodoItem.Build((ref TodoItem.Builder b) =>
    {
        b.Create(id: Guid.NewGuid(), title: body.Title, status: "pending"u8);
    }),
    workspace: workspace);
From existing workspace-owned data (pass-through)
csharp
var (builder, _) = await store.ReadMutableAsync(sasToken, workspace, ct);
// Cast needed: Mutable → T (one hop), then T → Source (implicit)
return ListTodosResult.Ok(body: (TodoList)builder.RootElement, workspace: workspace);
The Two-Hop Cast

C# does not chain implicit conversions. Mutable → T is implicit, T → Source is implicit, but Mutable → Source requires an explicit cast to bridge the first hop:

csharp
// ❌ Won't compile — no direct Mutable → Source conversion
return OkResult(body: mutableItem, workspace);

// ✅ Cast to immutable type; implicit conversion to Source handles the rest
return OkResult(body: (TodoItem)mutableItem, workspace);

Note: The CTJ002 analyzer may incorrectly flag this cast as unnecessary (see issue #775). Suppress or ignore — the cast is required.

Emitting store-produced data the body holds past the handler (the deferred-body rule)

A response body's Source is not consumed when the handler returns — it is re-read later, during response validation/serialization (ValidateBody). So anything the body references must stay valid until then, not just until the handler exits:

  • A pooled document the body projects must be handed to the workspace — single value workspace.TakeOwnership(doc); a page/list PooledDocumentList<T>.TransferOwnershipTo(workspace) — so it outlives the handler. using-disposing it at handler return is a use-after-free (ObjectDisposedException at serialization). Inspect-and-discard checks that never reach the body are the only safe using.
  • A pooled/transient scalar written via a builder (e.g. an opaque continuation token emitted (JsonString.Source)tokenUtf8.Span): a builder lambda cannot capture a Span, and a stackalloc/just-disposed buffer would dangle. Carry it as a capturable ReadOnlyMemory<byte> owned by a disposable carrier (the page) that the handler using-scopes: the synchronous Ok(...)/Build(...) copies the bytes into the response document while the carrier is alive; the carrier's Dispose returns the pooled buffer afterwards. Centralise the rent+encode in a page Create(...) factory so every backend call site stays a leak-free one-liner.

A primitive value written via b.Create(prop: value) is copied into the response document during the build — safe for a transient only if the build is synchronous and the value is alive throughout it, which the disposable-carrier pattern guarantees.

Scalar-copied vs From-wrapped (the precise rule). ResultType.Ok(body, workspace) runs the body Source closure synchronously inside CreateBuilder(workspace, body).RootElement, so a using-scoped carrier is still alive when the closure runs. Within that closure two things behave differently at serialization time:

  • A scalar written via b.Create(token: (JsonString.Source)page.NextPageToken.Span) is copied into the response document during CreateBuilder → the carrier's pooled buffer can be disposed right after Ok returns (read .Span inside the closure, never as a captured Span local). This is why the page can be using-scoped.
  • A From(externalDoc)-wrapped sub-document (e.g. CatalogVersionSummary.From(version) over a pooled store doc) is referenced, not copied → it is re-read at post-handler serialization, so its backing must be handed over with PooledDocumentList<T>.TransferOwnershipTo(workspace). A page can do both: TransferOwnershipTo its wrapped documents and using-dispose itself to return the pooled token buffer (the token was already copied).

A carrier that owns a pooled buffer must be a sealed class : IDisposable, never a readonly record struct. A record struct is copy-by-value, so two copies share one rented byte[] and Dispose double-returns it (pool corruption). A record struct may own a PooledDocumentList (a class — idempotent dispose) and get away with it, but the moment it also owns a rented buffer, convert it to a class (mirror SourceCredentialPage/ObservedIdentityPage; WorkflowRunPage/CatalogPage were converted from record structs for exactly this).

Response projection: decision order (run this BEFORE writing a projection)

A response body is built from a stored document. Pick the mechanism in this order — most projections are over-built because the wrong rung was chosen, and that over-building is pure allocation (managed strings, per-item closures, rebuilt arrays):

  1. Is the response type congruent with the stored type? (Same fields, same required set, nothing the response must hide.) If yes → whole-document From(), for the single-document response and the list:
    • Single: return GetXResult.Ok(Models.XView.From(doc.RootElement), workspace) + workspace.TakeOwnership(doc).
    • List: per item array.AddItem(Models.XView.From(item)) + page.TransferOwnershipTo(workspace).
    • The single-document and list responses MUST use the same mechanism. A field-copy list whose single-document sibling is a whole-doc From() is a missed collapse — check the single-doc site first; if it wraps with From(), the list collapses too (per item + ownership transfer). (This was the ToRuleSource/ToViewSource bug: the list field-copied while create/get/update already wrapped.)
  2. Must the response hide stored fields? (e.g. a summary that drops an internal scopes/expiresAt/usageTags.) Only then field-select — and carry each selected leaf bytes-native: Models.JsonString.From(stored.RawAccessor) / Models.JsonDateTime.From(stored.RawAccessor), never (string)stored.X or the nullable XxxValue/XxxOrNull accessors (see below).
  3. Build the list/object closure-free. Thread the context (Build<TContext>), don't capture in a lambda — see corvus-builder-context-threading. The list Build<TContext> is ref-scoped to its in argument, so build it inline in the handler, not in a returned helper.
The XxxOrNull / XxxValue anti-pattern (the realising ternary)

Never feed a generated builder from the nullable convenience accessors:

csharp
// ❌ XxxValue/XxxOrNull DISCARD Undefined-ness → the ternary's `default` writes a REAL value
//    (DateTimeOffset default = the EPOCH; string = null/empty), not an omitted field. Latent bug.
lastUpdatedAt: stored.UpdatedAtValue is { } v ? v : default,
description:   stored.DescriptionOrNull is { } d ? d : default,

// ✅ bare From() of the RAW accessor PROPAGATES Undefined → an absent field is OMITTED, no ternary
lastUpdatedAt: Models.JsonDateTime.From(stored.LastUpdatedAt),
description:   Models.JsonString.From(stored.Description),

The if (x.IsNotUndefined()) { local = From(x); } guard is the same smell — redundant, since From() already propagates Undefined.

Show full SKILL.md (547 more words)Show less
Up-front sweep — grep when you START projection work (find ALL instances at once, not serially)
bash
# nullable-accessor-into-builder smell (then READ each hit to classify — see "not the smell" below)
grep -rnE "OrNull is \{ ?\}|Value is \{ ?\}" src/ --include=*.cs | grep -v /Generated/
# closure-based projection (prefer Build<TContext> context-threading). Matches the builder-lambda
# signature `((ref T.Builder x)` so it catches BOTH `new T.Source((ref …)` and the `=> new((ref …)`
# shorthand (a `new Models\.…Source` pattern misses the shorthand); does not match static BuildX(in ctx, ref …).
grep -rnE "\(\(ref [A-Za-z].*\.Builder " src/ --include=*.cs | grep -v /Generated/

Not the smell (leave alone): nullable accessors used as query-filter predicates, expiry comparisons (ExpiresAtValue is { } e && e <= now), hand-written Utf8JsonWriter envelope projections to a different shape (unix-millis dates, table columns), and string?→Source CLI-settings bridges (a plain string?, no CTJ Undefined concept).

Distrust a "can't use From here" comment

A comment that rules out a whole-doc From() ("the batch is disposed before serialization, so a From() wrap would dangle") may predate the ownership-transfer pattern. Re-derive against the current rule: TransferOwnershipTo(workspace) keeps the batch alive, so the list can wrap. Trusting that one stale comment hid the ToViewSource collapse for an entire campaign — see corvus-builder-context-threading and the memories on verifying before declaring impossible.

Zero-Copy Cross-Namespace Values: From<T>()

Every generated type has a static From<T>() method that reinterprets backing memory as a different type — zero allocation:

csharp
// Cross-namespace: DirectoryStorage.JsonString → Directory.JsonString
Directory.JsonString.From(user.Value.DisplayName)

// Same pattern for UUIDs, emails, etc.
Directory.JsonUuid.From(accepted.Ticket)

Use From<T>() whenever passing values between types from different generated namespaces. Within the same namespace, implicit conversion works directly.

From<T>() propagates undefined: From(source) of an undefined source is an undefined target (it reinterprets the same backing memory, which is still undefined). So do not guard it with an IsNotUndefined() ternary when the consumer already treats undefined as absent:

csharp
// ❌ redundant — From() of an undefined PageToken is already an undefined JsonString
JsonString pageToken = parameters.PageToken.IsNotUndefined() ? JsonString.From(parameters.PageToken) : default;

// ✅ undefined flows straight through; the store's `if (pageToken.IsNotUndefined())` sees it either way
JsonString pageToken = JsonString.From(parameters.PageToken);

Array Enumeration

Generated array types do NOT implement IEnumerable<T>. You must call EnumerateArray():

csharp
// ❌ Won't compile
foreach (TodoItem item in list) { ... }

// ✅ Correct
foreach (TodoItem item in list.EnumerateArray()) { ... }

// Mutable arrays return mutable elements
foreach (TodoItem.Mutable item in list.EnumerateArray()) { ... }

TryX Pattern for Lookups

Use bool Try...(out T result) rather than nullable returns:

csharp
private static bool TryFindItem(TodoList list, JsonString todoId, out TodoItem foundItem)
{
    using var utf8Id = todoId.GetUtf8String();
    foreach (TodoItem item in list.EnumerateArray())
    {
        if (item.Id.ValueEquals(utf8Id.Span))
        {
            foundItem = item;
            return true;
        }
    }

    foundItem = default;
    return false;
}

Conditional/Optional Values

For optional properties that may be undefined:

csharp
// Mutating a builder: guard the Set (you don't want to overwrite with undefined)
if (!item.DueDate.IsUndefined())
{
    mutableItem.SetDueDate(update.DueDate);
}

// Projecting INTO a builder: do NOT ternary-guard From() — it propagates Undefined,
// so an absent field is omitted with no ternary (see "The XxxOrNull/XxxValue anti-pattern").
email: Directory.JsonEmail.From(user.Email)

default for a Source produces an undefined value (omitted from output) — but you rarely need to write default explicitly, because a bare From() of an undefined source already yields it. Reach for a ternary only when the true branch is a non-CTJ type (a C# string?/DateTimeOffset with no source element to wrap — e.g. a CLI settings value); then cast the true branch to the Source type so default stays default(Source).

AddItem on Array Builders

Array builder AddItem() takes T.Source, not T.Mutable. Since C# won't chain two implicit conversions, cast mutable items:

csharp
// ❌ Won't compile — Mutable has no direct → Source conversion
foreach (DirectoryUser.Mutable existing in directory.Users.EnumerateArray())
    ab.AddItem(existing);

// ✅ Cast to immutable (one hop), then implicit to Source (second hop)
foreach (DirectoryUser.Mutable existing in directory.Users.EnumerateArray())
    ab.AddItem((DirectoryUser)existing);

Serialization

Use Corvus.Text.Json.Utf8JsonWriter (NOT System.Text.Json.Utf8JsonWriter):

csharp
using var ms = new MemoryStream();
using (var writer = new Corvus.Text.Json.Utf8JsonWriter(ms))
{
    builder.WriteTo(writer);
}
ms.Position = 0;
await blob.UploadAsync(ms, options, ct);

Common Pitfalls

PitfallConsequenceFix
using ParsedJsonDocument when data reaches responseUse-after-free / corrupted responseUse ReadMutableAsync into workspace
ParseValue() anywhereMemory leak (no disposal)Use ParsedJsonDocument.Parse*() or JsonDocumentBuilder.Parse(workspace, ...)
Missing cast (T)mutable when passing to Source-typed parameterCS1503 compile errorAdd explicit cast to immutable type
Removing cast because CTJ002 says unnecessaryCS1503 compile error (two-hop chain broken)Keep the cast; suppress CTJ002
foreach (T item in array) without .EnumerateArray()CS1579 compile errorUse .EnumerateArray()
From() within same namespaceUnnecessary — implicit conversion worksRemove From(), use value directly
Returning T? from lookup helpersForces boxing/nullable overhead on struct typesUse bool TryX(out T result) pattern
Using System.Text.Json.Utf8JsonWriterWrong writer type; won't serialize CTJ typesUse Corvus.Text.Json.Utf8JsonWriter
XxxOrNull/XxxValue is { } v ? v : default into a builderNullable accessor discards Undefined → default writes the epoch/empty, not an omitted fieldBare Models.JsonX.From(stored.RawAccessor) (propagates Undefined)
Field-copying a list whose single-doc sibling uses whole-doc From()Over-allocation (managed strings + closures) for a congruent typeCollapse the list to per-item From() + TransferOwnershipTo
Capturing-lambda new X.Source((ref b) => …) per list itemA heap closure per item/array/listBuild<TContext> context-threading (inline in the handler)

Cross-References

  • For workspace and builder mechanics, see corvus-mutable-documents
  • For parsing and memory model, see corvus-parsed-documents-and-memory
  • For code generation from OpenAPI specs, see corvus-codegen
  • For analyzer diagnostics (CTJ001–CTJ006), see corvus-analyzers

© corvus-dotnet, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .github/skills/corvus-ctj-handler-implementation of corvus-dotnet/Corvus.JsonSchema.

Open the folder on GitHubat commit 51cc725

Compare with similar skills

Corvus Ctj Handler Implementation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Corvus Ctj Handler Implementation compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Corvus Ctj Handler Implementation this skillcorvus-dotnet/Corvus.JsonSchema199—~4.4kAutomated safety check: PassApache-2.0
ToolJet Marketplace Plugin BuilderToolJet/ToolJet41k—~2.1kAutomated safety check: PassAGPL-3.0
Kopiur Designhome-operations/kopiur113—~2.4kAutomated safety check: PassAGPL-3.0
Release WorkflowGoldziher/spikard123—~909Automated safety check: PassMIT
Cabloy Contract Loopcabloy/cabloy982—~5.1kAutomated safety check: PassMIT
Eng Contract Codegen Coshipcompozy/compozy2.8k—~664Automated safety check: PassMIT

Similar skills

  • Turns an API description, such as an OpenAPI file or a Postman collection, into a connector plugin for ToolJet's marketplace and checks it with the repo's validator.

    41k GitHub stars~2.1k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Kopiur Design

    home-operations/kopiur

    Design norms and locked decisions for the Kopiur Kopia-native Kubernetes backup operator (Rust/kube-rs).

    113 GitHub stars~2.4k tokensUpdated yesterday
    DevOps & CloudAuto-check passed
  • Release Workflow

    Goldziher/spikard

    Release/publish the spikard Rust core crate and CLI end-to-end.

    123 GitHub stars~909 tokensUpdated 4 days ago
    Backend & APIsAuto-check passed
  • A skill your agent uses whenever a Cabloy task crosses the Vona-to-Zova contract boundary: backend DTO, controller, validation, entity, inferred DTO, or OpenAPI changes that should drive SDK…

    982 GitHub stars~5.1k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Contract co-ship for Compozy wire changes. An agent skill from compozy/compozy.

    2.8k GitHub stars~664 tokensUpdated today
    Backend & APIsAuto-check passed
  • Archestra Dev Backend

    archestra-ai/archestra

    A skill your agent uses when adding or changing Archestra backend routes, models, services, API request/response schemas, endpoint permissions, or OpenAPI/codegen for the generated API client.

    4.3k GitHub stars~1.5k tokensUpdated yesterday
    Backend & APIsAuto-check passed

More from corvus-dotnet/Corvus.JsonSchema

All 25 skills in this repo
  • Corvus Analyzers

    corvus-dotnet/Corvus.JsonSchema

    Understand and work with the Roslyn analyzers shipped with Corvus.Text.Json.

    199 GitHub stars~876 tokensUpdated today
    Auto-check passed
  • Corvus Benchmarks

    corvus-dotnet/Corvus.JsonSchema

    Run, interpret, and maintain BenchmarkDotNet benchmarks for JSON Schema validation and query languages.

    199 GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Corvus Bowtie Testing

    corvus-dotnet/Corvus.JsonSchema

    Test Corvus.JsonSchema against the JSON Schema Test Suite using Bowtie, the cross-implementation meta-validator.

    199 GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • Corvus Buffer And Pooling

    corvus-dotnet/Corvus.JsonSchema

    Write allocation-efficient buffer code in Corvus.JsonSchema using the codebase's established three-tier pooling pattern: stackalloc → ArrayPool → ThreadStatic caches.

    199 GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Corvus Bytes To Bytes

    corvus-dotnet/Corvus.JsonSchema

    Eliminate hand-rolled POCO record<-document string seams — types/paths that materialize a managed string (or List<string/Dictionary) between a bytes SOURCE (a parsed UTF-8 body, a DB column, a…

    199 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Corvus Codegen

    corvus-dotnet/Corvus.JsonSchema

    Generate strongly-typed C from JSON Schema using the Roslyn source generator or the corvusjson CLI tool.

    199 GitHub stars~2.1k tokensUpdated today
    Auto-check passed

Works with

Questions about Corvus Ctj Handler Implementation

What does Corvus Ctj Handler Implementation do?

Implement OpenAPI server handlers using Corvus.Text.Json generated types. JsonSchema.Json generated types.

When should I use Corvus Ctj Handler Implementation?

Corvus Ctj Handler Implementation fits situations like: : implementing handler methods for generated IApiHandler interfaces; reading/writing blob stores with correct document lifetime; building response bodies; avoiding memory leaks and use-after-free.

How do I install Corvus Ctj Handler Implementation in Claude Code?

Run `npx skills add corvus-dotnet/Corvus.JsonSchema --skill corvus-ctj-handler-implementation -a claude-code`. Or copy the skill folder (.github/skills/corvus-ctj-handler-implementation in corvus-dotnet/Corvus.JsonSchema) into .claude/skills/corvus-ctj-handler-implementation in your project. Claude Code loads it when a task matches its description.

How do I install Corvus Ctj Handler Implementation in Codex?

Run `npx skills add corvus-dotnet/Corvus.JsonSchema --skill corvus-ctj-handler-implementation -a codex`. Or copy the skill folder (.github/skills/corvus-ctj-handler-implementation in corvus-dotnet/Corvus.JsonSchema) into .agents/skills/corvus-ctj-handler-implementation in your project. Codex loads it when a task matches its description.

Can I use Corvus Ctj Handler Implementation in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add corvus-dotnet/Corvus.JsonSchema --skill corvus-ctj-handler-implementation -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/corvus-ctj-handler-implementation, .gemini/skills/corvus-ctj-handler-implementation, .github/skills/corvus-ctj-handler-implementation and .opencode/skills/corvus-ctj-handler-implementation in your project.

What does Corvus Ctj Handler Implementation need to run?

SKILL.md names no scripts, command-line tools or credentials: Corvus Ctj Handler Implementation is instructions for the agent only.

Does Corvus Ctj Handler Implementation access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Corvus Ctj Handler Implementation safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Corvus Ctj Handler Implementation use?

Corvus Ctj Handler Implementation is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Corvus Ctj Handler Implementation use?

About 4.4k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Corvus Ctj Handler Implementation?

Skills that share tags, products or a category with Corvus Ctj Handler Implementation: ToolJet Marketplace Plugin Builder (ToolJet/ToolJet, 41k stars), Kopiur Design (home-operations/kopiur, 113 stars), Release Workflow (Goldziher/spikard, 123 stars) and Cabloy Contract Loop (cabloy/cabloy, 982 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Corvus Ctj Handler Implementation?

corvus-dotnet (a GitHub organization) maintains it in corvus-dotnet/Corvus.JsonSchema, which has 199 GitHub stars. The repository holds 25 skills in this directory. The repository was last updated on October 7, 2026.

Source: corvus-dotnet/Corvus.JsonSchema on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.