create_offset_alignments

create_offset_alignments is a skill for Claude Code, Codex from nezolder/civil3d-mcp-roslyn. It costs 22 tokens per session (1,962 once invoked), scanned A, original, MIT.

A coding skill for creating one or more alignments offset from an existing parent alignment. An alignment is a mapped horizontal path, such as the centreline of a road.

In plain words
What is it for?
It is for creating road edges, parallel routes, lanes, or other fixed-distance paths from an existing alignment.
Why use it?
It avoids drawing and maintaining each parallel path separately. The offsets can cover the full alignment or a selected station range.

Skill for Claude CodeCodex

Written for no agent in particular: nothing here depends on one.

Good fit It is for creating road edges, parallel routes, lanes, or other fixed-distance paths from an existing alignment.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add nezolder/civil3d-mcp-roslyn --skill create_offset_alignments
Clone the repo
git clone --depth 1 https://github.com/nezolder/civil3d-mcp-roslyn

Made for: Claude Code, Codex.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for create_offset_alignments

README.md
[![agentmods](https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments/github.svg)](https://agentmods.dev/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments)
Your own site
<a href="https://agentmods.dev/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for create_offset_alignments

Your own site · 80×15
<a href="https://agentmods.dev/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 22 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,962 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00022 $0.01962
Opus 5.5 $0.00009 $0.00785
Sonnet 5.5 $0.00004 $0.00392
Haiku 4.5 $0.00002 $0.00196

Measured 19d ago against content hash ce73fbdb2792, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

create_offset_alignments scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 19d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

skills/alignments/create_offset_alignments.skill.md · 193 lines

How it starts

The opening of the file, as written. The whole thing — 193 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Code Template

var parentAlignmentHandle = "PARENT_ALIGNMENT_HANDLE";
var offsets = new (string name, double offset)[] { };
var alignmentStyleName = "";
var fullLength = true;
var startStation = 0.0;
var endStation = 0.0;
var lockToStations = false;

var isName = new Func<string, bool>(value =>
    !string.IsNullOrWhiteSpace(value) && value == value.Trim() && value.Length <= 255
    && !value.Any(char.IsControl));
if (string.IsNullOrWhiteSpace(parentAlignmentHandle)
    || !System.Text.RegularExpressions.Regex.IsMatch(parentAlignmentHandle, "^[0-9A-Fa-f]{1,16}$"))
{
    return new { success = false, error = "parentAlignmentHandle must be a hexadecimal handle." };
}
if (offsets == null || offsets.Length < 1 || offsets.Length > 20)
{
    return new { success = false, error = "offsets must contain 1 to 20 rows." };
}
if (offsets.Any(o => !isName(o.name) || !double.IsFinite(o.offset) || Math.Abs(o.offset) < 1e-6 || Math.Abs(o.offset) > 10000)
    || offsets.Select(o => o.name.ToUpperInvariant()).Distinct().Count() != offsets.Length)
{
    return new { success = false, error = "Each row needs a distinct trimmed name and a nonzero finite offset of at most 10000." };
}
if (alignmentStyleName != "" && !isName(alignmentStyleName))
{
    return new { success = false, error = "alignmentStyleName must be empty or a trimmed style name." };
}

Alignment parent = null;
try
{
    var parentId = Database.GetObjectId(false, new Handle(System.Convert.ToInt64(parentAlignmentHandle, 16)), 0);
    parent = Transaction.GetObject(parentId, OpenMode.ForRead) as Alignment;
}
catch
{
    parent = null;
}
if (parent == null || parent.IsErased)
{
    return new { success = false, error = "parentAlignmentHandle must identify an existing alignment.", parentAlignmentHandle };
}
if (!fullLength
    && (!double.IsFinite(startStation) || !double.IsFinite(endStation)
        || startStation < parent.StartingStation - 1e-6 || endStation > parent.EndingStation + 1e-6
        || endStation - startStation <= 1e-6))
{
    return new {
        success = false,
        error = "startStation and endStation must lie inside the parent's station range with startStation before endStation.",
        parentStartStation = parent.StartingStation,
        parentEndStation = parent.EndingStation
    };
}

var existingNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (ObjectId existingId in CivilDoc.GetAlignmentIds())
{
    if (Transaction.GetObject(existingId, OpenMode.ForRead) is Alignment existing) existingNames.Add(existing.Name);
}
var taken = offsets.Where(o => existingNames.Contains(o.name)).Select(o => o.name).ToList();
if (taken.Count > 0)
{
    return new { success = false, error = "Alignments with these names already exist.", names = taken };
}

ObjectId styleId = parent.StyleId;
if (alignmentStyleName != "")
{
    try
    {
        styleId = CivilDoc.Styles.AlignmentStyles[alignmentStyleName];
    }
    catch
    {
        styleId = ObjectId.Null;
    }
    if (styleId.IsNull)
    {
        return new { success = false, error = "The named alignment style does not exist.", alignmentStyleName };
    }
}

// Any failure throws, so either every offset alignment is created or none.
var created = new List<object>();
foreach (var row in offsets)
{
    var id = fullLength
        ? Alignment.CreateOffsetAlignment(row.name, parent.ObjectId, row.offset, styleId)
        : Alignment.CreateOffsetAlignment(row.name, parent.ObjectId, row.offset, styleId, startStation, endStation);
    if (id.IsNull)
    {
        throw new InvalidOperationException($"Offset alignment '{row.name}' creation returned an invalid object ID.");
    }
    var alignment = (Alignment)Transaction.GetObject(id, OpenMode.ForWrite);
    if (alignment.AlignmentType.ToString() != "Offset")
    {
        throw new InvalidOperationException($"'{row.name}' was not created as an offset alignment.");
    }
    var info = alignment.OffsetAlignmentInfo;
    if (lockToStations)
    {
        info.LockMode = AlignmentLockModeType.Station;
        if (info.LockMode != AlignmentLockModeType.Station)
        {
            throw new InvalidOperationException($"'{row.name}' did not accept the Station lock mode.");
        }
    }
    created.Add(new {
        name = alignment.Name,
        handle = alignment.Handle.ToString(),
        row.offset,
        side = row.offset < 0 ? "left" : "right",
        style = alignment.StyleName,
        layer = alignment.Layer,
        updateMode = info.UpdateMode.ToString(),
        lockMode = info.LockMode.ToString(),
        lockToStartStation = info.LockToStartStation,
        lockToEndStation = info.LockToEndStation,
        startStation = alignment.StartingStation,
        endStation = alignment.EndingStation,
        length = alignment.Length
    });
}

return new {
    success = true,
    parent = new {
        name = parent.Name,
        handle = parent.Handle.ToString(),
        type = parent.AlignmentType.ToString(),
        isReference = parent.IsReferenceObject,
        startStation = parent.StartingStation,
        endStation = parent.EndingStation
    },
    created
};

Read the full file on GitHub · 193 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 19d ago First seen · 193 lines · 22 tokens per session scan A ce73fbdb2792

Subscribe to this mod's changes

create_offset_alignments is a skill published in the GitHub repository nezolder/civil3d-mcp-roslyn (3 stars, last pushed 16d ago), licensed MIT. It adds 22 tokens to every session and 1,962 once invoked, about $0.0001 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-09.

Related

Other skills, from other repositories

local-ai-agents

Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…

microsoft/ai-agents-for-beginners · 200 tokens

systematic-debugging

Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.

obra/superpowers · 21 tokens

next-cache-components-adoption

Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…

vercel/next.js · 95 tokens

chat-pet-sprite-creation

Use when creating or changing VS Code chat pet sprite art, sprite sheets, state animations, eye treatments, Stable/Insiders variants, or pet transitions under src/vs/workbench/contrib/chat/browser/widget/media/chatPet.

microsoft/vscode · 53 tokens

cpu-profile-analysis

Analyze V8/Chrome CPU profiles (.cpuprofile) and DevTools trace files (Trace-.json). Use when: profiling performance, investigating slow functions, comparing code paths, finding bottlenecks, analyzing timeToRequest, understanding call trees from sampling profiler data, analyzing layout/paint/rendering, investigating…

microsoft/vscode · 71 tokens

insight-error-page

Write or audit an insight-kind error page for the Next.js dev overlay. Use when creating a new errors/ .mdx page, auditing an existing one, or checking that a page matches the framework fix cards. Covers page structure, title alignment, FixCard cards with Copy prompt button, code snippets, terminology verification…

vercel/next.js · 83 tokens