Borrowing it
Nothing to install: this file belongs to Kookerella-Ltd/Kookerella.FsOpenXmlDsl. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/Kookerella-Ltd/Kookerella.FsOpenXmlDsl/master/CLAUDE.mdgit clone --depth 1 https://github.com/Kookerella-Ltd/Kookerella.FsOpenXmlDslWrote 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.
[](https://agentmods.dev/instructions/kookerella-ltd/kookerella.fsopenxmldsl/claude-md)<a href="https://agentmods.dev/instructions/kookerella-ltd/kookerella.fsopenxmldsl/claude-md"><img src="https://agentmods.dev/badge/instructions/kookerella-ltd/kookerella.fsopenxmldsl/claude-md/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.
<a href="https://agentmods.dev/instructions/kookerella-ltd/kookerella.fsopenxmldsl/claude-md"><img src="https://agentmods.dev/badge/instructions/kookerella-ltd/kookerella.fsopenxmldsl/claude-md.svg" alt="Reviewed on agentmods" width="80" height="20"></a>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.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.04432 | $0.04432 |
| Opus 5 | $0.02216 | $0.02216 |
| Sonnet 5 | $0.00886 | $0.00886 |
| Haiku 4.5 | $0.00443 | $0.00443 |
Grade A, and why
Kookerella.FsOpenXmlDsl CLAUDE.md 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 11d 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.
How it starts
The opening of the file, as written. The whole thing — 205 lines — stays where its author put it; the contents beside it link to each section on GitHub.
CLAUDE.md
Instructions for any Claude Code session working in this repo. This file exists because every item on the checklist below has drifted out of sync at least once in this project's history — each was found reactively (a stray user question, or noticing it while checking something unrelated), never automatically. Treat this as the fix for that: a fact-of-life checklist, not aspirational.
Repo layout
Three packages from one repo:
src/Kookerella.FsOpenXmlDsl— the F# core: a typesafe DSL over the OOXML SpreadsheetML schema, interpreted byInterpreter/Writer.fsand reversed byInterpreter/Reader.fs.src/Kookerella.CsOpenXmlDsl— an idiomatic, immutable, fluent C# wrapper over the F# core. As of this writing it has full feature parity with the F# core at the worksheet/workbook level.src/Kookerella.FsOpenXmlDsl.Mcp— a local MCP server exposing both as agent tools, and as a plainfsopenxmldsl-mcp convertCLI command.
Adding a feature to the DSL — checklist
When a new type/DU/field is added to the F# core's model (Worksheet/Workbook or
anything they contain), work through all of these, in order. Skipping one is exactly
how past drift happened — each step below has a real, specific incident behind it.
- F# core (
src/Kookerella.FsOpenXmlDsl): model +Writer.fs+Reader.fs+Interpreter/CodeGen.fs(F# source-gen) +Xml.fs/Xml.xsd(the XML surface - a new field/case needs a schema change too, not just a code change; the "every generatedworkbook.xmlvalidates againstXml.xsd" check insideverifyScenarioNamedis what catches the two drifting apart) +Json.fs/Json.schema.json(the JSON surface - same feature set asXml.fs, same drift risk;verifyScenarioNamedalso writes and validates anExamples/<name>/workbook.jsonfor every scenario, the same way it doesworkbook.xml-Json.schema.jsonis test-suite only, so this check runs fromJsonTests.assertJsonSchemaValid, not a publicJson.schemaSet()-equivalent API - seeJson.fs's own doc comment) + a test intests/Kookerella.FsOpenXmlDsl.Testsfor bothXmlTests.fsandJsonTests.fs, and the F# core's own<Description>inKookerella.FsOpenXmlDsl.fsproj(this package went stale once already -Xml.fsshipped in source for several commits before anyone noticed the published package was still an old version without it, because the Mcp server builds against local source viaProjectReferenceand never surfaced the gap). - C# wrapper (
src/Kookerella.CsOpenXmlDsl), in this order:- Verify the F#/C# compiled interop shape via a
dotnet fsireflection scratch script before writing any conversion code — constructor parameter order,NewCaseNamestatic factories on DU cases, exact property names. Never guess this. - New C# type file(s) mirroring the F# shape (parameterless-only DU → plain enum;
data-carrying DU → closed hierarchy, mirroring
CellValue's pattern). Sheet.cs/Workbook.cs— new property + fluentWith*/Add*methods.WorkbookConverter.cs—ToFsX/FromFsX, both directions.CsCodeGen.cs— before writing tests, not after (a real gap shipped once because this was left until "later").- Tests:
Examples/scenario(s) inExampleTests.csmirroring the F# test suite's exact reference data, unit tests inWorkbookTests.cs, and updateAssertWorkbooksMatchinExampleTests.cs. This one is easy to miss because the test suite still passes without it — it silently stopped checking round-trip fidelity for five-plus features in a row before anyone noticed. - If the new feature is a brand-new F# DU mirrored as a C# enum or closed hierarchy
(not just a new case on an existing one), add it to
DriftGuardTests.cs'sEnumMirrors/ClosedHierarchyMirrorslist — that test only guards types already registered with it, so a new type is invisible to it until added. - The C# wrapper's own
README.md(feature section +## Scope) and the<Description>inKookerella.CsOpenXmlDsl.csproj(the NuGet "sales pitch" text — easy to forget since it's metadata, not code, and it directly shapes whether someone chooses this package at all).
- Verify the F#/C# compiled interop shape via a
- Root docs:
- Root
README.md— it asserts the wrapper's scope in at least one place; don't assume old wording ("narrow first pass", feature lists) is still accurate. llms.txt— the C# wrapper's "v1 scope" list and any "not exposed" list.MAPPING.mdonly if this is a new OOXML-level capability in the F# core itself (not a C# wrapper concern).
- Root
- MCP server (
src/Kookerella.FsOpenXmlDsl.Mcp), if aProjectReferenceor a referenced package's version changed:Dockerfile'sCOPYlist must mirror everyProjectReferencein the.fsprojexactly — it silently broke once whenKookerella.CsOpenXmlDslwas added as a reference and the Dockerfile wasn't touched; nothing catches this except actually runningdocker build.- Any MCP tool's
[<Description>]text that asserts a feature scope (e.g.generate_csharp_script's own doc string inWorkbookTools.fs) — this is what an MCP client/agent sees directly, separately from any README. - The Mcp project's own
README.mdand.mcp/server.json'sdescriptionfield (note: the registry enforces a 100-character limit on that field — it will reject a longer one at publish time, not at edit time).
- Version bump + release — bump
<Version>by hand in whichever project(s) changed (a semver judgment call, not automated), then rundotnet fake run build.fsx -t PublishAll(seebuild.fsx— this runs the full test gate first). UsePublishAll, neverPush<Core|Wrapper|Mcp>individually, and never a manualdotnet pack/dotnet nuget push- two real incidents behind this, not caution for its own sake:build.fsxexists specifically so a release can't skip the test gate, but that only holds if it's actually invoked; one release went out via plaindotnet packanyway, purely out of habit, defeating the point.- The C# wrapper's
ProjectReferenceto the F# core gets converted into a NuGet dependency floor (>= x.y.z) at whatever version the core happened to be at pack time -dotnet pack/NuGet do this correctly and automatically, but only the wrapper's own next pack captures a newer core version. CallingPushCorealone (three times in a row, across the Xml.fs/Json.fs/font-ordering-fix releases) left the published wrapper silently declaring a dependency floor two minor versions behind the core for weeks, invisible locally because a local checkout is always self-consistent by construction - it only showed up when a from-scratch NuGet restore (a demo project, the decompiled.g.cs's own#:packagerestore) pulled the ancient floor version.push(inbuild.fsx) is deliberately a no-op for whichever package(s) didn't change this release rather than erroring on "already published", specifically soPublishAllis always safe and always the right thing to run — every release, not just ones that "feel like" they touched more than one package.PublishAll's own action (not a separate target merely chained after it, which would only run on-t VerifyDependencyFreshness, never on the-t PublishAllpeople actually type) then checks nuget.org's own live state and fails loudly if the wrapper's published floor still doesn't match the core's latest published version - a backstop for exactly the mistake above, in casePublishAllgets bypassed anyway. Also independently invocable any time viadotnet fake run build.fsx -t VerifyDependencyFreshness --single-target. - The Mcp tool has the same problem one layer deeper, discovered live while building an
unrelated demo project: it's a self-contained
dotnet tool(PackAsTool) that bundles its full dependency closure as plain files rather than declaring a NuGet floor, built via its ownProjectReferences the same way - so it goes stale the same way, for the same reason, anddotnet tool updatecan't fix an already-stale published package, only install whatever's currently there.PublishAll's action also downloads the live Mcp.nupkgand reads its bundledKookerella.FsOpenXmlDsl.dll/Kookerella.CsOpenXmlDsl.dllversion metadata directly, comparing against the core's/ wrapper's own latest published versions. NuGet indexing typically takes 5–20 minutes after a successful push before the new version resolves anywhere (search, flatcontainer index,dotnet restore) — don't assume a push failed just because it isn't visible yet; check nuget.org's own package page (it updates before the API indexes do) before retrying.
- MCP Registry sync, only if the Mcp package's version changed:
mcp-publisher login github(interactive GitHub device-flow — this needs the user, it can't be scripted or run non-interactively) immediately followed bymcp-publisher publishfromsrc/Kookerella.FsOpenXmlDsl.Mcp/.mcp/— the registry JWT is short-lived, so log in again right before publishing rather than reusing an older session. The registry publish will itself reject the request with a clear error if the NuGet version it references isn't indexed yet — that's the signal to wait, not a real failure.
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.
- 11d ago First seen · 205 lines · 4,432 tokens per session scan A 91ad033f744a
Kookerella.FsOpenXmlDsl CLAUDE.md is an instructions file published in the GitHub repository Kookerella-Ltd/Kookerella.FsOpenXmlDsl (7 stars, last pushed 7d ago), licensed MIT. It adds 4,432 tokens to every session, about $0.0222 per session on Opus 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-08-31.
Other instructions, from other repositories
next.js AGENTS.md
AGENTS.md instructions for vercel/next.js, covering next.js development guide, codebase structure, monorepo overview, core package: packages/next and other important packages.
codex AGENTS.md
AGENTS.md instructions for openai/codex, covering rust/codex-rs, the codex-core crate, code review rules, crate api surface and model visible context.
vscode buildNext.instructions.md
Working notes and architecture documentation for the new esbuild-based build system in build/next. Use when making changes to the new build pipeline (transpile/bundle commands, NLS plugin, source-map handling, resource copying, or self-hosting watch tasks).
spec-kit AGENTS.md
AGENTS.md instructions for github/spec-kit, covering agents.md, about spec kit and specify, quickstart — add a new integration in 5 steps, integration architecture and integrationmanifest — file tracking.
langchain AGENTS.md
AGENTS.md instructions for langchain-ai/langchain, covering global development guidelines for the langchain monorepo, corridor security analysis, project architecture and context, monorepo structure and development tools & commands.
vscode oss-third-party-notices.instructions.md
Instructions for microsoft/vscode, covering vs code oss third-party-notices pipeline, architecture, pipeline flow in ci, applying the notice (cutover) and fallback chain (never fail the build).